我一直关心基数树的空间使用情况,但我没有找到任何有用的讨论。
现在假设我们有一个与 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 * 4Byte = 768 字节。
比较
看起来基数树的空间效率很低。给定相同数量的节点,它使用的空间是二叉搜索树的 100 倍!我不明白为什么即使在linux内核中也使用它。
我错过了什么吗?谢谢。