二进制树按数据位排列,而不是通过比较



假设我们使用一个二进制树来存储只是一系列位的项。顶层节点的左节点表示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-logU(空间,其中U是存储在trie中的最大值(需要O(logU(位才能写出它(。当您存储中等数量的大(比如64位(数字时,这可能会成为一个问题。您可以通过使用Patricia trie(有时称为基数trie(来优化存储问题,方法是删除只有一个子节点的节点,尽管这需要更巧妙的实现。

在二叉树的顶部进行一些非常巧妙的优化,可以派生出x-fast-tree和y-fast-tree数据结构。后者使用O(n(总存储,并支持在时间O(log log U(中查找。理论上,这可能比BST要好得多,尽管在实践中,隐藏在这里的恒定因素并不好。

最新更新