【とらいぎ】

トライ木 とは?

最終更新:
💡 文字列検索を「一文字ずつたどって」高速に

文字列の検索・前方一致に特化した木構造のデータ構造。辞書やオートコンプリートの実装に使われる。

📌 このページのポイント
共通の先頭を共有し、終端を記録する 根 c a t r d cat car card 共有するca 緑の丸=単語の終端 rは終端+子を持つ caの経路があっても、単語として登録済みとは限らない
各丸は根または1文字を表す、終端をノードに記録する方式の例。線は文字を順にたどる親子関係で、緑の丸は単語の終端です。carのrはcardのdという子があるため、終端は葉だけとは限りません。
ひよこ ひよこ
ハッシュマップでも文字列検索はできるよね?
ペンギン先生 ペンギン先生
できるよ。ハッシュマップはキーの完全一致検索によく使う。トライ木は共通の接頭辞を木の経路として共有するので、「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経路の最長一致などにも使われるよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「トライ木」って出てきたら「文字列の前方一致検索を高速にするデータ構造」と思えばだいたいOK!
📖 おまけ:英語の意味
「Trie (from Retrieval)」 = 検索のための木構造
💬 reTRIEval(検索・取り出し)から付いた名前だよ。命名者は「tree」の発音を意図したが、一般的な木と区別して「try」と発音する人もいるんだ

参考資料

← 用語集にもどる