优先队列与堆

本文介绍了优先队列的概念,包括定义、API及不同的实现方式,特别强调了使用堆来实现优先队列的优势。堆是一种二叉树结构,满足堆有序性质,通过上浮(swim)和下沉(sink)操作保证堆的有序性,从而高效地支持最大元素的删除和新元素的插入。
摘要由CSDN通过智能技术生成

优先队列与堆

一 优先队列

1.1 定义

在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。

在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)

优先级队列和通常的栈和队列一样,只不过里面的每一个元素都有一个”优先级”,在处理的时候,首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理。

1.2 API

优先队列最重要的操作就是删除最大元素插入元素
删除最大元素的方法名为 delMax(),插入元素的方法名为 Insert()。定义类 MaxPQ 的API如下:
这里写图片描述
这里写图片描述
类似的,我们会在适当的地方使用另一个类 MinPQ。它和 MaxPQ 类似,只是含有一个 delMin() 方法来删除并返回队列中键值最小的那个元素。

1.3 实现

优先级队列可以通过数组,链表,堆或者其他数据结构实现。

最简单的优先级队列可以通过有序、无序数组来实现,当要获取最大值的时候,对数组进行查找返回即可。

  • 如果使用无序数组,那么每一次插入的时候,直接在数组末尾插入即可,时间复杂度为 O(1) O ( 1 ) 。但是如果要获取最大值,或者返回最小值的话,则需要进行查找,这时时间复杂度为 O(N) O ( N )
  • 如果使用有序数组,那么每一次插入的时候,通过插入排序将元素放到正确的位置,时间复杂度为 O
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值