Ukkonenのアルゴリズムの漸近的な実行時間、おそらく線形(?)時間でサフィックスツリーを構築するための最も一般的なアルゴリズムの問題に関心があります。
これは、ダンガスフィールドによる本「ストリング、ツリー、シーケンスのアルゴリズム」からの引用です(セクション6.5.1)。
"... Aho-Corasick、Weiner、Ukkonen、およびMcCreightアルゴリズムはすべてスペースを必要とするか、O (m )時間境界を最小のO (m log m )およびOに置き換える必要があります(m log | "。
[ は文字列の長さ、はアルファベットのサイズ]
なぜそうなのか分かりません。
- スペース:まあ、サイズ配列を使用してノードからの分岐を表す場合、実際、Θ (m | Σ |)スペース使用になります。ただし、私の知る限り、ハッシュテーブル(Pythonの辞書など)を使用してブランチを保存することもできます。その後、O (1 )の子ノードにアクセスできる一方で、すべてのハッシュテーブルにΘ (m )ポインターのみを格納します(ツリーにはΘ (m )エッジがあるため)。 時間、配列を使用するときと同じくらい速い。
- 時間:前述のように、ハッシュテーブルを使用すると、時間で任意のノードの発信ブランチにアクセスできます。UkkonenのアルゴリズムはO (m )操作(子ノードへのアクセスを含む)を必要とするため、全体の実行時間もO (m )になります。
結論が間違っている理由と、アルファベットに対するUkkonenのアルゴリズムの依存性についてGusfieldが正しい理由についてのヒントをいただければ、非常に感謝しています。
3
私は、アルファベットサイズに依存しない時間/空間の境界が不可能であるという効果の証拠はないと思います。私は、時間制限を完全に取り除く既知の方法がないため、ガスフィールドが声明を出したと信じています。ハッシュ関数を確立するには、ハッシュ関数をさらに詳しく説明する必要があります。ハッシュルックアップの真の最悪ケースO(1)時間制限には、完全なハッシュが必要です。アルゴリズム中にこれを行う方法は明確ではありません(その時点でハッシュエントリは静的ではないため)。
—
jogojapan
(続き)ツリーが完成したらできますが、アルゴリズム自体の時間制限は変更されません。(ただし、質問の+1。)
—
jogojapan
便利なコンテキスト:Ukkonenのアルゴリズムを説明
—
FrankW