堆和红黑树有啥区别?
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) 集合中找到最小值/最大值。
【讨论】:
以上是关于堆和红黑树有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章