私は常に基数ツリーのスペース使用法に関心を持っていましたが、これに関する有益な議論は見つかりませんでした。
ここで、linux radix-tree.c と同じ基数ツリーの実装があるとしましょう。これは整数を取り、6 ビットごとに使用してツリー内の次の位置にインデックスを付けます。基数ツリーのスペース使用量が二分探索ツリーよりもはるかに多い場合は簡単に思いつきます。私が間違っている場合は修正してください:
ユースケース: (0,1,1,1,1)、(1,1,1,1,1)、(2,1,1,1,1)、... (63,1,1,1) 、1)。
ここでは便宜上、(a,b,c,d,e) を使用して 30 ビット整数キーを表し、各要素は 6 ビット値を表します。a は MSB、e は LSB です。
基数ツリー:
この使用例では、基数ツリーの高さは 5 で、各キーはルートの異なるサブツリーにあるため、4 つの個別のノードを使用します。したがって、((5-1) * 64 + 1) = 257 ノードになります。
各ノードには 2^6 = 64 個のポインターが含まれているため、257 * 64 * 4Byte = 65KB を使用します。
二分探索木
キーの数だけが重要です。この場合、64 個のキーがあります。
各 BST ノードがノードごとに 3 つのポインターを使用すると仮定すると、64 * 3 * 4 バイト = 768 バイトを使用することになります。
比較
基数ツリーは非常にスペース効率が悪いようです。同じ数のノードが与えられた場合、二分探索木よりも ~100 倍の空間を使用します! なぜLinuxカーネルでも使われるのか理解できません。
何か不足していますか?ありがとう。