サブストリングマッチングのオートマトン


7

与えられたいくつかのアルファベットを超える文字列として、含まれている任意の文字列を受け入れ、対応する決定性有限オートマトン(DFA)を計算するために最もよく知られたアルゴリズム何である?ss

私は主に最も短い時間の複雑さに関心を持っているので、O表記で最もよく知られている複雑さを教えてください。

回答:


7

Hendrik JanはKnuth-Morris-Prattアルゴリズムについて正しいです(警告、ウィキペディアはそれを特によく説明していません、アルゴリズムに関するテキストがおそらくより良い賭けです)。失敗関数を使用して、文字列マッチングを実行できるDFAを抽出できます。障害テーブルがDFAであることはすぐにはわかりませんが、DFAの移行テーブルを作成する作業はほとんど必要ありません。場合照合するパターン文字列で、テーブルを構築し(したがってDFAを構築)する時間です。WO(|W|)

中心的な考え方は、障害テーブル(ウィキペディアと同じ名前を使用し、既製の例を取得するために使用します)は、現在の一致が機能しない場合に文字列内のどこにいるかを示すことですアウト、つまり、期待する次の文字が表示されない場合、必要な試合の開始がすでに表示されている可能性があるため、誤ってさらに先に進んでいるため、少し「バックトラック」するだけです。 (注、通常のアルゴリズムの意味での実際のバックトラックはありません)。T

だから、恥ずかしげもなくウィキペディアから例を盗んで、失敗テーブルがあるとしましょう:T

i0123456W[i]ABCDABDT[i]1000012

DFAは次のように作成できます。我々は持っているパターン全体にマッチ遷移の骨格と、状態を。テーブルを照合するために、開始状態および最終状態呼び出します(この例では)。バックボーンは遷移なので、この例では、開始状態から状態しますANとからにに。|W|+1q1q|W|q6δ(qi1,W[i])=qiq1q0Aq2q3D

ここでの秘訣は、正しい「後方」遷移を追加して、何か問題が発生したときにバックボーンに沿ってあまり遠くに戻らないようにすることです。これは、私たちが故障関数を使用する場所です。我々は、状態にならと我々が表示されていない、次のシンボルとして、我々することができ、代替的に遷移我々が見る場合。この例から、状態でが表示されていないが、が表示されている、移動できます。他のすべてのシンボルは、開始状態に戻ります。qi1W[i]qT[i]W[T[i]]q5DCq2

繰り返す; 3つのタイプの遷移があります。すべてが順調に進んでいる場合のバックボーン遷移、障害テーブルによって与えられる遷移なので、少し回復できる可能性があります開始状態に戻る他のつの遷移。|Σ|2

もちろん、開始状態と最終状態は少し特殊であり、開始状態はそれ以上戻ることができないため、障害回復の遷移は他の遷移とともに表示され、最終状態に到達すると、他に何が見えても問題ありません。 、それもシンク状態です。

最後のしわが1つあります。この場合、失敗のシンボルが期待されるものと同じである(例:と)場合、違いがなくなるまで判断を延期するか、NFAを作成できます。 。W[1]W[5]

この例では、DFAは次のようになります(間違いがない場合)。

障害テーブルの例によるDFA。

破線の遷移は、「残りすべて」の遷移を表します。

テーブルが与えられれば、DFAを時間で(実際には1回のパスで構築できることが簡単にわかるはずです。テーブルは時間で作成することもできます-ウィキペディアのソースコードで十分です。もちろん、うまくいけば、中間テーブルのステップをスキップして、テーブル作成アルゴリズムを使用して、DFAをすぐに作成できます。この実行時間は、この文字列のみに一致するDFAに少なくともが必要であるため、期待できる最高の時間です遷移(および状態)なので、ステップを取る文字列全体を読み取る必要があります。O(|W|)O(|W|)|W||W|+1WΩ(|W|)


5

回答。私は削除された回答を見てきましたが、私はまだ構造が文字列の長さで線形であると思います(アルファベットのサイズ定数を考えると)。Aho Corasick 1975、doi:10.1145 / 360825.360855

または多分KMP。 Aho&Corasickは、有限の単語セットに対してパターンマッチングオートマトンを検討し、mismatches = failuresの場合にバックポインターを持つツリーを形成します。これは、単一の文字列を考慮するKnuth-Morris-Prattアルゴリズムのスタイルです。KMPが一致/失敗オートマトンから確定的オートマトン(アルファベットのすべての文字の遷移を伴う)に実際に明示的に移動するかどうかはわかりませんでした。したがって、基本的にKMPアプローチは、これを線形時間でDFAに変換できるという賢い議論とともに十分です。A&Cはその最後のステップを明確に述べています。ただし、KMP障害テーブルはA&C構成よりも少し単純で(文字列のツリーは必要ありません)、Web全体で見つけることができます。

メモ。パターンマッチングに興味のある人は、必要があります:元KMP紙、DOI読む/ 0206024 10.1137、または7節の引用から、少なくとも歴史的な発言:「クヌースは、モリスはすでにアルゴリズムを発見していたことを学ぶために悔しされたなし [クックの定理を知っています。 。] "。KMPの論文は1977年にのみ出版されたが、モリスは1969年にすでにテキストエディターでバージョンを実装していたが、クヌースとプラットは、後にクックの証明の適用としてそれらをゆっくりと発見した。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.