ruby - 计算 ruby​​ 中子字符串列表出现次数的最快方法

标签 ruby algorithm optimization substring

我的问题很简单,我有一个子字符串列表,我必须计算特定字符串中包含多少个子字符串。 这是我的代码:

string = "..."
substrings = ["hello", "foo", "bar", "brol"]
count = 0
substrings.each do |sub|
    count += 1 if string.include?(sub)
end

在这个例子中,我们遍历了整个字符串 4 次,这非常耗时。 您将如何优化此流程?

最佳答案

这使用了 Regexp.union只遍历字符串一次:

string = 'hello there! this is foobar!'
substrings = ["hello", "foo", "bar", "brol"]

string.scan(Regexp.union(substrings)).count
# => 3

虽然这个解决方案在输入较小的情况下明显较慢,但它的复杂度较低 - 对于长度为 n 的字符串和长度为 m 的子字符串,原始解决方案的复杂度为 O(m*n),而这个解决方案的复杂度为O(m+n)


更新
再次阅读问题和我的回答后,我得出的结论是,这不仅是一个过早的优化(正如@Max 指出的那样),而且我的回答在语义上与 OP 不同 .

让我解释一下 - OP 代码计算有多少子字符串在字符串中有至少一次出现,而我的解决方案计算有多少次出现 任何 子串:

op_solution('hello hello there', ["hello", "foo", "bar", "brol"])
# => 1
uri_solution('hello hello there', ["hello", "foo", "bar", "brol"])
# => 2

这也解释了为什么我的解决方案如此缓慢,即使对于长字符串也是如此 - 虽然它只对输入字符串进行一次传递,但它必须传递所有,而原始代码停止在单词的第一次出现。

我的结论是——采用@Arup 的解决方案。它不会比你的快,它只是更简洁,但我想不出更好的了:)

关于ruby - 计算 ruby​​ 中子字符串列表出现次数的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23427299/

相关文章:

mysql - Rails 和 MySQL 上经纬度的最佳列类型

mysql - 在终端中安装 mysql gem 时出错

ruby - 为什么 Pry 对这些返回值的格式不同?

c++ - 如何在树上进行 DFS? (不一定是二进制)

C++:变量不受 Void 函数影响

php - 如果我将详细信息行合并到标题表中的单个列中会更快吗?

c++ - "non-native"指针会损害缓存性能吗?

ruby-on-rails - ActiveRecord #find 错误的对象类

ruby - 如何将自定义元数据写入由 RMagick 创建的图像?

algorithm - 线性时间内的最小轴平行边界框