优先队列与堆
一 优先队列
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