微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当底层结构是数组时,为什么在二元堆中删除是 O(logN) 操作

如何解决当底层结构是数组时,为什么在二元堆中删除是 O(logN) 操作

我知道最小/最大堆中的删除总是发生在根,当它发生时,被删除的节点被二叉堆中的最后一个节点替换,然后节点向下堆放以找到其正确位置,使这平均成为 O(logN) 操作。

现在,二叉堆通常用数组表示。问题来了:如果在数组中删除位置 [0] 是 log(n), 因为所有正确的单元格必须向左移动,以填充空单元格。那么,**为什么最小/最大堆二叉树(在数组上表示)被认为是 O(logN) 运算 ** 而不是 O(n) 运算。

感谢您解开困惑!

解决方法

...如果在位置 [0] 的数组中删除是 log(n),因为所有正确的单元格必须向左移动,以填充空单元格。那么,**为什么最小/最大堆二叉树(在数组上表示)被认为是 O(logN) 运算 ** 而不是 O(n) 运算。

在您的第一段中,您正确地指出要删除根元素,必须将其替换为堆的最后一个元素,然后从根向下应用 heapify 操作。 在这种情况下,并非所有正确的单元格都应该向左移动,因为您只更新根处的一个值(您也可以更新最后一个元素,或减少堆大小以忽略您的元素heapify 操作),然后从根开始堆化。

heapify 是 O(log(n)),不管堆是在数组上实现还是作为树实现。此外,它通常是通过数组实现的 :)

,

堆是一棵二叉树,堆化从根到叶子。堆的高度约为。树中多个节点的对数,因此最多需要 log(N) 次交换。底层数组的所有元素不需要移动,只需在树的向下路径上移动几个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。