では、部分文字列が O(m) で見つかると上記でどのように述べていますか?
略して。接尾辞ツリーでの検索の実行時間は、単なる O(m) よりも複雑であることは間違いありません。
ただし、スペース要件をトレードオフすると、実際に O(m) まで高速化できます。各ノードでの検索を O(1) まで下げる必要があり、適切なデータ構造 (配列など) を使用してこれを行うことができます。 ) これにより、各文字の適切なサブツリーが一定時間で得られます。
たとえば、実装に C++ を使用していて、文字 ( char
) に 256 の異なる値を含めることができるとします。次に、ノードの実装は次のようになります。
struct node {
char current_character;
node* children[256];
};
現在、現在のノードにつながるcurrent_character
分岐の文字を参照し、子ノードの配列です。検索中、現在ノード にいて、入力テキストの次の文字が であると仮定します。次に、次のノードを次のように選択します。children
u
c
node* next = u->children[c];
if (next == 0) {
// Child node does not exist => nothing found.
}
else {
u = next;
// Continue search with next …
}
もちろん、これは非常に小さなアルファベット (ゲノム配列の DNA など) に対してのみ実行可能です。ほとんどの一般的なケースでは、サフィックス ツリーの最悪の場合の実行時間は実際に O(m) よりも長くなります。