优先队列
最小的必需功能
优先级队列有三个基本操作。
函数名* 提供的功能 插入(i,p)
增加价值一世优先权P.. 流行音乐()
删除并返回具有最优先级的元素。 窥视()
返回具有最高优先级的元素,而无需更改队列。 不需要确切的名称。实际上,可以通过特殊语法直接通过给定的语言提供一些功能。
使用列表的Python实现示例
以下代码是Python中优先级队列的实现。在一个有效的实现中,您可以期望获得用于插入的O(log n)的运行时(通过使用二进制搜索来查找放置它)。但是,为简单起见,我们将留在o(n)。
我们将使用整数分配优先级(整数越高,优先级越高)。此外,我们将在队列的字符串表示中显示优先级以使练习更容易稍后的.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
让我们来看看为什么这是一个糟糕的实施。这插入
函数在一个堆取O(log n)因为它是二进制搜索树.但是,在这一实现中,我们必须潜在地浏览每个价值self.qlist.
.这意味着我们的实现是O(n)插入
.
使用优先级队列进行练习
让我们使用我们的多于实施以处理进入医院的患者。当他们进来时,我们可以插入患者的名称,其状况和优先级。
1 2 3 4 5 6 7 8 9 |
|
所以即使我们放了约翰
首先在队列中,我们放入莎莉
优先考虑,所以她首先处理流行音乐()
功能。
让我们使用优先队队列进行一些练习:
1)查看实现代码多于,特别是第7和第8行。下面的输出是什么?
1 2 3 4 |
|
两个值,乔
和波莉
有同样的优先权。谁先被处理?
如果您在实现中查看第8行,您将看到我们正在扫描左侧,直到找到优先级的值少.如果找不到,我们就把它添加到列表中。所以,在这个实现中,如果有两个值具有相同的优先级,最先出现的那个会最先出来。
1 2>>>PQ..流行音乐()(“乔”那2)
我们可以轻松选择相反的方式;我们只需要改变
<
第8行的操作到平等操作员=
.
2)在Python中,你可以比较许多类型的值,而不仅仅是整数。例如,您可以比较字符串。在Python中,以下语句将成立:
1 2 |
|
那么,下面的输出是什么?
1 2 3 4 |
|
正如我们在上面看到的那样,在Python中,您可以比较字符串。这
'一种'
小于'B'
.所以,'B'
会有更高的优先权。的逻辑“米”
应该优先于'D'
.
1 2>>>PQ..流行音乐()(“珍娜”那“米”)
时间复杂性
应用程序
优先级队列在这么多不同的区域中使用,在这里列出它们是不切实际的。与其益处相比,他们介绍的开销量(优先级)通常很小。以下是操作中优先级队列的一些示例:
操作系统
计算机中的操作系统管理在什么时间执行哪些程序。想象一下你的程序队列已满。突然,一个新的,非常重要的程序需要运行。您的操作系统将在队列中具有高优先级。图形搜索算法
许多有效的图搜索算法,如一个*搜索和dijkstra的算法使用优先级队列了解下一个要探索哪些节点。此应用程序还包括用于图形搜索(如网络)的金属型。Time-activated事件
如果程序有许多需要在不同时间执行的事件,则程序可以使用优先级队列。优先级是执行程序的时间戳。然后队列将被正确排列。带宽管理
队列用于处理Internet和其他网络上的数据流。然而,并非所有数据都同等重要。通过对重要数据进行优先排序,网络可以确保数据尽可能快地到达目的地。因此,优先级队列经常被使用。