堆和红黑树之间有什么区别?

时间:2013-05-14 09:52:59

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

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

  1. 最糟糕的搜索费用是lgN;
  2. 最坏情况下的插入成本是lgN。
  3. 因此,由于红黑树的实施和运作很困难,为什么我们不只是使用堆而不是红黑树?我很困惑。

2 个答案:

答案 0 :(得分:10)

您无法在O(log n)中的堆中找到任意元素。这需要O(n)。您可以在O(1)中的堆中找到第一个元素(最小的,比如说),并在O(log n)中找到提取。红黑树和堆具有完全不同的用途,内部排序和实现:有关详细信息,请参阅下文。

典型用途

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

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

结构强加的一致性限制

红黑树:总排序:左子<父母<正确的孩子。

堆:支配地位:父母<只有孩子。

(请注意,您可以替换比<)

更通用的排序

实施/内存开销

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

堆:结构是隐式的:根位于0位,根位于1和2处,等等,因此每个元素没有开销。通常只存储在一个数组中。

答案 1 :(得分:1)

红黑树:
具有确定性平衡策略的二叉搜索树的形式。此Balancing可确保良好的性能,并且始终可以在O(log n)时间内进行搜索。

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