用堆实现优先级队列(Priority Queue)

本文介绍了优先级队列的概念,以及多种实现方式,包括向量、有序向量、列表、有序列表和BBST。重点讨论了使用堆作为数据结构实现优先级队列的优势,堆作为一个完全二叉树,能确保根节点为最大(最小)值。文章提供了堆的insert、getMax和remove操作的代码实现,并进行了测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.优先级队列定义:

 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有

(1)查找

(2)插入一个新元素 

(3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。

    对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。

2.优先级队列的实现方案

    优先级队列的实现既要兼顾成本,也要兼顾效率

    (1).第一种使用向量实现:


                  由图可知,在使用插入操作时,时间复杂度为

### 创建和实现优先级队列 #### 使用标准库 `priority_queue` C++ 提供了内置的数据结构 `std::priority_queue` 来方便地创建优先级队列。默认情况下,该类模板实现了最大(即降序优先级队列),意味着每次取出的是当前集合中的最大元素。 ```cpp #include <queue> #include <iostream> int main() { std::priority_queue<int> pq; // 默认为最大 pq.push(10); pq.push(30); pq.push(20); while (!pq.empty()) { std::cout << pq.top() << ' '; pq.pop(); } } ``` 这段代码展示了如何声明并操作一个整数类型的优先级队列[^1]。通过调用成员函数 `push()` 插入新元素,并利用 `top()` 获取最高优先级的元素而不会将其移除;最后使用 `pop()` 移除顶部元素直到队列为空为止。 对于最小(升序优先级队列),可以通过自定义比较器来改变行为: ```cpp #include <functional> #include <queue> #include <iostream> int main(){ std::priority_queue<int, std::vector<int>, std::greater<int>> minPQ; minPQ.push(10); minPQ.push(30); minPQ.push(20); while(!minPQ.empty()){ std::cout<<minPQ.top()<<' '; minPQ.pop(); } } ``` 这里引入了第三个模板参数 `std::greater<int>` 使得 `priority_queue` 成为了一个小顶形式的优先级队列[^2]。 #### 自定义优先级队列 如果希望更灵活地控制内部机制,则可以基于其他容器如 `deque` 或者自己编写完全定制化的版本。不过通常没有必要这样做,除非有特殊需求无法满足于现有的解决方案。 ```cpp template<typename T, typename Container = std::vector<T>> class CustomPriorityQueue : public std::priority_queue<T, Container> {}; // 这里只是简单继承了 STL 的 priority_queue 并允许指定不同的底层容器类型。 ``` 上述例子提供了一种方式来自定义优先级队列的基础框架,可以根据具体应用场景进一步扩展功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值