堆学习笔记
什么是堆
堆(Heap)是一种经过排序的完全二叉树,其中每个节点都比它的子节点大(或小),被称为最大堆(Max Heap)或最小堆(Min Heap)。在计算机科学中,堆经常被用作一种数据结构来实现优先队列,堆排序等算法。
最大堆
最大堆的每个节点都比它的子节点大,堆顶元素是整个堆中的最大值。例如,下面是一个6个节点的最大堆:
Copy Code 10
/ \
8 7
/ \ /
6 5 3
最小堆
最小堆的每个节点都比它的子节点小,堆顶元素是整个堆中的最小值。例如,下面是一个6个节点的最小堆:
Copy Code 1
/ \
2 3
/ \ /
4 5 6
堆的基本操作
堆作为一种数据结构,有以下基本操作:
插入元素
向堆中插入元素是在堆的末尾添加元素,然后通过“上滤”操作使其满足堆的性质。具体实现步骤如下:
- 将新元素插入堆的末尾。
- 将新元素与其父节点比较,若大于父节点则交换,重复此过程直到不再大于父节点或到达根节点。
删除元素
从堆中删除元素通常是删除堆顶元素,并把最后一个元素移动到堆顶,然后通过“下滤”操作使其满足堆的性质。具体实现步骤如下:
- 用堆末尾元素替换堆顶元素。
- 将新堆顶元素与其两个子节点比较,若小于其中任一子节点则与子节点交换,重复此过程直到不再小于子节点或没有子节点为止。
堆排序
堆排序利用堆的性质进行排序,首先建立一个最大堆,然后每次取出堆顶元素放到数组末尾,再对剩余元素调整成最大堆,重复此过程直到所有元素都有序。堆排序的时间复杂度为O(nlogn)。
堆的应用
优先队列
堆可以作为一种数据结构实现优先队列,即每次取出队列中最优先的元素。在堆中,堆顶元素就是最优先的元素,删除堆顶元素后,新的堆顶元素仍然是最优先的元素,因此堆可以实现高效的优先队列。
堆排序
堆排序利用堆的性质进行排序,具有以下特点:
- 时间复杂度为O(nlogn),与归并排序等其他时间复杂度为O(nlogn)的排序算法一样。
- 堆排序不需要额外的空间存储数据,空间复杂度为O(1)。
- 堆排序可以通过调整堆的结构来实现原地排序(In-place sorting),即不需要像归并排序那样需要额外的存储空间。
实例
下面是一个使用Python语言实现的最小堆:
pythonCopy Codeimport heapq
heap = []
heapq.heappush(heap, 5)
heapq.heappush(heap, 3)
heapq.heappush(heap, 7)
heapq.heappush(heap, 4)
print(heapq.heappop(heap)) # output: 3
print(heapq.heappop(heap)) # output: 4
print(heapq.heappop(heap)) # output: 5
print(heapq.heappop(heap)) # output: 7
该程序使用Python标准库中的heapq
模块实现了最小堆,向堆中插入元素使用heappush
函数,删除堆顶元素使用heappop
函数。通过以上程序可以看出,输出结果为3、4、5、7,证明该程序实现的是最小堆。