萌えハッカーニュースリーダー

2025/08/06 21:18 P-fast trie, but smaller

出典: https://dotat.at/@/2025-08-06-p-fast-trie.html
hakase
博士

ロボ子、今日はp-fast trieっていうデータ構造について話すのじゃ。

roboko
ロボ子

p-fast trie、ですか。初めて聞きます。どのようなデータ構造なのでしょう?

hakase
博士

これは、辞書順にソートされた名前の集合を格納するのに使うデータ構造で、特に名前のプレフィックスを効率的に扱えるのが特徴なのじゃ。

roboko
ロボ子

プレフィックス、ですか。具体的にはどのように格納するのですか?

hakase
博士

すべての名前の一意なプレフィックスをハッシュテーブルに追加するのじゃ。このハッシュテーブルのエントリには、最も近い名前への共有参照、プレフィックスの長さ、そして可能な文字ごとのビットマップが含まれているぞ。

roboko
ロボ子

ビットマップ、ですか。それは次の文字を効率的に検索するために使うのですね。

hakase
博士

その通り!検索アルゴリズムは最長プレフィックスマッチを使うのじゃ。クエリ文字列をハッシュテーブルで検索して、一致しない場合は、クエリ文字列の長さを二分探索するぞ。

roboko
ロボ子

二分探索を使うことで、効率的にプレフィックスを見つけられるのですね。

hakase
博士

もしプレフィックスがハッシュテーブルにない場合は、プレフィックス長を短縮して再検索するのじゃ。プレフィックスがある場合は、ビットマップでクエリ文字列の次の文字をチェックして、ビットが設定されていれば、プレフィックス長を長くして再検索するぞ。

roboko
ロボ子

なるほど。では、predecessor検索(先行要素検索)はどうなるのでしょう?

hakase
博士

predecessor検索は、最長プレフィックスマッチがトライ木の誤ったブランチに着地する可能性があるから、ちょっと複雑なのじゃ。二分探索中にプレフィックスが見つかった場合、クエリ文字列を完全な名前と比較する必要があるぞ。

roboko
ロボ子

完全な名前との比較、ですか。それはなぜでしょう?

hakase
博士

名前がクエリ文字列より大きい場合は、プレフィックス長を短縮して再検索する必要があるからじゃ。ビットマップで、クエリ文字列の次の文字より小さい最大の文字に対応するビットを検索して、次の文字のビットが設定されていれば、より長いプレフィックスで検索を続けるのじゃ。

roboko
ロボ子

二分探索が終了したら、predecessorサブトライ木をたどって最大のリーフを見つける必要があるのですね。

hakase
博士

その通り!p-fast trieはDNS名の場合、最大9回のハッシュテーブルプローブで済む可能性があるのじゃ。ただし、predecessor検索は、p-fast trieをたどるために30回のプローブが必要になることもあるぞ。

roboko
ロボ子

なるほど。DNS-trieの平均深度が7〜15であることを考えると、p-fast trieは効率的な場合もあるのですね。

hakase
博士

そうじゃな。ところでロボ子、p-fast trieを使って、世界中の面白い名前を集めるデータベースを作ってみるのはどうじゃ?

roboko
ロボ子

面白い名前、ですか?例えばどんな名前でしょう?

hakase
博士

例えば…『田中』と書いて『ターナー』と読む人がいるらしいぞ!

roboko
ロボ子

それは、p-fast trieとは関係ないような…

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search