Tries
一般にプレフィックス ツリーおよび として知られているものについて読んでいSuffix Trees
ます。
のコードは見つかりましたがTrie
、 の例が見つかりませんSuffix Tree
。Trie
また、a を構築するコードは a のコードと同じであると感じますがSuffix Tree
、前者の場合は接頭辞を格納し、後者の場合は接尾辞を格納するという唯一の違いがあります。
これは本当ですか?頭の中でこれをクリアするのを手伝ってくれる人はいますか? サンプルコードは非常に役立ちます!
6 に答える
サフィックス ツリーは、文字列自体をトライに追加するだけでなく、その文字列のすべての可能なサフィックスも追加する、トライの上に構築されたデータ構造と見なすことができます。例として、サフィックス ツリーで文字列バナナにインデックスを付けたい場合は、次の文字列でトライを作成します。
banana
anana
nana
ana
na
a
それが完了したら、任意の n-gram を検索して、インデックス付き文字列に存在するかどうかを確認できます。つまり、n-gram 検索は、文字列のすべての可能なサフィックスのプレフィックス検索です。
これは、サフィックス ツリーを構築する最も簡単で時間のかかる方法です。このデータ構造には、スペースとビルド時間のいずれかまたは両方を改善する、より洗練されたバリアントが多数あることがわかりました。私はこの分野に精通しておらず、概要を説明することができませんが、接尾辞配列またはこのクラスの高度なデータ構造を調べることから始めることができます(講義 16 および 18)。
この回答は、このデータ構造の変形を説明する素晴らしい仕事もします。
いくつかの単語のサフィックスを入れた Trie を想像すると、文字列の部分文字列を非常に簡単にクエリできるようになります。これがサフィックス ツリーの背後にある主なアイデアであり、基本的には「サフィックス トライ」です。
しかし、この素朴なアプローチを使用すると、サイズ n の文字列に対してこのツリーを構築すると O(n^2) になり、多くのメモリが必要になります。
このツリーのすべてのエントリは同じ文字列のサフィックスであるため、多くの情報を共有しているため、より効率的に作成できる最適化されたアルゴリズムがあります。たとえば、ウッコネンのアルゴリズムを使用すると、O(n) 時間の複雑さでサフィックス ツリーをオンラインで作成できます。
違いは非常に簡単です。サフィックス ツリーには、サフィックス トライよりも「ダミー」ノードが少ない。これらのダミー ノードは、ツリーでのルックアップ操作を増加させる単一の文字です。
特定のテキストのサフィックス ツリーは、特定のテキストのすべてのサフィックスの圧縮されたトライです。
参照: https://www.geeksforgeeks.org/pattern-searching-using-suffix-tree/