堆和红黑树有啥区别?

Posted

技术标签:

【中文标题】堆和红黑树有啥区别?【英文标题】:What are the differences between heap and red-black tree?堆和红黑树有什么区别? 【发布时间】:2013-05-08 13:13:46 【问题描述】:

我们知道堆和红黑树都有这些属性:

    最坏情况下的搜索成本是 lgN; 最坏情况下的插入成本是 lgN。

那么,既然红黑树的实现和操作比较困难,为什么不直接用堆代替红黑树呢?我很困惑。

【问题讨论】:

你能分享O(log(N))在堆中搜索的算法吗? 我记得,您不能在 O(log(N)) 中大量搜索。 我们不知道“第一个属性”。 【参考方案1】:

您无法在O(log n) 的堆中找到任意元素。这需要O(n) 来完成。您可以在O(1) 的堆中找到第一个元素(例如最小的),然后在O(log n)提取它。红黑树和堆有完全不同的用途、内部排序和实现:请参阅下文了解更多详细信息。

典型用途

红黑树:将字典存储在哪里以及查找您想要按键排序的元素,以便您可以按顺序遍历它们。插入和查找是O(log n)

Heap:优先队列(和堆排序)。提取最小值和插入是O(log n)

结构强加的一致性约束

红黑树:总排序:left child

堆:支配:父

(请注意,您可以替换为比

实现/内存开销

红黑树:用于表示树结构的指针,因此每个元素的开销。通常使用在免费存储上分配的多个节点(例如,在 C++ 中使用 new),节点指向其他节点。保持平衡以确保对数查找/插入。

堆:结构是隐式的:根在位置 0,根的子节点在 1 和 2,依此类推,因此每个元素没有开销。通常只存储在一个数组中。

【讨论】:

【参考方案2】:

红黑树: 具有确定性平衡策略的二叉搜索树的形式。这种平衡保证了良好的性能,并且总是可以在 O(log n) 时间内搜索到。

堆: 我们需要搜索堆中的每个元素以确定元素是否在里面。即使进行了优化,我相信搜索仍然是 O(N)。另一方面,最好在 O(1) 集合中找到最小值/最大值。

【讨论】:

以上是关于堆和红黑树有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

JDK8的HashMap为啥要引入红黑树?

快排和红黑树

高级树AVL 树和红黑树

红黑树和AVL树的区别(转)

Java集合详解6:TreeMap和红黑树

二叉树和红黑树