数据结构之堆详解
什么是堆?
堆(Heap)是一种特殊的树形数据结构。堆具有以下两个特点:
- 堆是一颗完全二叉树;
- 堆中每个节点的值都必须大于等于或小于等于其左右子节点的值,分别称作大根堆和小根堆。
上述的大根堆和小根堆其实是两种不同的堆的实现方式。对于大根堆,每个节点的值都比其左右子节点的值要大;小根堆则相反,每个节点的值都比其左右子节点的值要小。
堆的基本操作
插入元素
当我们在堆中插入一个元素的时候,需要满足以下几个步骤:
- 将新元素插入到堆的最后一个节点处;
- 将新元素向上调整至合适的位置,直到满足堆的性质为止。
具体的实现方式有两种,分别是“向上调整”(上滤)和“向下调整”(下滤)。这里我们只介绍向上调整的方式。
向上调整的方式如下:
- 在堆的最后插入一个新元素,令其为当前元素;
- 比较当前元素与其父节点,若当前元素小于其父节点,则交换当前元素和其父节点的位置;
- 重复第二步,直到当前元素不再小于其父节点或者已经到达堆顶。
示例:
我们以一个小根堆为例,初始堆为空,插入元素序列为3,1,5,2,4。
插入3后,堆如下所示(左图):
3
/ \
/ \
/ \
接着,我们插入1,此时1小于3,需要将其向上调整。
比较1和3,发现1小于3,交换1和3的位置。此时堆变成了下图的样子:
1
/ \
/ \
/ \
3
现在再插入5,此时5大于1,不需要调整。
然后插入2,此时需要向上调整。
比较2和5,2小于5,交换2和5的位置得到下图:
1
/ \
/ \
/ \
2 3
/
/
5
最后插入4,不需要调整,最终的堆如下图所示:
1
/ \
/ \
/ \
2 3
/ \
/ \
4 5
删除元素
当我们从堆中删除一个元素的时候,需要满足以下几个步骤:
- 删除堆顶元素,并将堆的最后一个元素移到堆顶处。
- 将堆顶元素向下调整至合适的位置,直到满足堆的性质为止。
向下调整的方式如下:
- 令当前元素为堆顶元素,若当前元素没有左右子节点则终止操作;
- 比较当前元素与其左右子节点,若当前元素小于其左右子节点中的最小值,则与其左右子节点中的最小值交换位置;
- 重复第二步,直到当前元素小于其左右子节点或者没有左右子节点。
示例:
对于上面的例子,我们以小根堆为例,将堆顶元素3删除,得到下图:
1
/ \
/ \
/ \
2 5
/
/
4
此时堆顶元素为1,需要向下调整。由于2小于5,我们选择与2交换位置,得到下图:
1
/ \
/ \
/ \
4 5
/
/
2
最后进行一次向下调整即可。
堆的应用
堆的重要应用之一是排序算法,堆排序(Heap Sort)是一种基于堆实现的排序算法。堆还经常用于实现优先队列,认识和熟练掌握堆对于我们的编程能力提升非常有帮助。
结论
堆是一种很有用的数据结构,具有优秀的时间复杂度和空间复杂度。了解堆的基本操作和应用能够提升我们的编程能力,尤其对于算法和数据结构的学习更是非常重要。
以上就是数据结构之堆的详细攻略,希望您对此有所收获。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据结构之堆详解 - Python技术站