web-dev-qa-db-ja.com

サフィックスツリーと試行。違いはなんですか?

プレフィクスツリーとしてよく知られているTriesSuffix Treesについて読んでいます。
Trieのコードは見つかりましたが、Suffix Treeの例は見つかりません。また、Trieを作成するコードはSuffix Treeのコードと同じであるという感じがしますが、前者の場合はプレフィックスを保存しますが、後者のサフィックスは保存します。
これは本当ですか?誰かが私の頭の中でこれを解決するのを手伝ってもらえますか?サンプルコードは大いに役立ちます!

67
Cratylus

サフィックスツリーは、トライの上に構築されたデータ構造として見ることができます。この場合、ストリング自体をトライに追加する代わりに、そのストリングのすべての可能なサフィックスも追加します。例として、接尾辞ツリーで文字列bananaにインデックスを付ける場合、次の文字列でトライを作成します。

banana
anana
nana
ana
na
a

それが完了したら、任意のn-gramを検索して、インデックス付き文字列に存在するかどうかを確認できます。つまり、n-gram検索は、文字列のすべての可能なサフィックスのプレフィックス検索です。

これは、接尾辞ツリーを構築する最も簡単で最も遅い方法です。このデータ構造には、スペースとビルド時間のいずれかまたは両方を改善する、より洗練されたバリアントが多数あることがわかります。概要を説明するほどこのドメインに精通しているわけではありませんが、 suffix array またはこのクラス 高度なデータ構造 (講義16および18)を調べることから始めることができます。

この answer は、このデータ構造の変形を説明する素晴らしい仕事もします。

52
Ze Blob

Wordの接尾辞を付けるTrieを想像すると、文字列の部分文字列を非常に簡単にクエリできます。これは、接尾辞ツリーの背後にある主要なアイデアであり、基本的には「接尾辞トライ」です。

しかし、この単純なアプローチを使用すると、サイズnの文字列に対してこのツリーを構築するとO(n ^ 2)になり、大量のメモリを消費します。

このツリーのすべてのエントリは同じ文字列の接尾辞であるため、多くの情報を共有しているため、より効率的に作成できる最適化されたアルゴリズムがあります。たとえば、Ukkonenのアルゴリズムを使用すると、O(n)時間の複雑さでサフィックスツリーをオンラインで作成できます。

7
Juan Lopes

違いは非常に簡単です。サフィックスツリーには、サフィックストライよりも少ない「ダミー」ノードがあります。これらのダミーノードは、ツリーでのルックアップ操作を増加させる単一の文字です

0
curious