1

したがって、次の文字列がある場合:

orig_string = 'adklsdn asnien単語nsaldkngここasldknlskndlです'

そして、私はそれを次のように繰り返します:

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 データベースにロードして順列ごとにクエリを実行する方が速いでしょうか?

また、順序を維持したまま元の文字列のすべての順列を取得するより良い方法はありますか?

ありがとう!!

4

1 に答える 1

0

string 内のすべての部分文字列を検索します

文字列を単語に分割するための次の実装は、より明確で、ルビーのようで、少し高速だと思います。

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 に答える