【发布时间】:2011-07-05 11:19:09
【问题描述】:
我已经看到很多关于这种数据结构的讨论,但我不清楚什么样的问题需要这种数据结构(通过替代表示)。我从来不需要一个,但也许那是因为我不太了解它。 你能启发我吗?
【问题讨论】:
标签: data-structures binary-tree binary-search
我已经看到很多关于这种数据结构的讨论,但我不清楚什么样的问题需要这种数据结构(通过替代表示)。我从来不需要一个,但也许那是因为我不太了解它。 你能启发我吗?
【问题讨论】:
标签: data-structures binary-tree binary-search
使用二叉搜索树的一个示例是排序值列表,您希望能够在其中快速添加元素。
考虑为此目的使用数组。您可以非常快速地读取随机值,但如果要添加新值,则必须在数组中找到它所属的位置,将所有内容移过来,然后插入新值。
使用二叉搜索树,您只需遍历树,寻找值在树中的位置,然后将其添加到那里。
另外,考虑一下您是否想知道您的排序数组是否包含特定值。您必须从数组的一端开始,并将您要查找的值与每个单独的值进行比较,直到您在数组中找到该值,或者通过它本来应该存在的点。使用二叉搜索树,您可以大大减少可能需要进行的比较次数。只是一个简短的警告,但是,绝对有可能设计二叉搜索树需要更多比较的情况,但这些是例外,而不是规则。
【讨论】:
我过去使用它的一件事是霍夫曼解码(或任何可变位长方案)。
如果您使用叶子中的字符来维护您的二叉树,则每个传入的位都会决定您是移动到左侧节点还是右侧节点。
当你到达一个叶节点时,你已经解码了你的字符,你可以从下一个开始。
例如,考虑以下树:
.
/ \
. C
/ \
A B
这将是一个主要字母为C 的文件的树(由于用于普通字母的位更少,文件比固定位长方案的文件更短)。各个字母的代码是:
A: 00 (left, left).
B: 01 (left, right).
C: 1 (right).
您使用的类问题是那些您希望能够合理有效地插入和访问元素的问题。除了不平衡的树(例如上面的 Huffman 示例),您还可以使用 balanced 树,这会使插入的成本更高一些(因为您可能必须在运行中重新平衡)但使查找成为由于您要遍历尽可能少的节点,因此效率更高。
【讨论】:
来自维基
可以自然地使用自平衡二叉搜索树来构建和维护有序列表,例如优先级队列。它们也可以用于关联数组;键值对仅根据键的顺序插入。在这种能力下,自平衡 BST 与其主要竞争对手哈希表相比具有许多优点和缺点。自平衡 BST 的一个优点是它们允许按密钥顺序快速(实际上是渐近优化)枚举项目,而哈希表不提供这些。一个缺点是,当可能有多个项目具有相同的键时,它们的查找算法会变得更加复杂。
自平衡 BST 可用于实现任何需要可变有序列表的算法,以实现最佳的最坏情况渐近性能。例如,如果使用自平衡 BST 实现二叉树排序,我们就有一个非常易于描述但渐近最优的 O(n log n) 排序算法。类似地,计算几何中的许多算法利用自平衡 BST 的变化来有效地解决诸如线段相交问题和点定位问题之类的问题。 (然而,对于一般情况下的性能,自平衡 BST 的效率可能低于其他解决方案。特别是二叉树排序可能比合并排序或快速排序慢,因为树平衡开销以及缓存访问模式。)
自平衡 BST 是灵活的数据结构,可以轻松扩展它们以有效地记录附加信息或执行新操作。例如,可以记录每个子树中具有特定属性的节点数,从而可以在 O(log n) 时间内计算具有该属性的特定键范围内的节点数。例如,这些扩展可用于优化数据库查询或其他列表处理算法。
【讨论】: