使用我所知道的优先级队列的唯一例子是Dijkstra算法(用于计算最低成本)
在其他情况下会有用吗?
答案 0 :(得分:42)
这是一个实际的例子 - 对于商业应用程序:
你正在经营一家医院,病人正在进来。工作人员中只有一名医生。第一个男人走了进来 - 他马上就服完了。接下来,感冒的男人进来需要帮助。你将他加入队列,他排队等候医生可用。接下来,一个头上戴着斧头的男人穿过门。他被赋予更高的优先权,因为他有更高的医疗责任。所以患感冒的男子排成一列。接下来,有人有呼吸问题。因此,患有感冒的男子再次被优先考虑。这在现实世界中被称为分类 - 但在这种情况下,它是一条医疗线。
在代码中实现此功能将使用优先级队列和工作线程(医生)来执行耗材/工作单元(患者)的工作
答案 1 :(得分:11)
基于堆的优先级队列部分地对输入序列进行排序。当你不需要整个序列时,这比直接排序它有优势,因为mcdowella给出了一些例子。特别是,如果您只需要n个元素中的m个,则具有O(m log n)复杂度。第二个优点是当您动态添加元素时,即当您事先不知道整个序列时。使用堆作为后备存储,添加另一个元素比将其插入排序序列要快。
此外,当您按排序顺序弹出单个元素然后丢弃它们(即之后不需要排序的序列)时,使用优先级队列会为读者提供正确的消息。它还使得交换不同的实现变得相当容易,例如一个基于堆或一个预先对输入序列进行排序的。这是一个品味问题,你可以使用随后使用的任何序列来实现相同的效果,但这只会使代码更难以阅读。
答案 2 :(得分:10)
扫描大量统计信息以报告前N项 - N个最繁忙的网络连接,N个最有价值的客户,N个最大的磁盘用户......
答案 3 :(得分:6)
以下是清单: 事件驱动的模拟: 一行中的客户,碰撞粒子
数值计算。 减少舍入误差 数据压缩。 压缩数据的霍夫曼码。 图表搜索: Dijkstra的算法,Prim的算法 数论: 权力总和 人工智能: A *搜索 的统计:强> 维持序列中最大的M值 操作系统: 负载均衡,中断处理 离散优化。 箱包装,调度 垃圾邮件过滤。 贝叶斯垃圾邮件过滤器
答案 4 :(得分:1)
优先级队列(最小/最大堆)有许多应用程序。但是,如果您正在寻找经典和着名的算法,例如Prim's algorithm,则使用优先级队列。