Data structures 使用二叉搜索树可以解决哪类问题?

Data structures 使用二叉搜索树可以解决哪类问题?,data-structures,binary-tree,binary-search,Data Structures,Binary Tree,Binary Search,我已经看过很多关于这个数据结构的讨论,但是我不清楚什么样的问题需要这样的数据结构(相对于替代表示)。我从来都不需要它,但也许是因为我不太喜欢它。你能启发我吗?来自维基 自平衡二进制搜索树可以自然地用于构造和维护有序列表,例如优先级队列。它们也可用于关联数组;键值对只需插入一个基于键的顺序即可。在这种容量下,自平衡BST相对于其主要竞争对手哈希表有许多优点和缺点。自平衡BST的一个优点是,它们允许按键顺序快速(实际上是渐近最优)枚举项,而哈希表不提供这种枚举。一个缺点是,当可能有多个项具有相同的键

我已经看过很多关于这个数据结构的讨论,但是我不清楚什么样的问题需要这样的数据结构(相对于替代表示)。我从来都不需要它,但也许是因为我不太喜欢它。你能启发我吗?

来自维基

自平衡二进制搜索树可以自然地用于构造和维护有序列表,例如优先级队列。它们也可用于关联数组;键值对只需插入一个基于键的顺序即可。在这种容量下,自平衡BST相对于其主要竞争对手哈希表有许多优点和缺点。自平衡BST的一个优点是,它们允许按键顺序快速(实际上是渐近最优)枚举项,而哈希表不提供这种枚举。一个缺点是,当可能有多个项具有相同的键时,它们的查找算法会变得更加复杂

自平衡BSTs可用于实现任何需要可变有序列表的算法,以获得最佳的最坏情况渐近性能。例如,如果二叉树排序是用自平衡BST实现的,我们有一个非常简单的描述,但渐近最优的O(n logn)排序算法。类似地,计算几何中的许多算法利用自平衡BST的变化来有效地解决诸如线段相交问题和点定位问题等问题。(但是,对于平均案例性能,自平衡BST的效率可能低于其他解决方案。特别是二叉树排序,由于树平衡开销以及缓存访问模式,可能比mergesort或quicksort慢。)


自平衡BST是一种灵活的数据结构,可以方便地对其进行扩展,以高效地记录附加信息或执行新操作。例如,可以记录具有特定属性的每个子树中的节点数,允许在O(logn)时间内使用该属性计算特定键范围中的节点数。例如,这些扩展可用于优化数据库查询或其他列表处理算法。

使用二元搜索树的一个示例是一个排序的值列表,您希望能够在其中快速添加元素

为此,请考虑使用数组。可以非常快速地读取随机值,但如果要添加新值,必须在数组中找到它所属的位置,将所有内容移到另一个位置,然后插入新值

使用二叉搜索树,您只需遍历树,查找值(如果该值已经在树中)的位置,然后将其添加到树中


也可以考虑,如果你想知道你排序的数组是否包含一个特定的值。您必须从数组的一端开始,将要查找的值与每个单独的值进行比较,直到在数组中找到该值,或者经过该值应该存在的点。使用二叉搜索树,可以大大减少可能需要进行的比较次数。不过,有一点需要提醒一下,在二叉搜索树需要更多比较的情况下,这是绝对可能的,但这是例外,而不是规则。

我过去用过的一件事是哈夫曼解码(或任何可变位长方案)

如果用叶子上的字符维护二叉树,则每个输入位决定是移动到左节点还是右节点

当你到达一个叶子节点时,你已经解码了你的角色,你可以开始下一个

例如,考虑下面的树:

    .
   / \
  .   C
 / \
A   B
对于主字母为
C
的文件,这将是一个树(由于用于普通字母的位较少,因此该文件比用于固定位长度方案的文件短)。每个字母的代码为:

A: 00 (left, left).
B: 01 (left, right).
C: 1  (right).

您使用的问题类别是您希望能够合理有效地插入和访问元素的问题。除了不平衡树(如上面的哈夫曼示例),您还可以使用平衡树,这会使插入的成本稍高一些(因为您可能需要动态地重新平衡),但由于您正在遍历尽可能少的节点,因此查找效率更高。

我看到了这个问题,并将要说“哈夫曼!“但你比我抢先一步。这是一个经典的例子,也是一个完美的应用程序,它以一个参考编码理论为基础。+1解释了哈夫曼解码,我一直认为这是一门黑暗的艺术。:)谢谢你,这正是我一直在寻找的答案。现在我确切地知道什么时候应该使用它。我很受启发。