【优先队列介绍】
文章目录
- 前言
- 一、优先队列是什么?
- 二、优先队列的实现
- 三、C++实现优先队列
- 1. 引入库
- 2. 创建优先队列
- 示例:大根堆
- 输出:
- 示例:小根堆
- 输出:
前言
在数据结构中,队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构。除了普通的队列,还有一种变种叫做优先队列(Priority Queue)。与普通队列不同,优先队列是根据元素的优先级来决定出队顺序的,而不是根据元素入队的顺序。
一、优先队列是什么?
优先队列是一种特殊的队列,其中的每个元素都关联一个优先级。在优先队列中,元素的出队顺序是由其优先级决定的,而不是由入队的顺序决定的。具有更高优先级的元素会先被处理。
常见的优先队列应用场景:
- 任务调度:操作系统中的任务调度系统通常会根据任务的优先级来决定任务的执行顺序。
- 图算法:如Dijkstra算法中的优先队列,用于处理最短路径问题。
- 事件驱动仿真系统:事件根据优先级进行排序和处理。
二、优先队列的实现
优先队列通常可以通过以下两种方式实现:
- 数组或链表:每次插入时按优先级排序,出队时直接删除最大优先级元素。
- 堆:通过堆结构(如二叉堆)来实现,这种方法具有较高的效率。
在实际应用中,二叉堆是最常用的实现方式,因为它能在O(log n)时间内完成插入和删除操作。
三、C++实现优先队列
C++标准库中提供了一个priority_queue
容器适配器,它基于堆(默认是大根堆)实现。可以直接使用它来构建优先队列。
1. 引入库
#include <iostream>
#include <queue>
#include <vector>
2. 创建优先队列
C++的priority_queue
默认是一个大根堆,即优先级较高的元素会先出队。可以通过std::greater
来实现小根堆,改变元素的优先级顺序。
示例:大根堆
#include <iostream>
#include <queue>
#include <vector>int main() {// 创建一个优先队列,默认是大根堆std::priority_queue<int> pq;// 向优先队列中插入元素pq.push(10);pq.push(20);pq.push(5);pq.push(15);// 打印并删除优先队列中的元素(按优先级出队)std::cout << "Priority Queue (Max-Heap):\n";while (!pq.empty()) {std::cout << pq.top() << " "; // 打印优先队列中的最大元素pq.pop(); // 删除最大元素}std::cout << std::endl;return 0;
}
输出:
Priority Queue (Max-Heap):
20 15 10 5
示例中,priority_queue<int>
创建了一个默认的大根堆,每次pq.pop()
都会删除当前队列中优先级最高的元素(即最大值)。
示例:小根堆
实现一个小根堆,即优先级低的元素先出队,可以通过std::greater
来实现。
#include <iostream>
#include <queue>
#include <vector>int main() {// 创建一个优先队列,使用std::greater来构造小根堆std::priority_queue<int, std::vector<int>, std::greater<int>> pq;// 向优先队列中插入元素pq.push(10);pq.push(20);pq.push(5);pq.push(15);// 打印并删除优先队列中的元素(按优先级出队)std::cout << "Priority Queue (Min-Heap):\n";while (!pq.empty()) {std::cout << pq.top() << " "; // 打印优先队列中的最小元素pq.pop(); // 删除最小元素}std::cout << std::endl;return 0;
}
输出:
Priority Queue (Min-Heap):
5 10 15 20
通过使用std::greater<int>
,将队列改为了小根堆,每次pq.pop()
都会删除当前队列中优先级最低的元素(即最小值)。