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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

それは、p-fast trieとは関係ないような…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。