📜  门| GATE-CS-2016(套装1)|第 47 题

📅  最后修改于: 2021-09-26 03:49:55             🧑  作者: Mango

二叉堆数据结构的运算符delete(i) 将被设计为删除第 i 个节点中的项目。假设堆是在一个数组中实现的,i 指的是数组的第 i 个索引。如果堆树的深度为 d(从根到最远叶子的路径上的边数),那么在删除元素后有效地重新修复堆的时间复杂度是多少?
(一) O(1)
(B) O(d) 但不是 O(1)
(C) O(2 d ) 但不是 O(d)
(D) O(d2 d ) 但不是 O(2 d )

答案:(乙)
解释:

对于这个问题,我们必须稍微调整一下堆数据结构的delete_min() 操作来实现delete( i ) 操作。这个想法是清空数组中索引 i 处的位置(要删除元素的位置)并将其替换为堆中的最后一片叶子(记住堆是作为完整的二叉树实现的,因此您知道最后一个叶子),减小堆大小,现在从当前位置i (保存我们删除的项目的位置)开始,如果新替换的项目大于旧项目的父项(考虑最大堆),则将其向上移动。如果它不大于父级,则通过与子级的值进行比较来将其渗透。新添加的项目最多可以向上/向下渗透 d 次,这是堆数据结构的深度。

因此我们可以说 delete( i ) 的复杂度是 O(d) 而不是 O(1)。

http://geeksquiz.com/binary-heap/

此解决方案由Pranjul Ahuja贡献。
这个问题的测验