Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最大堆(插入和删除)_Algorithm_Heap - Fatal编程技术网

Algorithm 最大堆(插入和删除)

Algorithm 最大堆(插入和删除),algorithm,heap,Algorithm,Heap,在max heap中,假设有人使用大于堆中所有项的项调用insert(),然后立即调用deleteMax()。假设没有重复的密钥。结果堆是否与这些操作之前的堆相同 我的答案:在堆中插入max元素需要O(logn)并且删除max也需要O(logn)。因此,新的insert元素将是根中的,旧的max元素(位于根)将被删除 我的答案正确吗?如果没有重复的,新堆将与原始堆完全相同 这是因为当您添加一个大型元素时,它最初会作为一个叶添加,并且会一直冒泡到顶部它通过不断地将原始父元素(最初较大的节点)与自身

在max heap中,假设有人使用大于堆中所有项的项调用
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即使这样树也会得到它原来的方向。我会更新我的答案。