【とらいぎ】

トライ木 とは?

💡 文字列検索を「一文字ずつたどって」高速に
📌 このページのポイント
トライ木(Prefix Tree) root t i t i e o e o ★ "to" a n a ★ "tea" n ★ "ten" n n n n ★ "inn" = 単語の終端 共通接頭辞を共有 → メモリ効率が良い。検索は O(文字数)
トライ木(プレフィックスツリー)のイメージ
ひよこ ひよこ

ハッシュマップで文字列検索すればいいのでは?

ペンギン先生 ペンギン先生

完全一致検索ならハッシュマップでO(1)で十分。でもトライ木が輝くのは「前方一致検索」だよ。「pro」で始まる単語を全部取得したい場合、ハッシュマップは全エントリを走査するO(n)が必要。トライ木なら「pro」のノードまで辿って、そこから下のすべてのノードを返すだけ。オートコンプリートに最適なんだよ

ひよこ ひよこ

具体的にどう動くの?

ペンギン先生 ペンギン先生

例えば「cat」「car」「card」を格納すると、ルートから「c」→「a」→「t」(catの終端)と「r」(carの終端)→「d」(cardの終端)という木になる。「ca」の共通部分を共有して、分岐するところだけ枝分かれする。「car」を検索するなら、c→a→rとたどって終端マークがあれば存在するとわかるんだよ

ひよこ ひよこ

メモリが大きいって本当?

ペンギン先生 ペンギン先生

各ノードが子ノードへのポインタを文字種分(アルファベットなら26個、Unicode全体なら膨大)持つから、密度が低いとスカスカになる。対策として、①圧縮トライ(Patricia Trie)で共通前方部分をまとめる、②Map/HashMapで子ノードを管理、③ダブル配列トライ(日本語形態素解析で使われる高速実装)がある

ひよこ ひよこ

実務での活用例は?

ペンギン先生 ペンギン先生

検索エンジンのオートコンプリート、②スマートフォンの予測変換、③IPアドレスルーティングテーブル(Longest Prefix Match)、④スペルチェッカー。日本語の形態素解析器(MeCab等)はダブル配列トライを使っている。DNSサーバーのドメイン検索もトライ木ベースの実装が多いんだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「トライ木」って出てきたら「文字列の前方一致検索を高速にするデータ構造」と思えればだいたいOK!
📖 おまけ:英語の意味
「Trie (from Retrieval)」 = 検索木
💬 Retrieval(検索)のtrieの部分から。発音は「トライ」だけど由来はRetrievalだよ
← 用語集にもどる