これがアルゴリズムについて質問する場所かどうかはわかりません。しかし、答えが得られるかどうか見てみましょう... :)
ご不明な点がございましたら、喜んでご説明させていただきます。
PythonでTrieを実装しました。ただし、(シンプルさを愛する人として)必要以上に複雑なように思えました。おそらく誰かが同様の問題を抱えていましたか?
私の目的は、サブトライの最大共通プレフィックスをルートに格納することで、ノードの数を最小限に抑えることでした。たとえば、stackoverflow、stackbase、stackbasedという単語がある場合、ツリーは次のようになります。
[s]tack
[o]verflow ______/ \_______ [b]ase
\___ [d]
1 つの文字 (子ノードの最初の文字) を持つエッジを考えることができることに注意してください。
Find -query は簡単に実装できます。 挿入は難しくありませんが、私が望むよりもやや複雑です.. :(
私のアイデアは、最初に挿入するキー k ( Find (k)) を検索し、次にノードをローカルで再配置/分割することにより、(空のトライから開始して) キーを次々に挿入することでした。検索手順が停止します。4 つのケースがあることが判明しました: (挿入するキーを k とし、検索が終了したノードのキーを k' とします)
- k は k' と同じです
- k は k' の「適切な」接頭辞です
- k' は k の「適切な」接頭辞です
- k と k' は共通の接頭辞を共有していますが、(1)、(2)、(3) のいずれも発生しません。
それぞれのケースは独特であり、したがってトライの異なる修正を暗示しているようです。しかし、それは本当に複雑ですか?何か不足していますか?より良いアプローチはありますか?
ありがとう :)