返回

堆的实现与优先队列的关系

后端

堆的实现

堆是一种数据结构,它具有完全二叉树的特性,其中每个节点的值都大于或等于其子节点的值。堆可以通过一个数组实现,其中根节点位于数组的第一个元素中。堆的子节点可以通过以下公式计算:

  • 左子节点:2 * i + 1
  • 右子节点:2 * i + 2

向下调整

向下调整算法用于将新插入元素调整到堆中正确的位置。该算法从新元素的父节点开始,不断比较元素值,如果新元素的值大于其父节点,则将两者交换。这个过程一直持续到新元素达到其应有的位置为止。

def shiftDown(arr, i):
    while i < len(arr) // 2:
        left = 2 * i + 1
        right = 2 * i + 2
        max_index = i
        if left < len(arr) and arr[left] > arr[max_index]:
            max_index = left
        if right < len(arr) and arr[right] > arr[max_index]:
            max_index = right
        if max_index == i:
            break
        arr[i], arr[max_index] = arr[max_index], arr[i]
        i = max_index

向上调整

向上调整算法用于在删除根节点后调整堆的结构。该算法从根节点的子节点开始,不断比较元素值,如果子节点的值大于其父节点,则将两者交换。这个过程一直持续到子节点达到其应有的位置为止。

def shiftUp(arr, i):
    while i > 0:
        parent = (i - 1) // 2
        if arr[i] > arr[parent]:
            arr[i], arr[parent] = arr[parent], arr[i]
            i = parent
        else:
            break

堆和优先队列的关系

优先队列是一种抽象数据类型,它支持两种基本操作:插入和删除最小元素。堆是一种可以高效实现优先队列的数据结构。在堆中,最小元素始终位于根节点处,通过向上调整和向下调整算法可以保持堆的结构和属性。

时间复杂度分析

  • 建立一个堆的时间复杂度为 O(n),其中 n 是堆中的元素数量。
  • 插入和删除元素的时间复杂度均为 O(log n)。
  • 查询最小元素的时间复杂度为 O(1)。