【とらいぎ】
トライ木 とは?
最終更新:
💡 文字列検索を「一文字ずつたどって」高速に
文字列の検索・前方一致に特化した木構造のデータ構造。辞書やオートコンプリートの実装に使われる。
📌 このページのポイント
ハッシュマップでも文字列検索はできるよね?
できるよ。ハッシュマップはキーの完全一致検索によく使う。トライ木は共通の接頭辞を木の経路として共有するので、「ca」で始まる単語を探すような前方一致にも使いやすいんだ。どの方法がよいかは、必要な検索に合わせて考えよう。
具体的にどう動くの?
たとえば「cat」「car」「card」を格納する。ルートからc→aまでを共有して、tとrへ分岐するよ。rの下にはdもある。「car」ならc→a→rとたどり、その場所に単語の終端が記録されていれば、登録済みとわかるんだ。
単語は葉にだけ記録するの?
終端をノードに記録する方式なら、葉以外にも置けるよ。「car」のrには「card」のdという子があるけれど、rも単語の終端だ。一方、c→aまでたどれても「ca」が登録済みとは限らない。経路があることと、単語として登録されていることを区別するんだ。
前方一致なら候補は一瞬で全部取れるの?
接頭辞の場所を見つけた後、その下をたどって登録された単語を集める必要があるよ。候補の数や文字数が多ければ、その分の時間もかかる。長さMのキーをO(M)で探せるのは、各文字に対応する子を定数時間で選べる実装での話なんだ。
メモリ使用量はどうなの?
子への参照を文字種の数だけ配列で持つ実装では、使わない欄も場所を取るよ。子がある文字だけをMapなどに記録する方法や、枝分かれのない経路をまとめる圧縮トライもある。メモリ量と探索の速さは、文字種、データ、実装の選び方に左右されるんだ。 辞書や入力候補の検索、IP経路の最長一致などにも使われるよ。
📖 おまけ:英語の意味
「Trie (from Retrieval)」 = 検索のための木構造
💬 reTRIEval(検索・取り出し)から付いた名前だよ。命名者は「tree」の発音を意図したが、一般的な木と区別して「try」と発音する人もいるんだ