我什么时候会使用优先级队列?

时间:2013-08-05 02:35:07

标签: algorithm queue priority-queue

使用我所知道的优先级队列的唯一例子是Dijkstra算法(用于计算最低成本)

在其他情况下会有用吗?

5 个答案:

答案 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,则使用优先级队列。