【发布时间】:2011-12-27 23:48:32
【问题描述】:
我正在刷新算法理论(来自 Cormen)。
在二进制尝试的章节中有一个练习要求:
最小堆属性可以用来打印n节点的键吗 在 O(n) 时间内按排序顺序排列的树?展示如何做,或解释为什么不这样做。
我认为是的,这是可能的。
在最小堆中,节点中的元素小于其两个子节点。
所以堆的根总是所有n个元素中较小的元素,根的左孩子小于左子树中的所有元素,根的右孩子小于堆中所有元素右子树等。
所以如果我们继续提取根,打印它,然后用它的较小的孩子更新根,我们保留最小堆属性并按排序顺序打印。 (我正在考虑一个不基于数组的最小堆)。
所以这可以在 O(n) 时间内完成,因为要更新根,我们只需比较 2 个孩子并将根的指针更新为 2 个中的较小者。
但我在解决方案中检查了这里:
Cormen Supplement Solutions
而且 1)它谈到了最大堆 2)它说它不能在 O(n) 时间内完成:
在堆中,一个节点的键是它的两个孩子的键。在二进制 搜索树,一个节点的键是它的左孩子的键,但它的右 孩子的钥匙。堆属性,与二叉树不同 属性,无助于按排序顺序打印节点,因为它 不告诉节点的哪个子树包含要打印的元素 在那个节点之前。在堆中,小于节点的最大元素 可以在任一子树中。请注意,如果堆属性可以是 用于在 O(n) 时间内按排序顺序打印键,我们将有一个 用于排序的 O(n) 时间算法,因为构建堆只需要 准时。但我们知道(第 8 章)比较排序必须采用 (n lg n) 时间。
从我的角度来看,我可以理解使用最大堆,不可能在 O(n) 中打印它们。
但是根据我解释的原因,是否可以使用 min-heap 属性来做到这一点?
还有为什么解决方案会忽略最小堆。是错字还是错误?
我在这里误解了什么吗?
【问题讨论】:
标签: algorithm computer-science heap binary-tree theory