ウッコネンの単純な英語のサフィックスツリーアルゴリズム
この時点で少し分厚い感じがします。私はサフィックスツリーの構築に完全に頭を悩ませるために何日も費やしましたが、私には数学的な背景がないため、数学記号を過度に使用し始めると、多くの説明がわからなくなります。私が見つけた優れた説明に最も近いのは、サフィックスツリーを使用した高速文字列検索ですが、彼はさまざまな点につながっており、アルゴリズムのいくつかの側面は不明のままです。 このStack Overflowでのアルゴリズムのステップバイステップの説明は、私以外の多くの人にとって非常に貴重だと思います。 参考までに、ここにアルゴリズムに関するウッコネンの論文があります。http://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf これまでの私の基本的な理解: 特定の文字列Tの各プレフィックスPを反復処理する必要があります 接頭辞Pの各接尾辞Sを反復処理し、それをツリーに追加する必要があります 接尾辞Sをツリーに追加するには、Sの各文字を反復処理する必要があります。反復は、Sの同じ文字セットCで始まる既存のブランチを歩いて行き、エッジを子孫ノードに分割する可能性があります。サフィックス内の別の文字に到達する、または一致するエッジがない場合は下に移動する。Cに対して下に移動する一致するエッジが見つからない場合、Cに対して新しいリーフエッジが作成されます。 ほとんどの説明で指摘されているように、基本的なアルゴリズムはO(n 2)のように見えます。これは、すべてのプレフィックスをステップスルーする必要があるため、各プレフィックスの各サフィックスをステップスルーする必要があるためです。ウッコネンのアルゴリズムは、彼が使用しているサフィックスポインターテクニックのために、明らかにユニークですが、それは私が理解するのに苦労しているものだと思います。 私も理解できません: 「アクティブポイント」が割り当てられ、使用され、変更される時期と方法 アルゴリズムの正規化の側面で何が起こっているか 私が見た実装が使用している境界変数を「修正」する必要がある理由 完成したC#ソースコードを以下に示します。正しく機能するだけでなく、自動正規化をサポートし、出力の見栄えの良いテキストグラフをレンダリングします。ソースコードとサンプル出力は次の場所にあります。 https://gist.github.com/2373868 2017年11月4日更新 長年の後に、私はサフィックスツリーの新しい使用法を見つけ、JavaScriptにアルゴリズムを実装しました。要旨は以下の通りです。バグがないはずです。npm install chalk同じ場所からそれをjsファイルにダンプし、node.jsで実行してカラフルな出力を表示します。同じGistには、デバッグコードのない、簡略化されたバージョンがあります。 https://gist.github.com/axefrog/c347bf0f5e0723cbd09b1aaed6ec6fc6