我们知道堆和红黑树都有这些属性:
因此,由于红黑树的实施和运作很困难,为什么我们不只是使用堆而不是红黑树?我很困惑。
答案 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)中找到最小值/最大值。