微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

假设我们使用二叉树来存储只是一系列位的项目。顶层节点的左节点代表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 更好,但实际上隐藏在此处的常数因素并不好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。