优先队列概念与其线性表的实现

本文介绍了优先队列的概念,强调了其保证优先级最高元素优先访问的特点。探讨了两种基于线性表的实现方法,包括直接按优先顺序排列元素和检索查找最优先元素。最终选择了在插入时确保优先顺序的实现方式,并详细说明了基于list的实现,包括使用list进行拷贝以避免共享和接受任何可迭代对象作为输入。插入元素是复杂度为O(n)的操作,而其他操作为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念:

优先队列的特点是存入其中的每项数据都另外附有一个数值,表示这个项的优先程度,称其为优先级。
优先队列应该保证,在任何时候访问和弹出的,总是当时在这个结构里保存的所有元素中,优先级最高的。

基于线性表的实现方法

  • 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:
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值