我在红黑树上读过许多文章,其中需要O(log n)时间进行操作。我不太清楚它是如何工作的以及实际上树图使用红黑树算法来平衡树与二进制搜索相比树。
任何人都可以用一个例子来解释算法是如何工作的。
答案 0 :(得分:12)
红黑树是二叉搜索树。它只是BST的一种风格,它具有花式版本的insert
和delete
操作,可以在树运行时对树进行重新组织,以便树永远不会变得长而且很粗糙。&# 34;树变得越长越有条理,它就像链表一样。平均而言,链表操作需要触摸列表的一半(或最坏情况下的整个列表),因此运行时间线性变化(元素数量为O(n)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
红黑树不能保证完美浓密(用正确的术语"完美平衡"),但是红黑规则保证了它的浓密感。数学上严格的方式使得操作时间随着n的对数而不是n的线性变化而变化。
红黑规则'天才是他们是本地人。"在插入或删除违反规则的过程中,可以通过仅为操作触及的每个节点调整恒定数量的节点来恢复它们。因此它们便宜且易于实施。
然而,当红黑规则适用于整棵树时,可以通过一个聪明的数学证明表明它如上所述它足够浓密。
树图怎么样?映射是具有称为密钥集K的域的函数,并且范围称为值集V.为了实现树映射,每个节点存储键值对<k,v>
,其中k \in K
和{{1 }}。在上面的图(以及大多数演示文稿)中,仅显示了键(字母A-G)。在地图中,以非常明显的方式对这些对进行插入,查找和删除。例如,查找使用通常的BST算法搜索密钥。找到密钥后,也会找到该值,因为它位于同一对中。那是什么回来了。在java中,该对称为v \in V
。您可以在Java source code。
我不会详细了解红黑规则是如何运作的,因为我无法改进the Wikipedia page。我的猜测和希望是你错过了#34;大图片&#34;所以现在讨论会有意义。好消息是,几乎所有语言都提供了经过全面测试和性能优化的树实现,因此无需了解旋转的神秘细节。当然,如果你很好奇并且只是想知道,那就去吧!恭喜!
对于它的价值,Top Coder对算法的解释并不总是最清楚的。寻找其他人,直到一个人点击&#34;为了你。 CS中备受推崇的教科书受到尊重是有原因的:他们的解释非常好。 Corman and Rivest是最受欢迎的。
答案 1 :(得分:2)
首先,您应该更具体地了解您的问题。指定您所知道的,您不知道的以及您尝试过的内容。
提出问题,TreeMap和Red-black树是完全不同的概念。对这两者的概念性理解完全不依赖于另一个,我建议你不要混淆它们。我不会给你确切的答案,而是简要介绍一下你必须学习它们的概念和顺序(IMO)。
地图数据结构
树数据结构
我假设你知道地图和二叉搜索树的概念。如果没有,简单的搜索将为您带来很多好的资源。
现在,到实际答案。
首先,你应该知道什么是SortedMap和自平衡BST。
什么是SortedMap?
来自Java docs,
进一步提供其键的总排序的Map。地图按照其键的自然顺序排序,或者通过在排序地图创建时通常提供的比较器进行排序。
当您希望对基础键,值对进行排序(按键)时,使用SortedMap。这样,检索基于最小值,最大值或执行范围的操作将更容易。
什么是自平衡二进制搜索树?
来自wikipedia,
自平衡(或高度平衡)二叉搜索树是任何基于节点的二叉搜索树,它可以在任意项目插入和删除时自动保持其高度(根目录下的最大级别数)。 / p>
再次,红黑树在自平衡BST的一个实现中。有others类似于ALV树等。对于正常BST上的任何操作,最坏的情况是O(n)
。使用平衡BST而不是正常/非平衡BST的主要优点是所有操作的最坏情况都降低到O(logn)
,而插入/删除时节点重新安排只需要很少的开销。看看this。
那么,什么是TreeMap?
TreeMap和红黑树的关系如何?
他们是两回事。从理论上讲,您可以使用任何二叉搜索树来实现TreeMap。为了获得良好的结果,我们使用自平衡二进制搜索树,其插入,删除和检索操作的时间复杂度较低。在Java的情况下,使用红黑树。我不知道为什么使用红黑树的确切原因,但我相信有一个。