4

「abcabx」というテキストがあるとします。繰り返しパターン「ab」があること、それが現れるすべての場所、およびそれらの繰り返しのコンテキストが他の出現とどのように関連しているかを知りたいです。また、データ構造には、一意のパターン「c」と「x」を区別して分離する必要があります。そうしようとしてサフィックスツリーをセットアップしましたが、次のようになります( this SO answer から):

abcabx

これは確かに、パターン「ab」が 2 回表示されていることを示しています。ただし、ルートの「ab」は、パターンの最初の出現のみを指します。また、そのリーフ「cabx」に別の「ab」が埋め込まれています。その「ab」(「cabx」内) を何らかの形でデータ構造の繰り返しとして認識させたい場合です。ルート「ab」の「x」リーフがそれを表していることは知っていますが、「ab」の「cabx」リーフに「ab」があることを知る必要があります。さらに、「c」と「x」という 2 つのユニークなパターンがそのエッジの一部です。さらに、そのエッジ内の位置、およびそれらの「主な定義」(ルート エッジ?) 間の相互参照。

もっと簡単に言えば、データ構造は、「ここにすべての固有のパターンがある」、「ここにすべての繰り返しパターンとそれらが発生するすべての場所がある」、「これらすべてに関連するコンテキストがある」ことを明確に示す必要があります。 .

だから私はグラフのような要素を接尾辞ツリーに探していると思います。これは、既知のパターンを分割し、それらを明示的に関連付けるものです。その過程で、ユニークなパターンが注目されます。しかし、「c」(「cabx」ではなく「c」)と「x」の両方が「ab」の後に来る、「abx」が「abc」の後に来るなど、接尾辞ツリーのコンテキスト機能が必要です。それらの後に来ました(より大きな場合)など。これを行うサフィックスツリーの適応、またはおそらく別のアルゴリズムはありますか?

4

1 に答える 1

1

サフィックス ツリーは基本的に、部分文字列の検索を容易にする方法で文字列のすべてのサフィックスを格納するだけです。複数回繰り返される各部分文字列は、厳密に 1 つの非終端ノードに対応します。パターンが出現するコンテキストを見つけるのは比較的簡単です。各ブランチのシンボルの数を数えると、シーケンスの最後から部分文字列 end までのオフセットがわかります。たとえば、 から 2 つのブランチがありますab。長さ 1 の 1 つと長さ 4 の 1 つなので、パターンは文字列の末尾から 3 シンボルと 6 シンボル、または先頭から 3 シンボルと 0 シンボルに現れることがわかります。

于 2012-09-07T14:02:42.440 に答える