什么是优先队列
本身就是一种队列
普通队列:先进先出,后进后出
优先队列:出队顺序和入队顺序无关,与优先级相关。主要区别普通队列在于出队,优先级高者出队。
计算机中优先队列的使用
操作系统中进行任务调度时,操作系统会同时执行多个任务并为它们分配计算资源,包括分配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)级的操作。