优先队列 |第一套(介绍)
优先队列是队列的扩展,具有以下属性。
- 每个项目都有与之关联的优先级。
- 高优先级元素在低优先级元素之前出列。
- 如果两个元素具有相同的优先级,则根据它们在队列中的顺序提供服务。
在下面的优先级队列中,具有最大 ASCII 值的元素将具有最高优先级。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。
典型的优先级队列支持以下操作。
insert(item, priority):插入具有给定优先级的项目。
getHighestPriority():返回最高优先级的项目。
deleteHighestPriority():删除最高优先级的项目。
如何实现优先队列?
使用数组:一个简单的实现是使用以下结构的数组。
struct item {
int item;
int priority;
}
insert() 操作可以通过在 O(1) 时间内在数组末尾添加一个项目来实现。
getHighestPriority() 操作可以通过线性搜索数组中优先级最高的项来实现。此操作需要 O(n) 时间。
deleteHighestPriority() 操作可以通过首先线性搜索一个项目,然后通过将所有后续项目向后移动一个位置来删除该项目来实现。
我们也可以使用链表,链表的所有操作的时间复杂度与数组相同。链表的优点是 deleteHighestPriority() 可以更高效,因为我们不必移动项目。
使用堆:
堆通常是优先队列实现的首选,因为与数组或链表相比,堆提供了更好的性能。在二叉堆中,getHighestPriority() 可以在 O(1) 时间内实现,insert() 可以在 O(Logn) 时间内实现,deleteHighestPriority() 也可以在 O(Logn) 时间内实现。
使用斐波那契堆,insert() 和 getHighestPriority() 可以在 O(1) 分摊时间内实现,deleteHighestPriority() 可以在 O(Logn) 分摊时间内实现。
优先队列的应用:
1)CPU调度
2)Dijkstra 最短路径算法、Prim 最小生成树等图算法
3) 涉及优先级的所有队列应用程序。
优先队列是使用堆实现的。请参阅以下文章了解我们自己的实现和库实现。
- 二叉堆(优先队列最常见的实现)
- C++中的优先队列。
- Java中的优先级队列。
- Python中的优先队列。
- JavaScript 中的优先队列。
有用的链接:
- 最近关于优先队列的文章!
- 优先队列的应用。
参考:
http://en.wikipedia.org/wiki/Priority_queue