树图如何使用红黑树算法
How tree map uses red black tree algorithm
我读过很多关于红黑树的文章,其中操作需要 O(log n) 时间。我不太清楚它是如何工作的,以及树图实际上是如何使用红黑树算法来平衡树的二叉搜索树。
谁能举例说明算法的工作原理。
红黑树是二叉搜索树。它只是 BST 的一种风格,具有 insert
和 delete
操作的奇特版本,可以在 运行 时重组树,这样树永远不会 "long and stringy." 越长越细树越多,它的行为就越像链表。平均而言,链表操作需要接触一半的列表(或最坏情况下的整个列表),因此 运行 时间线性变化(元素数量 n 的 O(n))。当树 "bushy" 或接近平衡时,每个操作的成本要低得多( O (log n) )。红黑算法保证树保持茂密。
为了具体说明,这里有两棵存储键 A 到 G 的树。左边是长而细的。注意它看起来像一个列表。在最坏的情况下,需要进行 4 次关键比较才能找到一个元素。右边的树很茂密。它只需要3个。这里的区别很小。对于一棵1023个元素的树,stringy树需要512次比较,而busy树只需要10次。这就是log n的力量。
B _D_
/ \ / \
A D B F
/ \ / \ / \
C F A C E G
/ \
E G
红黑树不能保证完全茂密(用正确的术语 "perfectly balanced"),但红黑规则保证它在数学上严格的方式下足够茂密,因此操作时间会有所不同作为 n 的对数而不是 n 的线性。
红黑规则的天才之处在于它们是 "local."在违反规则的插入或删除过程中,可以通过为每个触及的节点调整恒定数量的节点来恢复它们手术。因此它们很便宜并且很容易实现。
然而,当红黑规则对整棵树都成立时,可以通过巧妙的数学证明表明它如上所述足够茂密。
树状图呢?映射是一个函数,其域称为键集 K,范围称为值集 V。为了实现树图,每个节点存储一个键值对 <k,v>
,其中 k \in K
和 v \in V
.在上图(和大多数演示文稿)中,仅显示了键(字母 A-G)。在映射中,插入、查找和删除以非常明显的方式处理这些对。例如,查找使用通常的 BST 算法搜索键。当找到键时,也找到了值,因为它在同一对中。这就是返回的内容。在 java 中,该对称为 Map.Entry
。您可以在 Java source code.
中查看
我不会详细介绍红黑规则的工作原理,因为我无法改进 the Wikipedia page。我的猜测和希望是你错过了 "big picture" 所以现在讨论将有意义。好消息是几乎所有语言都提供经过全面测试和性能优化的树实现,因此无需了解旋转的神秘细节。当然,如果你很好奇,只是想知道,那就试试吧!恭喜!
就其价值而言,Top Coder 对算法的解释并不总是最清晰的。到处寻找其他人,直到 "clicks" 找到你。 CS中受人尊敬的教科书受人尊敬是有原因的:他们的解释非常好。 Corman and Rivest 是公认的最爱。
首先,你应该更具体地说明你的问题。详细说明您知道什么、不知道什么以及尝试过什么。
问题来了,TreeMap和红黑树是完全不同的概念。两者的概念性理解完全不依赖于另一方,我建议您不要将它们混为一谈。我不会给你确切的答案,而是简要概述概念和你必须学习它们的顺序 (IMO)。
地图数据结构
- 地图
- Map 的类型 - HashMap、SortedMap、TreeMap 等
树数据结构
- 树
- 二叉树
- 二叉搜索树(BST)
- 平衡 BST
- 自平衡BST——AVL树、红黑树等
我假设您了解地图和二叉搜索树的概念。如果没有,简单的搜索将带您找到很多好的资源。
现在,正式回答。
首先你应该知道什么是SortedMap和Self-balancing BST
什么是 SortedMap?
来自 Java docs、
A Map that further provides a total ordering on its keys. The map is ordered according to the natural ordering of its keys, or by a Comparator typically provided at sorted map creation time.
当您希望对底层键值对进行排序(按键)时,使用 SortedMap。这样,检索最小值、最大值或执行基于范围的操作会更容易。
什么是自平衡二叉搜索树?
来自 wikipedia,
a self-balancing (or height-balanced) binary search tree is any node-based binary search tree that automatically keeps its height (maximal number of levels below the root) small in the face of arbitrary item insertions and deletions.
同样,自平衡 BST 的一种实现中的红黑树。有others like ALV tree, etc. The worst case for any of the operation on a normal BST is O(n)
. The main advantage of using Balanced BST over normal/un-balanced BST is that the worst case of all the operations is brought down to O(logn)
with only a little overhead involved with the rearrangement of the nodes on insertion/deletion. Have a look at this.
那么,什么是 TreeMap?
一个TreeMap is an implementation of SortedMap。
TreeMap和红黑树有什么关系?
它们是两个不同的东西。理论上,您可以使用任何二叉搜索树来实现 TreeMap。为了获得好的结果,我们使用了自平衡二叉搜索树,它的插入、删除和检索操作的时间复杂度较低。在Java的情况下,使用红黑树。我不知道为什么使用红黑树的确切原因,但我相信是有的。
我读过很多关于红黑树的文章,其中操作需要 O(log n) 时间。我不太清楚它是如何工作的,以及树图实际上是如何使用红黑树算法来平衡树的二叉搜索树。
谁能举例说明算法的工作原理。
红黑树是二叉搜索树。它只是 BST 的一种风格,具有 insert
和 delete
操作的奇特版本,可以在 运行 时重组树,这样树永远不会 "long and stringy." 越长越细树越多,它的行为就越像链表。平均而言,链表操作需要接触一半的列表(或最坏情况下的整个列表),因此 运行 时间线性变化(元素数量 n 的 O(n))。当树 "bushy" 或接近平衡时,每个操作的成本要低得多( O (log n) )。红黑算法保证树保持茂密。
为了具体说明,这里有两棵存储键 A 到 G 的树。左边是长而细的。注意它看起来像一个列表。在最坏的情况下,需要进行 4 次关键比较才能找到一个元素。右边的树很茂密。它只需要3个。这里的区别很小。对于一棵1023个元素的树,stringy树需要512次比较,而busy树只需要10次。这就是log n的力量。
B _D_
/ \ / \
A D B F
/ \ / \ / \
C F A C E G
/ \
E G
红黑树不能保证完全茂密(用正确的术语 "perfectly balanced"),但红黑规则保证它在数学上严格的方式下足够茂密,因此操作时间会有所不同作为 n 的对数而不是 n 的线性。
红黑规则的天才之处在于它们是 "local."在违反规则的插入或删除过程中,可以通过为每个触及的节点调整恒定数量的节点来恢复它们手术。因此它们很便宜并且很容易实现。
然而,当红黑规则对整棵树都成立时,可以通过巧妙的数学证明表明它如上所述足够茂密。
树状图呢?映射是一个函数,其域称为键集 K,范围称为值集 V。为了实现树图,每个节点存储一个键值对 <k,v>
,其中 k \in K
和 v \in V
.在上图(和大多数演示文稿)中,仅显示了键(字母 A-G)。在映射中,插入、查找和删除以非常明显的方式处理这些对。例如,查找使用通常的 BST 算法搜索键。当找到键时,也找到了值,因为它在同一对中。这就是返回的内容。在 java 中,该对称为 Map.Entry
。您可以在 Java source code.
我不会详细介绍红黑规则的工作原理,因为我无法改进 the Wikipedia page。我的猜测和希望是你错过了 "big picture" 所以现在讨论将有意义。好消息是几乎所有语言都提供经过全面测试和性能优化的树实现,因此无需了解旋转的神秘细节。当然,如果你很好奇,只是想知道,那就试试吧!恭喜!
就其价值而言,Top Coder 对算法的解释并不总是最清晰的。到处寻找其他人,直到 "clicks" 找到你。 CS中受人尊敬的教科书受人尊敬是有原因的:他们的解释非常好。 Corman and Rivest 是公认的最爱。
首先,你应该更具体地说明你的问题。详细说明您知道什么、不知道什么以及尝试过什么。
问题来了,TreeMap和红黑树是完全不同的概念。两者的概念性理解完全不依赖于另一方,我建议您不要将它们混为一谈。我不会给你确切的答案,而是简要概述概念和你必须学习它们的顺序 (IMO)。
地图数据结构
- 地图
- Map 的类型 - HashMap、SortedMap、TreeMap 等
树数据结构
- 树
- 二叉树
- 二叉搜索树(BST)
- 平衡 BST
- 自平衡BST——AVL树、红黑树等
我假设您了解地图和二叉搜索树的概念。如果没有,简单的搜索将带您找到很多好的资源。
现在,正式回答。
首先你应该知道什么是SortedMap和Self-balancing BST
什么是 SortedMap?
来自 Java docs、
A Map that further provides a total ordering on its keys. The map is ordered according to the natural ordering of its keys, or by a Comparator typically provided at sorted map creation time.
当您希望对底层键值对进行排序(按键)时,使用 SortedMap。这样,检索最小值、最大值或执行基于范围的操作会更容易。
什么是自平衡二叉搜索树?
来自 wikipedia,
a self-balancing (or height-balanced) binary search tree is any node-based binary search tree that automatically keeps its height (maximal number of levels below the root) small in the face of arbitrary item insertions and deletions.
同样,自平衡 BST 的一种实现中的红黑树。有others like ALV tree, etc. The worst case for any of the operation on a normal BST is O(n)
. The main advantage of using Balanced BST over normal/un-balanced BST is that the worst case of all the operations is brought down to O(logn)
with only a little overhead involved with the rearrangement of the nodes on insertion/deletion. Have a look at this.
那么,什么是 TreeMap?
一个TreeMap is an implementation of SortedMap。
TreeMap和红黑树有什么关系?
它们是两个不同的东西。理论上,您可以使用任何二叉搜索树来实现 TreeMap。为了获得好的结果,我们使用了自平衡二叉搜索树,它的插入、删除和检索操作的时间复杂度较低。在Java的情况下,使用红黑树。我不知道为什么使用红黑树的确切原因,但我相信是有的。