优先队列的基本概念

什么是优先队列

本身就是一种队列
普通队列:先进先出,后进后出
优先队列:出队顺序和入队顺序无关,与优先级相关。主要区别普通队列在于出队,优先级高者出队。

计算机中优先队列的使用

操作系统中进行任务调度时,操作系统会同时执行多个任务并为它们分配计算资源,包括分配CPU的时间片。在具体分配资源的时候,操作系统需要看各个任务的优先级,动态的选择优先级最高的任务执行。

关于动态的解释
如果任务数量是固定的n,并不需要制作新的数据结构来处理这一问题。只需要把他们按照优先级排序,然后从高序到低序去执行就可以了。这一过程需要的是一个排序算法,而并不是一个优先队列。
假设有一个任务处理中心,有三个请求。任务中心需要找到这三个请求中优先级最高的请求进行处理。在处理这个请求的同时很有可能又来了很多新的任务请求,这就是动态的解释。不能从一开始就确定任务处理中心一共需要处理多少个任务。

优先队列的实现

优先队列的本质就是一个队列

// 队列的接口
public interface Queue<E> {
    void enqueue(E e);   // 入队

    E dequeue();      // 出队

    E getFront();      // 查看队首

    int getSize();       // 查看大小

    boolean isEmpty();   // 是否为空
}

队列的接口完全可以复用,对于优先队列来说,接口并没有改变,只不过在实现这些接口的时候,具体接口实现的功能会有区别。最大的区别在于出队以及队首元素是谁这两个操作。
此时出队元素应该是优先级最高的元素,队首的元素也是优先级最高的元素。

优先队列可以使用不同的底层实现。

普通线性结构实现优先队列,入队O(1),只是把一个新的元素放进线性结构中,出队O(n),需要扫描一遍整个线性结构中的所有元素,找到优先级最高的元素拿出队列。

顺序线性结构整个线性结构一直维持所有元素的顺序。在这种情况下出队O(1)出队极为容易,只需要拿出队首或队尾,入队O(n),每一个入队元素都需要考虑查到线性结构的哪一个位置,找位置的操作则需要O(n)级别。

不管是普通线性结构还是顺序线性结构都存在O(n)级的操作。

猜你喜欢

转载自blog.csdn.net/wankcn/article/details/106533979