📜  优先队列 |第一套(介绍)

📅  最后修改于: 2022-05-13 01:57:01.027000             🧑  作者: Mango

优先队列 |第一套(介绍)

优先队列是队列的扩展,具有以下属性。

  1. 每个项目都有与之关联的优先级。
  2. 高优先级元素在低优先级元素之前出列。
  3. 如果两个元素具有相同的优先级,则根据它们在队列中的顺序提供服务。

在下面的优先级队列中,具有最大 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) 涉及优先级的所有队列应用程序。

优先队列是使用堆实现的。请参阅以下文章了解我们自己的实现和库实现。

  1. 二叉堆(优先队列最常见的实现)
  2. C++中的优先队列。
  3. Java中的优先级队列。
  4. Python中的优先队列。
  5. JavaScript 中的优先队列。

有用的链接:

  1. 最近关于优先队列的文章!
  2. 优先队列的应用。

参考:
http://en.wikipedia.org/wiki/Priority_queue