堆
堆是一种基于完全二叉树的数据结构,它具有以下两个重要性质:
- 堆是一个完全二叉树,即除了最后一层,其他层都必须是满的,而最后一层必须从左到右填满。
- 堆中的每个节点的键值必须大于或等于(或小于或等于)其子节点的键值。
根据第二个性质,堆被分为两种类型:
- 最大堆:每个节点的键值都大于或等于其子节点的键值。
- 最小堆:每个节点的键值都小于或等于其子节点的键值。
堆的一个重要应用是优先队列。优先队列是一种特殊的队列,其中每个元素都有一个优先级。堆可以用于实现优先队列。在一个最大堆中,队列中的最大元素总是位于队列的前面,而在一个最小堆中,队列中的最小元素总是位于队列的前面。这使得堆非常适合实现需要快速访问最大或最小元素的算法,如堆排序和Dijkstra算法。
堆还有一些其他的应用,比如:
- 用于实现图形算法,如Prim和Kruskal算法。
- 用于内存管理,例如在Java中实现的优先队列PriorityQueue。
- 用于实现中位数算法。
堆的常见操作包括:
- 插入元素:将元素插入到堆的末尾,然后将其上移,以满足堆的性质。
- 删除元素:将堆的根节点删除,将堆的最后一个元素移动到根节点,然后将其下移,以满足堆的性质。
- 访问元素:访问堆的根节点,即最大或最小元素。
- 修改元素:修改堆中某个元素的值,然后重新满足堆的性质。
常见的堆: