每比特数据排列的二叉树,不是通过比较?

问题描述

假设我们使用二叉树来存储只是一系列位的项目。顶层节点的左节点代表0,右1代表数据的最低有效位:

Bit 1:  0     1
        |     |
Bit 2: 0  1  0 1
       |  |  | |
Bit 3:01 01 01 01
      ^^ ^^ ^^ ^^
Value:04 26 15 37

与普通的基于比较的节点排列相比的优势在于,这种方式永远不需要重新平衡。此外,节点可能占用更少的空间。

这是一个有用的数据结构,还是有更好的版本?有名字吗?

解决方法

正如@Lee 在评论中指出的,这与二进制 trie 数据结构密切相关。您是正确的,此实现不需要发生任何重新平衡。在 BST 中,树的形状(或多或少)与树中存储的内容无关,因此您必须采取预防措施以确保树不会变得不平衡。使用 trie,树的形状直接对存储在 trie 中的内容进行编码,无需重新平衡。

二分尝试相对于平衡二叉搜索树来说有一些缺点。特别是,存储要求可能更高;包含 n 个元素的二叉树需要 O(n log U) 空间,其中 U 是存储在 trie 中的最大值(需要 O(log U) 位将其写出)。当您存储中等数量的大(例如 64 位)数字时,这可能会成为一个问题。您可以使用 Patricia trie(有时称为 radix trie)来优化存储问题,方法是删除只有一个子节点的节点,但这需要更巧妙的实现。

通过对二叉树进行一些非常巧妙的优化,您可以派生出 x-fast triey-fast trie 数据结构。后者使用 O(n) 总存储并支持时间 O(log log U) 的查找。这在理论上可能比 BST 更好,但实际上隐藏在此处的常数因素并不好。