コンピュータサイエンスにおいて、ウッコネンアルゴリズムは、 1995 年にEsko Ukkonenによって提案された、接尾辞木を構築するための線形時間オンラインアルゴリズムです。 [ 1 ]このアルゴリズムは、文字列の最初の文字を含む暗黙の接尾辞木から始まります。次に、文字列を順にたどり、木が完成するまで連続する文字を追加します。この文字の順序付けにより、ウッコネンアルゴリズムは「オンライン」特性を持ちます。1973年にPeter Weinerによって発表された元のアルゴリズムは、最短の接尾辞から最長の接尾辞まで、最後の文字から最初の文字まで逆方向に進みました。[ 2 ] 1976 年にEdward M. McCreightによって、最長の接尾辞から最短の接尾辞まで進む、より単純なアルゴリズムが発見されました。 [ 3 ]
ウッコネンアルゴリズムを用いて接尾辞木を生成する際、文字列Sに含まれる文字に応じて、中間段階で暗黙の接尾辞木が生成されます。暗黙の接尾辞木では、$(またはその他の終端文字)ラベルの付いたエッジは存在せず、また、1つのエッジしか出ていない内部ノードも存在しません。
ウッコネンアルゴリズムは、文字列S(長さn)の各接頭辞S[1...i]に対して、暗黙の接尾辞木T iを構築します。まず1番目の文字を使用してT 1を構築し、次に2番目の文字を使用してT 2を構築し、次に3番目の文字を使用してT 3を構築し、...、n番目の文字を使用してT nを構築します。ウッコネンアルゴリズムを使用する接尾辞木には、次の特徴が見られます。
接尾辞拡張とは、これまでに構築された接尾辞ツリーに次の文字を追加することです。フェーズ i+1 の拡張 j では、アルゴリズムは S[j...i] の末尾 (前のフェーズ i により既にツリー内に存在する) を見つけ、S[j...i] を拡張して、接尾辞 S[j...i+1] がツリー内に存在することを確認します。拡張ルールは 3 つあります。
重要な点として、特定のノード(ルートノードまたは内部ノード)からは、1つの文字から始まるエッジが1つだけ存在するという点に注意が必要です。同じ文字から始まるエッジが、どのノードからも複数存在することはありません。
今後接尾辞木を生成するための単純な実装では、ビッグオー記法で O(n²) または O(n³) の時間計算量が必要となります。ここでnは文字列の長さです。ウッコネンは、いくつかのアルゴリズム的手法を活用することで、これを定数サイズのアルファベットの場合はO ( n ) (線形) 時間、一般的にはO ( n log n )に短縮し、以前の 2 つのアルゴリズムの実行時パフォーマンスに匹敵させました。

ウッコネンのアルゴリズムを使用して接尾辞木がどのように構築されるかをよりよく説明するために、文字列を考えてみましょうS = xabxac。
S[1]文字列の最初の文字を追加することで、新しいリーフノードを作成します。ルール2が適用され、新しいリーフノードが作成されます。S[1..2]の接尾辞を追加することで、 を実行します。ルール 1 が適用され、既存のリーフ エッジのパス ラベルが拡張されます。ルール 2 が適用され、新しいリーフ ノードが作成されます。xaxaaS[1..3]の接尾辞を追加することで、を拡張します。ルール 1 が適用され、既存のリーフ エッジのパス ラベルが拡張されます。ルール 2 が適用され、新しいリーフ ノードが作成されます。xabxababbS[1..4]の接尾辞を追加することでを実行します。ルール 1 が適用され、既存のリーフ エッジのパス ラベルが拡張されます。ルール 3 が適用され、何も行いません。xabxxabxabxbxxS[1..5]の接尾辞を追加することでを実行します。ルール 1 が適用され、既存のリーフ エッジのパス ラベルが拡張されます。ルール 3 が適用され、何も行いません。xabxaxabxaabxabxaxaaS[1..6]の接尾辞を追加することでを拡張します。ルール 1 が適用され、既存のリーフ エッジのパス ラベルが拡張されます。ルール 2 が適用され、新しいリーフ ノードが作成されます (この場合、3 つの新しいリーフ エッジと 2 つの新しい内部ノードが作成されます)。xabxacxabxacabxacbxacxacacc