1

因此,如果我有以下字符串:

orig_string = ' adklsdn asnien单词nsaldkngasldknlskndl '

我像这样迭代它:

orig_string.length.times do |index1|   
    orig_string[index1..orig_string.length].length.times do |index2|   
        puts orig_string[index2..orig_string.length]   
        unless orig_string[index1..index2].length == 0 then puts orig_string[index1..index2] end  
    end  
end

获取字符串的所有可能组合并保留顺序。我试图通过引用约 5,000 个单词的字典从该字符串中提取尽可能多的英语单词。最终我计划迭代许多字符串,所以性能是关键,这就是为什么我要尊重我的同行。

将字典加载到内存中并通过它进行二进制搜索会更快,还是将其加载到 sqlite3 db 并为每个排列运行查询?

此外,是否有更好的方法来获取原始字符串的所有排列并保留顺序?

谢谢!!

4

1 回答 1

0

查找字符串中的所有子字符串

我认为以下将字符串分解为单词的实现更清晰,类似于 ruby​​ 并且速度更快:

orig_string     = 'adklsdntheasnienwordsnsaldkngarelskndlinasldknhere'
orig_string_len = orig_string.length

orig_string_len.downto(1) do |len|
  (orig_string_len - len).downto(0) do |index|
    puts orig_string.slice(index, len)
  end
end

搜索有效词

我猜二进制搜索比 SQL 查询快,因为数据已经在内存中并且只是一个函数调用。

SQL 将解析查询并在返回值之前进行许多其他计算。

还有其他方面需要考虑,比如 sqlite3 是一个 C 实现,也许它比 ruby​​ 对大集合的二进制搜索要快。

如果这个算法会被大量使用,我建议你对这两种方法进行基准测试。

Ruby 为这些东西提供了一个非常简单的库http://rubydoc.info/stdlib/benchmark/Benchmark,它与 Ruby 标准库一起提供。

于 2013-06-08T02:27:21.010 回答