树图如何使用红黑树算法

8
2个回答

14

红黑树是一种二叉搜索树。它是BST的一种变体,具有精细版本的插入和删除操作,这些操作在运行时重新组织树,使树永远不会变得“长而紧凑”。树变得越长和越紧凑,它就越像一个链接列表。平均而言,链接列表操作需要访问一半的列表(或在最坏情况下访问整个列表),因此运行时间与元素数量n呈线性变化(O(n))。当树“丰满”或接近平衡时,每个操作则要便宜得多( O(log n) )。红黑算法保证树始终保持丰满。

为了使这更具体,这里有两棵存储A到G键的树。左边是长而紧凑的。注意它看起来像一个列表。在最坏的情况下,需要进行4次键比较才能找到元素。右边的树是丰满的。它只需要3次。这里的差异很小。对于一个包含1023个元素的树,紧凑的树需要512次比较,而丰满的树只需要10次。这就是log n的威力。

  B                    _D_
 / \                  /   \
A   D                B     F
   / \              / \   / \
  C   F            A   C E   G
     / \
    E   G

红黑树并不能保证完全的“平衡”,但是红黑规则确保其以一种数学严格的方式足够“平衡”,从而使得操作时间随log n而变化,而不是随n线性变化。

红黑规则之所以如此出色,是因为它们是“局部的”。 在插入或删除破坏规则时,只需要调整每个节点所接触的常数数量的节点即可恢复规则。 因此,它们便宜而且相当容易实现。

然而,当红黑规则对整个树都成立时,可以通过巧妙的数学证明显示它足够“平衡”,如上所述。

那么树映射呢? 映射是具有定义域称为键集K和值域称为值集V的函数。 为了实现树映射,每个节点存储一个键值对<k,v>,其中k \in Kv \in V。 在上面的图纸中(以及大多数演示文稿中),仅显示键(字母A-G)。在映射中,插入,查找和删除对这些对进行相当明显的处理。 例如,查找使用常规BST算法搜索键。 找到键后,由于它与值在同一个对中,因此也找到了值。返回值。 在java中,该对称为 Map.Entry 。 您可以在Java源代码中查看。

我不会详细介绍红黑规则的工作方式,因为我无法改进维基百科页面上的内容。 我猜测和希望您错过了“大局”,所以现在讨论会有意义。好消息是,几乎所有语言都提供了经过充分测试和性能优化的树实现,因此不必了解旋转的奥秘。 当然,如果您很好奇,只是想知道,请随意尝试! 恭喜!

值得一提的是,Top Coder关于算法的解释并非总是最清晰的。 找寻其他解释,直到有一个“点击”为止。 CS领域的受人尊敬的教科书之所以受到尊重,是因为它们的解释非常出色。 Corman和Rivest是被广泛接受的喜欢的教科书。


2
首先,您应该更具体地说明您的问题。指定您知道什么,不知道什么以及尝试了什么。
至于问题,TreeMap和红黑树是完全不同的概念。对任何一个概念的理解都不依赖于另一个概念,我建议您不要混淆它们。我不会给您确切的答案,而是会简要概述这些概念以及您必须学习它们的顺序(在我看来)。
映射数据结构
1. 映射 2. 映射类型 - HashMap、SortedMap、TreeMap等
树形数据结构
1. 树 2. 二叉树 3. 二叉搜索树(BST) 4. 平衡BST 5. 自平衡BST - AVL树、红黑树等
我假设您知道映射和二叉搜索树的概念。如果不知道,简单的搜索会引导您找到很多好的资源。
现在,进入实际答案。
首先,您应该知道SortedMap和自平衡BST是什么。
什么是SortedMap?
Java docs中,
一个提供其键的总排序的Map。该Map根据其键的自然排序或通常在创建排序Map时提供的比较器进行排序。
当您希望基础键值对按键排序时,使用SortedMap。这样,检索最小值、最大值或执行基于范围的操作将更容易。
什么是自平衡二叉搜索树?
wikipedia中,
自平衡(或高度平衡)二叉搜索树是任何基于节点的二叉搜索树,在面对任意项插入和删除时都会自动保持其高度(根下的最大级别)小。
再次提到,红黑树是自平衡二叉搜索树的一种实现。还有像AVL树等其他类型的树。在普通的二叉搜索树上进行任何操作的最坏情况是O(n)。使用平衡二叉搜索树而不是非平衡二叉搜索树的主要优点是,在插入/删除节点时只涉及很少的开销,即可将所有操作的最坏情况下降到O(logn)。请看这里
那么,什么是TreeMap呢? TreeMapSortedMap的一种实现。
TreeMap和红黑树有什么关系呢?
它们是两个不同的东西。理论上,您可以使用任何一种二叉搜索树来实现TreeMap。为了获得良好的结果,我们使用自平衡二叉搜索树,其插入、删除和检索操作的时间复杂度较低。在Java中,使用红黑树。我不知道为什么使用红黑树,但我相信有原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接