概念:
优先队列的特点是存入其中的每项数据都另外附有一个数值,表示这个项的优先程度,称其为优先级。
优先队列应该保证,在任何时候访问和弹出的,总是当时在这个结构里保存的所有元素中,优先级最高的。
基于线性表的实现方法
- 1 在存入数据时,保证表中元素始终按优先顺序排列,任何时候都可以直接取到当时在表里的最优先的元素。采用有组织的元素存入方式,存入元素的操作比较麻烦,效率可能较低,但访问和弹出时比较方便。
- 2 存入数据时,采用最简单的方式(例如,对顺序表存入表的尾端,对链接表存入表头),需要取用时,通过检索找到最优先的元素。采用这种方式,存入的效率高但是取用麻烦。
比较上面两种方法后,决定采用第一种:在加入新数据时,设法确定正确的插入位置,保证表元素始终按优先顺序排列
基于list 实现优先队列
(在下面的实现中,假定需要存储的数据元素用“<=”比较优先级,值较小的元素优先级更高)
将优先队列定义为一个类:
class PrioQue():
def __init__(self, elist=[]):
self._elems = list(elist)
self._elems.sort(reverse=True)
这里用list 进行转换,有两个作用:
1.对实参表做一个拷贝,避免共享。
2. 这样也使构造函数的实参可以是任何可迭代对象,例如迭代器或者元祖等。
(reverse 参数要求做大到小的排序: list 弹出最后一个,值最小,优先级最高)
插入元素是最复杂的操作,需要找到正确的插入位置
def enqueue(self, e):
i = len(self._elems) - 1
while i > 0:
if self._elems[i] <= e: