サフィックスツリーを使用して、すべての一般的な部分文字列を検索できますか?


10

文字列シーケンスを比較するためにサフィックスツリーを使用しようとしています。サフィックスツリーを使用した最も長い共通のサブ文字列問題の実装/理論を見つけました。ただし、私が探しているのは、関連する問題-「すべての一般的な部分文字列」の説明です。具体的には、最初に最も長い共通部分文字列を見つけ、次にすでに見つかったlcsインデックスを含まない次の最も長い共通部分文字列を見つける必要があるという問題があります。この問題は、2つのシーケンスに対して一度だけ一般化サフィックスツリー(GST)を構築することで解決できますか?LCSの検索と削除を繰り返すたびにGSTを繰り返し作成することで解決できることはわかっています。しかし、GSTで一度だけ構築される巧妙なトリックが欠けているのではないかと思います。


面白い質問ですね。問題は、があり、がに対するLCSであることがわかった場合、接尾辞ツリー(または接尾辞配列など)から簡単に「削除」できないことです。最初のステップの後でようなものにしたいですよね?β T β S " = α $ γS=αβγβTβS=α$γ
Dmytro Korduban

回答:


3

はい、接尾辞ツリーを使用して、すべての一般的な部分文字列を検索できます。代わりにサフィックス配列を使用するといいでしょうが、すでにサフィックスツリーがある場合、サフィックスツリーからサフィックス配列を構築するには、DFSによる線形時間がかかります。だから私の答えの残りは、サフィックス配列で作業していると仮定します。

テキスト与えられた、のための接尾辞配列範囲の整数の配列であるにの辞書式順序指定列のサフィックス $を S 0 n n + 1 SS=s1,...,snS0nn+1S

接尾辞配列を、最も長い共通の接頭辞であると結合します。葛西らの論文で述べたように、線形時間での配列を構築できます。サフィックス配列とそれらのlcp配列は、lcp配列へのインデックスが与えられたときにと言うように整列しますここで、はインデックス番号であり、は共通の部分文字列と 1つのインスタンスの開始になります。は2番目のインスタンスの開始インデックスになります。もちろん、長さはlcp配列の値です。L C P s l c p [ k ] k s a [ k ] s a [ k 1 ]LCPsLCPslcp[k]ksa[k]sa[k1]


3

私はうまくいくかもしれないという考えを持っています。シーケンスおよび一般化されたサフィックスツリーから始めます。サブツリーにとの両方のサフィックスを持つ各内部ノードは、シーケンスのいくつかの共通のサブストリングに対応しています。そのようなノードを自明ではないとしましょう。対応するノードに重要な子がない場合、共通部分文字列は最大になります。ノードが自明でない場合、自明でないノードの最大の文字列の深さをとしてサブツリーにます。場合ルートである場合、の最長共通部分の長さであり、および。T S T v l c s v r l c s r S TSTSTvlcs(v)rlcs(r)ST

シーケンスの1つから部分文字列を削除した後でツリーを更新することは、それほど難しくありません。まず、削除されたサフィックスに対応する葉を削除し、必要に応じて祖先を更新します。次に、削除された部分文字列の前のサフィックスの処理を開始します。してみましょう、現在の葉の最低非自明な祖先こと。サフィックスの長さが(削除からステップ)および場合、必要に応じて祖先を更新して、サフィックスをツリー内の適切な位置に移動する必要があります。場合、私たちが自明なルーツを持つサブツリーに興味がないように、我々は、行われています。K K K < L C S V K LのC S V vkkk<lcs(v)klcs(v)

全体的なアルゴリズムは、LCSの長さが十分に大きい限り、との最も長い共通部分文字列を繰り返し見つけ、両方のシーケンスからその出現の1つを削除します。TST

いくつかの技術がありますが、一般的なアイデアはうまくいくはずです。


0

連結テキストS $ Tから始めます。$は*またはTのどこにも出現しません。このテキストから接尾辞ツリー/配列を構築します。このサフィックスデータ構造をトラバースして、すべての最大の繰り返しを収集するのは簡単です。左のコンテキストを調べて、左以外の最大反復を除外します。この左方向のフィルタリングは、AbouelhodaらのようにBurrows-Wheelerテーブルを使用して実装できますが、これが必要であるとは思いません。SのみまたはTのみで発生する繰り返しこの時点でolsoを削除する必要があります。除去されなかった繰り返しは、優先度キューに入れられ、優先度は長さによって定義されます。トラバーサルの後、記録された繰り返しが優先順位から削除されると、最終的なフィルタリング(サブストリングの包含のため)を実行できます。ただし、最大限のフレーズを使用しているので、このフィルタリングはほとんど必要ないのではないかと思います。

このアルゴリズムは私自身の発明です。私はそれをそれほど賢いとは分類しませんが、うまくいくはずです。


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