質問

に応じて wikipedia にイワラビン-Karp文字列照合アルゴリズムで使用される複数の異なるパターン文字列を同時に維持しつつ線形複雑になります。ここでは簡単にすべてのパターンは同じ長さのものだくか、また保存O(n)複雑化する場合のパターンの異なる長さです。できいてくださいくつかの光す。

編集(2011年):

Wikipediaの記事が更新されていな債合わせの複数パターンの異なる長さのO(n)

役に立ちましたか?

解決

くなった場合には、正しい答えるか:

構築中 のハッシュ値を確認できた場合は、セットの文字列ハッシュ.通称、 現在の ハッシュ値です。のハッシュ機能コードが通常として実施され、ループ内にはループを挿入が可能で当社のクイックルック。

もちろん、しなければなり m の最大文字列の長さの文字列です。

更新: からWikipedia

[...]
for i from 1 to n-m+1
         if hs ∈ hsubs
             if s[i..i+m-1] = a substring with hash hs
                 return i
         hs := hash(s[i+1..i+m]) // <---- calculating current hash
[...]

計算しました 現在の ハッシュに m ます。各ステップがあり 仮設 ハッシュ値を見ることができるのでup(O(1)複雑性のセットのハッシュ.すべてのハッシュと同じサイズ、32ビット.

更新2: る償却(平均)O(n)時間で複雑?

遅いという現象が起こるのだろうと m の最大文字列の長さです。ここではまることができる逆行するものとなっている。
ハッシュ移行部分文字列の検索 固定 m サイズを開発して参りましたO(n)時間で複雑になります。

または可変長文字列で設定できま m 最小文字列の長さです。また、セットのハッシュしません准ハッシュの文字列が最初のm-文字のです。
現在模索しながら、テキストを確認している場合、現在のハッシュのハッシュセットおよびその関連する文字列。

この技術を増やすとアラームの誤報が平均ではO(n)時間で複雑になります。

他のヒント

部分文字列のハッシュ値を数学的に関連しているので、

それはです。ハッシュを計算する H(S、J)(文字のハッシュ文字列のj番目の位置から始まる S O(M)を取り長さ M の文字列の上の時間。しかし、あなたは、のH(S、jは1 +)のように表現することができるので、コンピューティング、のH(S、jは1 +)は、一定の時間で行うことができることをしたらのH(S、j)の関数の。

O(M)+ O(1)=> O(M)、すなわち、線形時間

ここどこのリンクですこれは、

(「ラビン - カープが速くなりますか?」などの項を参照)、より詳細に記載されています
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top