红黑树的应用
Posted
技术标签:
【中文标题】红黑树的应用【英文标题】:Applications of red-black trees 【发布时间】:2011-04-23 12:07:16 【问题描述】:红黑 (RB) 树有哪些应用?是否有任何应用程序只能使用 RB 树而不能使用其他数据结构?
【问题讨论】:
你总是可以用任何数据结构完成一些工作,但在某些情况下它会变成O(scary)
。问题应该是:哪种算法最适合 RB 树? (而且我相信***有一些答案)。
真的,有人能回答为什么在第一种情况下节点被设为红色和黑色吗?我的意思是,为什么我们首先要制作两种不同类型的节点?
【参考方案1】:
red-black tree 是 self-balancing binary search tree 的特定实现,如今它似乎是最流行的实现选择。
Binary search trees 用于实现有限映射,您可以在其中存储一组具有关联值的键。您也可以只使用键而不存储任何值来实现集合。
需要平衡树以保证良好的性能,否则树可能会退化为列表,例如,如果您插入已经排序的键。
搜索树相对于哈希表的优势在于您可以按排序顺序高效地遍历树。
AVL-trees 是平衡二叉搜索树的另一种变体。在红黑树出现之前,它们就很受欢迎。它们更仔细地平衡,左右子树的高度之间的最大差异为 1(RB 树最多保证两倍)。它们的主要缺点是再平衡需要更多的努力。
所以红黑树当然是一个不错的选择,但不是这个应用程序的唯一选择。
【讨论】:
我认为 AVL 树更好,因为它们是可以理解的。我还没有遇到了解 RB 树如何工作的开发人员——我的意思是理解比背诵平衡规则列表更多。 基本不变量并不那么复杂:在红黑树中,通往叶子的每条路径都有相同数量的黑色节点,并且路径上没有相邻的红色节点。这意味着路径的长度最多相差两倍。至于所需的旋转,这是对两种树的逐案分析。【参考方案2】:红黑树来自一类自平衡 BST,正如其他人所回答的那样,任何此类自平衡树都可以使用。我想补充一点,红黑树被广泛用作系统符号表。例如,它们用于实现以下内容:
Java:java.util.TreeMap、java.util.TreeSet。 C++ STL:map、multimap、multiset。 Linux 内核:完全公平的调度程序,linux/rbtree.h【讨论】:
【参考方案3】:除非您有非常具体的性能要求,否则 R-B 树可以替换为其他一些自平衡二叉树,例如 AVL 树。在两者之间进行选择基本上是一种性能优化 - 它们提供相同的基本操作。
并不是说它们中的任何一个肯定比另一个“更快”,只是它们的不同之处足以使它们的特定用途往往具有稍微不同的性能,其他所有条件都相同。因此,如果您足够仔细地绘制您的需求,或者只是偶然地,您最终可能会得到其中一个“足够快”以供您使用,而另一个则不然。 R-B 提供比 AVL 稍快的插入,但代价是查找速度稍慢。
【讨论】:
【参考方案4】:没有像红黑这样的规则只能在特定情况下使用 它取决于应用程序,例如当您只需要构建一次树并且必须多次查询它时,您可以使用 AVL 树,因为在 AVL 树中搜索非常快。但是它是严格平衡的,所以插入删除可能需要一些时间 AVl 树可用于语言词典,您只需构建一次数据结构 并且红黑树用于现在在当前 Linux 内核中使用的完全公平调度器中......
应用于红黑树的约束也强制要求从根到最远叶子的路径不超过从根到最近叶子的路径的两倍。
顺便说一句,您可以在这里查找红黑树所需的各种搜索和插入等时间
Average Worst case
Space O(n) O(n)
Search O(log n) O(log n)
Insert O(log n) O(log n)
Delete O(log n) O(log n)
【讨论】:
以上是关于红黑树的应用的主要内容,如果未能解决你的问题,请参考以下文章