web-dev-qa-db-ja.com

接尾辞木を構築する時間の複雑さ

接尾辞木を作成するには、最悪の場合、文字列のすべての文字が異なる場合、複雑さは次のようになります。

n + (n-1) + (n-2) ... 1 = n*(n+1)/2

これはO(n ^ 2)です。

ただし、 http://en.wikipedia.org/wiki/Suffix_tree によると、サフィックスツリーの構築にはO(n)時間がかかります。ここで何が欠けていますか?

33
shreyasva

アルゴリズムがΘ(nである必要がある理由の背後にあるあなたの直感2)は良いものですが、ほとんどの接尾辞木は、この時間計算量の必要性を排除するように設計されています。直感的には、Θ(n2)n +(n --1)+ ... + 1の異なるノードが必要になるため、異なるサフィックスをすべて保持するための異なるノード。ただし、接尾辞ツリーは通常、接尾辞の文字ごとに1つのノードが存在しないように設計されています。代わりに、各エッジは通常、元の文字列の部分文字列である文字のシーケンスでラベル付けされます。それでも、Θ(nが必要だと思われるかもしれません2)部分文字列をこれらのエッジにコピーする必要があるため、このツリーを構築する時間ですが、通常、これはかわいいトリックによって回避されます-すべてのエッジは入力の部分文字列である文字列でラベル付けされているため、代わりにエッジを作成できます開始位置と終了位置のラベルが付いています。これは、Θ(n)文字にまたがるエッジをO(1)時間で、O(1) =スペース。

とはいえ、接尾辞木を構築することはまだ本当に難しいです。ウィキペディアで参照されているΘ(n)アルゴリズムは簡単ではありません。線形時間で機能することがわかった最初のアルゴリズムの1つは Ukkonen's Algorithm であり、これは文字列アルゴリズムに関する教科書で一般的に説明されています( 文字列、ツリー、シーケンスのアルゴリズム など。元の論文はウィキペディアにリンクされています。より現代的なアプローチは、最初に 接尾辞配列 を構築し、それを使用して接尾辞ツリーを構築することによって機能します。

お役に立てれば!

37
templatetypedef