多くのキーワードがあり、特に共通のプレフィックスがある場合は、ここでトライがうまく機能する可能性があります。
単語だけでなく、部分文字列が必要だと仮定します。つまり、キーワードが与えられたbah
場合bah
、bahama
. これを防ぐためにこれを変更することは難しくありません。
また、キーワードがなく、キーワードとして部分文字列であると仮定します (つまりbah
、bahama
両方をキーワードにすることはできません)。このためのケータリングもそれほど難しくありません。
文字列内の各文字について、ツリーの一番上から検索を開始し、ツリー内の既存の各ポインターを検索し続けます。ポインターの 1 つが有効な単語に到達したら、それを希望どおりに処理し、おそらくツリー内のすべてのポインターを削除します。
複雑:
O(max(n2, mn))
wherem
はツリー内のノードの数です。最悪の場合、平均的なケースのパフォーマンスははるかに優れているはずです。
例:
では、キーワードがあるとしましょう:
ab
b
caa
次のようなツリーが得られるかもしれません:
o
/|\
a / | \ c
/ |b \
o o o
| b | a
o o
| a
o
(o
は単なるノードです)
ここで、入力文字列についてcaab
、まずc
: (x
ツリー内のポインターを示します)を調べます。
o
/|\
a / | \ c
/ |b \
o o x
| b | a
o o
| a
o
右側の新しいポインターに注意してください。
次にa
:
o
/|\
a / | \ c
/ |b \
x o o
| b | a
o x
| a
o
左側の新しいポインタと右側の高度なポインタに注意してください。
次にa
:
o
/|\
a / | \ c
/ |b \
o o o
| b | a
o o
| a
x
左側のポインターが消え、右側のポインターが進んでいることに注意してください。
有効な単語が見つかったので、右側の単語を削除します。
次にb
:
o
/|\
a / | \ c
/ |b \
o x o
| b | a
o o
| a
o
真ん中の新しいポインターに注意してください。有効な単語が見つかったので、これも削除します。