优先级队列
必需的功能
优先级队列有三种基本操作。
函数名* 提供的功能 插入(i, p)
增加价值我与优先级p. pop ()
删除并返回优先级最高的元素。 peek ()
在不改变队列的情况下返回优先级最高的元素。 不需要确切的名字。事实上,某些功能可以由特定的语言直接通过特殊的语法提供。
使用列表的Python实现示例
下面的代码是python中优先级队列的实现。在一个有效的实现中,您可以期望为insert获得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 |
|
所以即使我们把约翰
在队列中,我们先放莎莉
优先级更高,所以她先被pop ()
函数。
让我们做一些关于优先队列的练习:
1)看一下实现代码以上特别是第7行和第8行。下面的输出是什么?
1 2 3 4 |
|
这两个值,乔
而且波利
具有相同的优先级。谁先被处理?
如果您看一下实现中的第8行,您将看到我们向左扫描,直到找到一个优先级为的值少.如果我们找不到,我们就把它添加到列表中。因此,在这个实现中,如果有两个具有相同优先级的值,那么最先出现的值将最先出现。
1 2>>>魁人党.流行()(“乔”,2)
我们本可以选择相反的方式;我们只需要改变
<
第8行的运算到相等运算符=
.
2)在Python中,您可以比较多种类型的值,而不仅仅是整数。例如,您可以比较字符串。在Python中,将保持以下状态:
1 2 |
|
那么,下面的输出是什么呢?
1 2 3 4 |
|
正如我们上面看到的,在Python中,您可以比较字符串。的
“一个”
小于“b”
.所以,“b”
会有更高的优先级。的逻辑“米”
优先级应该高于' d '
.
1 2>>>魁人党.流行()(“珍娜”,“米”)
时间复杂度
应用程序
优先级队列用于如此多的不同领域,在这里列出它们是不切实际的。与它们的好处相比,它们引入的开销(优先级)通常是最小的。下面是一些使用优先级队列的例子:
操作系统
计算机中的操作系统管理哪些程序在什么时间执行。假设您的程序队列已满。突然,需要运行一个新的、非常重要的程序。您的操作系统将把它放在具有高优先级的队列中。图搜索算法
许多高效的图搜索算法如*搜索而且迪杰斯特拉算法使用优先级队列来知道接下来要探索哪个节点。该应用程序还包括图搜索(如网络)的推论。Time-activated事件
如果一个程序有许多需要在不同时间执行的事件要执行,那么该程序可以使用优先队列。优先级将是执行程序的时间戳。然后队列将被正确排序。带宽管理
队列用于处理因特网和其他网络上的数据流。然而,并不是所有的数据都同样重要。通过对重要数据进行优先排序,网络可以确保数据尽可能快地到达目的地。因此经常使用优先队列。