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

heapify VS 构建堆

如何解决heapify VS 构建堆

您能否确认“heapify”概念的含义,我从中学习的来源说heapify 是从数组(从头开始)构建堆

这是我在谷歌搜索几个资源后的理解

Heapify 是:

  • 在我们弹出堆的顶部节点并将最后一个节点移到顶部之后,我们从上到下重新排列树,使其再次成为一个堆(我们堆化)
  • 堆化时间复杂度 O(log n)

Heapify 不是:

  • 从数组创建堆,这是一个时间复杂度为 O(n) 的自底向上操作

这样对吗?

解决方法

基本上,heapify 是一种用于在根节点违反堆属性(子子树必须是堆!)时重新排列堆的算法。它是构建堆、在堆中插入或删除顶部节点的重要部分。

Heapify 是:

  • 在我们弹出堆的顶部节点并将最后一个节点移到顶部之后,我们从上到下重新排列树,使其再次成为一个堆(我们堆化)
  • 堆化时间复杂度 O(log n)

这里描述了在移除顶部元素时如何使用 heapify。是的,这是一个有效的案例,因为您需要将最大/最小元素保持在顶部(取决于它是最大堆还是最小堆)。

Heapify 不是:

从一个数组创建一个堆,这是一个时间复杂度为 O(n) 的自底向上操作

你说得对,不是。如前所述,heapify 只是在对其执行操作后维护堆属性的一种方式。

您使用 heapify 构建堆以确保生成的数据结构满足堆要求。例如,假设您需要从数组构建一个最小堆,您可以按如下方式进行:

def min_heapify(arr,index):
    size      = len(arr)
    new_index = index
    left      = index * 2 + 1
    right     = index * 2 + 2

    if (left < size and arr[left] < arr[new_index]):
        new_index = left

    if (right < size and arr[right] < arr[new_index]):
        new_index = right

    if (new_index != index):
        arr[index],arr[new_index] = arr[new_index],arr[index]
        min_heapify(arr,new_index)

array = [5,4,3,2,1]

size = len(array)
for i in range((size//2) - 1,-1,-1):
    min_heapify(array,i)

print (array)

[1,5,4]

如您所见,即使 heapify 积极用于构建堆,我们也不能说构建堆是 heapify。这只是过程中必不可少的一部分。

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