線形時間で最も長い共通部分文字列


回答:


14

しましょう メートル そして 指定された2つの文字列の長さ、

アルファベットのサイズが一定であると仮定した線形時間。

はい、与えられた2つの文字列の最も長い共通部分文字列は、 Oメートル+ 時間、アルファベットのサイズが一定であると仮定します。

これは、最も長い一般的な部分文字列の問題に関するWikipediaの記事からの抜粋です。

文字列のセットの最も長い共通の部分文字列は、文字列の一般化されたサフィックスツリーを作成し、その下のサブツリー内のすべての文字列からリーフノードを持つ最深の内部ノードを見つけることで見つけることができます。

与えられた2つの文字列に対して一般化されたサフィックスツリーを構築するにOメートル+有名な独創的なウッコネンのアルゴリズムを使用して時間。両方の文字列に由来する最も深い内部ノードを見つけるには、Oメートル+時間。したがって、最長の共通部分文字列を見つけることができますOメートル+ 時間。

動作する実装については、GeeksforGeeksのSuffix Tree Application 5 – Longest Common Substringをご覧ください。

(改善!)線形時間

実際、与えられた2つの文字列の最も長い共通部分文字列は、 Oメートル+ アルファベットのサイズに関係なく時間。

これは、Babenko、Maxim、Starikovskaya、Tatianaによる、サフィックス配列による最長の共通部分文字列計算の要約です。(2008)。

一連の N 文字列 ={α1αN} 全長の アルファベット以上 Σ それぞれについて、見つけるように頼むかもしれません 2kN、最長の部分文字列 β 少なくとも現れる K ストリング 。この問題は、O接尾辞の木の助けを借りて時間。ただし、結果のアルゴリズムはかなり複雑です(特に、特定の最も一般的でない祖先クエリへの応答が含まれます)O1時間)。また、その実行時間とメモリ消費は、|Σ|

このホワイトペーパーでは、サフィックスアレイの概念に依存する、上記の問題に対する非常にシンプルな代替アプローチを紹介します。いくつかの補助のサフィックス配列O長さの文字列が計算され、簡単なものが必要です O-要求された最長のサブストリングを見つけるための後処理。サフィックス配列を構築するための効率的でシンプルな線形時間アルゴリズムが最近開発されたので(定数は|Σ|)、私たちのアプローチは非常に実用的であるようです。

上記の論文のアルゴリズムの一般的な考え方は次のとおりです。文字列をしましょうα すべての連結であります αセンチネルを分離します。のサフィックス配列を作成しますαまた、その最長共通接頭辞配列。これらの配列にスライディングウィンドウテクニックを適用して、最も長い共通の部分文字列を取得します。


4

はい。それに関するウィキペディアの記事さえあります! https://en.wikipedia.org/wiki/Longest_common_substring_problem

特に、Wikipediaで説明されているように、サフィックスツリー(またはサフィックス配列)を使用する線形時間アルゴリズムがあります。

「最も長い共通部分文字列」を検索すると、そのWikipediaの記事が最初のヒット(私にとって)になります。今後、こちらに質問する前に問題を調査してください。(たとえば、https://meta.stackoverflow.com/q/261592/781723を参照してください。)

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