priority_queue用法小结

本文介绍了STL中priority_queue的基本用法,包括其模板原型、常用操作等,并通过一个自定义比较函数的例子展示了如何根据需求定制优先级队列。

刚开始学习算法不久,一些常用的算法工具还没有掌握,真是丢人!

前一段时间用到优先级队列时,都是自己手动通过最大堆或者最小堆来写一个,容易出错且耗时。接触到STL后,开始用map和set模拟一个优先级队列,但是总有一些小问题出现,发现STL功能强大,但我却几乎不懂。

今天终于决定使用STL提供的priority_queue,发现还挺好用,虽然很多人都称他效率不够高,但是使用起来很方便。下面就总结一下它的一般用法:

模板原型:

priority_queue<T,Sequence,Compare>

T:存放容器的元素类型

Sequence:实现优先级队列的底层容器,默认是vector<T>

Compare:用于实现优先级的比较函数,默认是functional中的less<T>

常用的操作如下:

empty() 如果优先队列为空,则返回真
pop() 删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素的个数
top() 返回优先队列中有最高优先级的元素

但是在使用时必须注意:priority_queue放置元素时,不会判断元素是否重复。(因为在模板的第二个参数时顺序容器,不能保证元素的唯一性)

此外可以替代默认的Compare函数。下面用一个小例子说明一下:

 在自己实现Compare函数(函数对象)时,函数对象是中的参数如果是const类型,那么队列存放的元素(比如Node)的比较函数也一定要实现为const。因为函数对象在执行时通过其参数调用Node的比较函数。

 

### 汽车加油问题贪心算法实验总结报告 #### 实验背景 汽车加油问题是典型的贪心算法应用场景之一。该问题的核心在于如何利用有限资源(油量)完成最长路径的行驶,同时减少不必要的中间停靠次数。通过合理选择加油站作为补给点,可以达到优化整体行程的目的。 #### 贪心策略分析 在解决此问题时采用了如下贪心准则:每当车辆即将耗尽燃油之前,在已知范围内寻找能够提供最大额外里程数的下一个最佳加油地点[^1]。这种局部最优决策累积起来最终形成全局最优点——即总的最少加油次数。 #### 算法实现细节 - **输入处理**:读取初始条件包括每段路程的距离以及起始状态下的满载油量。 - **核心逻辑构建**: - 创建一个大顶堆用来保存所有曾经路过但未决定是否使用的潜在优质加油选项; - 随着模拟过程推进,一旦发现当前储备不足以支撑抵达下一节点,则立即从上述备选列表中挑出贡献值最高的那个实施补充行动,并相应更新计数值。 - **边界状况考量**:需特别留意是否存在无论如何都无法达成终点的情形,此时应提前终止运算并向调用方反馈异常提示信息“No Solution”。 ```python import heapq def min_refuel_stops(target, tank_capacity, distances): pq = [] # A max heap is simulated using negative values. stops_count = previous_position = current_fuel = 0 for i in range(len(distances)): current_position = sum(distances[:i]) # Consume the distance traveled since last refueling stop or origin point. current_fuel -= (current_position - previous_position) while current_fuel < 0 and pq: current_fuel += (-heapq.heappop(pq)) # Use largest available fuel from past stations. stops_count += 1 if current_fuel < 0: return "No Solution" # Add this station's potential contribution to our priority queue. heapq.heappush(pq, -(distances[i])) previous_position = current_position final_distance_to_target = target - previous_position current_fuel -= final_distance_to_target while current_fuel < 0 and pq: current_fuel += (-heapq.heappop(pq)) stops_count += 1 if current_fuel < 0: return "No Solution" return stops_count ``` 以上Python代码片段展示了完整的解决方案框架,其中运用到了标准库模块`heapq`来高效管理待选加油机会的数据结构[^3]。 #### 结果讨论与反思 通过对多个测试案例的实际运行效果观察表明,所提出的基于贪心思想的方法确实能够在多项式时间内给出正确解答。然而值得注意的是,尽管大多数时候都能找到唯一解,但在某些极端配置下也可能不存在可行路线安排。因此实际应用过程中还需要充分考虑到这类特殊情况的存在可能性并妥善加以应对。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值