返回
堆的实现与优先队列的关系
后端
2024-02-27 21:51:13
堆的实现
堆是一种数据结构,它具有完全二叉树的特性,其中每个节点的值都大于或等于其子节点的值。堆可以通过一个数组实现,其中根节点位于数组的第一个元素中。堆的子节点可以通过以下公式计算:
- 左子节点:
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)。