Algorithm 最大堆(插入和删除)
在max heap中,假设有人使用大于堆中所有项的项调用Algorithm 最大堆(插入和删除),algorithm,heap,Algorithm,Heap,在max heap中,假设有人使用大于堆中所有项的项调用insert(),然后立即调用deleteMax()。假设没有重复的密钥。结果堆是否与这些操作之前的堆相同 我的答案:在堆中插入max元素需要O(logn)并且删除max也需要O(logn)。因此,新的insert元素将是根中的,旧的max元素(位于根)将被删除 我的答案正确吗?如果没有重复的,新堆将与原始堆完全相同 这是因为当您添加一个大型元素时,它最初会作为一个叶添加,并且会一直冒泡到顶部它通过不断地将原始父元素(最初较大的节点)与自身
insert()
,然后立即调用deleteMax()
。假设没有重复的密钥。结果堆是否与这些操作之前的堆相同
我的答案:在堆中插入max元素需要O(logn)
并且删除max也需要O(logn)
。因此,新的insert元素将是根中的,旧的max元素(位于根)将被删除
我的答案正确吗?如果没有重复的,新堆将与原始堆完全相同 这是因为当您添加一个大型元素时,它最初会作为一个叶添加,并且会一直冒泡到顶部它通过不断地将原始父元素(最初较大的节点)与自身交换来实现 现在,当删除max()时,根将被清空(或用树的最后一个节点填充)。因此,较大的孩子取代了它的位置。这个较大的孩子是这棵树的原始根。因此,向下冒泡与向上冒泡的路径相同 如果存在重复项,则在删除时,任何一个子项都可以占据空根的位置。因此,不能保证最终的树是相同的。 例如,没有重复项 原始树:
10
7 6
4
.
10
7 10
4
.
加11:
10
7 6
4 11
.
10
11 6
4 7
.
11
10 6
4 7
.
10
7 10
4 11
.
10
11 10
4 7
.
11
10 10
4 7
.
现在删除max():
或者作为@CaptainCodeman建议的deleteMax()的其他实现:
7
10 6
4
.
10
7 6
4
.
7
10 10
4
.
10
10 7 // the right child can also take its place
4
.
复制品:
原始树:
10
7 6
4
.
10
7 10
4
.
加11:
10
7 6
4 11
.
10
11 6
4 7
.
11
10 6
4 7
.
10
7 10
4 11
.
10
11 10
4 7
.
11
10 10
4 7
.
现在删除max():
或者作为@CaptainCodeman建议的deleteMax()的其他实现:
7
10 6
4
.
10
7 6
4
.
7
10 10
4
.
10
10 7 // the right child can also take its place
4
.
为了清楚起见,问题包括insert()未阻塞,并且在insert()完成之前调用了deleteMax()?还原了编辑-没有问题的答案是没有意义的。为什么要删除这个问题?这也假设了一个二进制堆。像配对堆或斐波那契堆之类的东西可能具有完全不同的内部状态。我不完全相信这是真的,因为实现deleteMax的方法不止一种。例如,一些实现从树的底部获取一个元素并将其放在根上,然后将其交换下来。(而不是交换一个空的空间)@CaptainCodeman即使这样树也会得到它原来的方向。我会更新我的答案。