二进制堆数据结构的运算符delete(i)设计为删除第i个节点中的项。假设堆是在数组中实现的,并且i引用数组的第i个索引。如果堆树的深度为d(从根到最远的叶子的路径上的边数),那么在除去元素之后有效地重新固定堆的时间复杂度是多少?
(A) O(1)
(B) O(d)但不是O(1)
(C) O(2 d )但不是O(d)
(D) O(d2 d )但不是O(2 d )
答案: (B)
解释:
对于这个问题,我们必须稍微调整堆数据结构的delete_min()操作以实现delete( i )操作。这个想法是清空数组中索引i处的点(要删除元素的位置),并用堆中的最后一个叶子替换它(记住堆是作为完整的二叉树实现的,所以您知道它的位置)最后一片叶子),减小堆大小,然后从当前位置i (保存我们删除的项目的位置)开始,如果新替换的项目大于旧项目的父项(考虑最大堆),则将其上移。如果它不大于父项,则通过与子项的值进行比较将其渗透。新添加的项最多可以向上/向下渗透d次,这是堆数据结构的深度。
因此,可以说delete( i )的复杂度为O(d),而不是O(1)。
http://geeksquiz.com/binary-heap/
该解决方案由Pranjul Ahuja贡献。
这个问题的测验