优先队列(Priority Queue)

优先队列(Priority Queue)

背景

​​  许多应用程序都需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序。很多情况下我们会收集一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素,如此这般。例如,你可能有一台能够同时运行多个应用程序的电脑(或者手机)。这是通过为每个应用程序事件分配一个优先级,并总是处理下一个优先级最高的事件来实现的。例如,绝大多数手机分配给来电的优先级都会被游戏程序的高。

定义

​​  在这种情况下,一个合适的数据结构应该快速支持三种操作:获取最值删除最值插入新值。这种数据类型叫做优先队列(Priority Queue)优先队列能以常数阶 O ( 1 ) O(1) O(1)的平均时间复杂度获取最值,并且还能以 O ( l o g n ) O(logn) O(logn) 的平均时间复杂度删除最值或插入任意值。

​​  而优先队列通常基于二叉堆来实现,而二叉堆通常以顺序存储结构来实现。所以用数组保存元素并按照一定条件排序,以实现高效地(对数级别的)删除最大元素和插入元素操作。

API

优先队列是一种抽象数据类型,它表示了一组值和对这些值的操作,它的抽象层使我们能够方便地将应用程序和各种具体实现隔离开来。

泛型优先队列的 API 如下:

public class MaxPQ <Key extends Comparable<Key>> 
-----------------------------------------------------------------------
            MaxPQ()                   创建一个优先队列
            MaxPQ(int max)            创建一个初始容量为 max 的优先队列
            MaxPQ(Key[] a)            用a中的元素创建一个优先队列
       void insert(Key v)             向优先队列中插入一个元素
        Key max()                     返回最大元素
        Key delMax()                  删除并返回最大元素
    boolean isEmpty()                 返回队列是否为空
        int size()                    返回优先队列中元素个数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值