最小堆是一个实现优先级队列的重要数据结构。这里给出最小堆的一些概念和特性的讲解:
- 最小堆是一个完全二叉树结构,保证根节点的值最小。
- 最小堆可以分为最大堆和最小堆,根据对元素的排序规则不同。
- 最小堆插入、删除和修改操作时间复杂度都是O(logN),查询根节点元素的时间复杂度是O(1)。
- 插入一个元素时,将元素作为叶子节点添加到堆的末尾,然后不断与父节点进行上浮操作,保证它>=任何子节点。
- 删除根节点时,将最后一个叶子节点移植到根位置,然后进行下沉操作,调整堆的结构。
- 下沉操作是当前节点与其左右子节点进行比较,将其中最小的值移动到当前位置。
- 上浮操作是当前节点与其父节点进行比较,如果当前节点小于父节点,进行位置交换。
- PriorityQueue内部使用最小堆实现有序插入和删除操作。
- 最小堆适用于需要频繁获取最小元素的场景,如求交互最短路径、任务调度等。
- 堆排序就是利用最小堆的删除操作一次性将数列排序。
最小堆常被应用在下面的一些算法问题中:
- Dijkstra算法:用于单源最短路径问题,每次从优先队列中取出距离源点最近的点,更新其周围节点的距离值。
- Huffman编码树:构建前缀树时,需要按照频率从低到高选择结点,利用优先队列实现。
- Kruskal最小生成树:按边权从小到大合并边,用优先队列管理待处理边。
- Prim最小生成树:按点到树中各边的权值从小到大扩展树,优先队列优化。
- 最短任务调度:按任务优先级从高到低安排任务顺序,使用优先队列实现。
- 拓扑排序:按任务依赖关系从入度为0的任务开始逐步处理,用优先队列管理入度为0的任务。
- A*搜索算法:按估计成本从低到高扩展节点,优先队列优化选择下一个节点。
- 分治算法的合并进程:需要合并有序序列,使用优先队列取出最小元素合并。