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

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

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

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

【问题讨论】:

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

标签: data-structures heap red-black-tree


【解决方案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) 集合中找到最小值/最大值。

    【讨论】: