什么是优先队列?

477 阅读3分钟

前言

之前学习过队列,所谓队列就像我们平时排的队一样,排成一排,先排队的人先获得,先到先得。真实的世界不是这样的,有的人要插队,有的事情比较的紧急优先处理,生活中有很多这样的例子告诉我们并不是说先到先得的,我说这样的意思并不是说我们的社会不好,而是人们在经济活动中自然而然产生的情况。

现实生活中的优先队列

举一个栗子,比如你要去北京协和医院看病,首先你的挂专家的号,可是这个专家的号你要排队恐怕要等一年之久,当然病情也不允许这样,不许的马上治疗,于是乎你找人托关系找到了黄牛,他有资源可以马上让你挂到专家号,可以你得出5000RMB,就这样你通过黄牛挂到了这个专家的号。

计算机世界中的优先队列

上面我们花了大段文字讲了排队这件事情,其实我今天谈到话题就是数据结构中的优先队列,听起这个名字其实和队列有点不一样。普通队列是先到先得,先进先出,而优先队列出队列和入队的顺序无关,和优先级有关,可能最后一个入队的元素会最先出队

优先队列的实现

优先队列从底层来说还是一个队列,和普通队列在实现并没有太多的差别,唯一差别比较大的可能就是入队(enqueue) 和出队(dequeue)不一样,可以直接使用以前用到的队列接口,不一样的地方就是在接口的实现上。比如出队的元素不是入队最早的元素,而是优先级最高的元素最先出队

优先队列的底层实现方案

对于优先队列的底层实现,可以使用不同的数据结构,比如使用链表、数组这样的线性结构,也可以使用二叉树这样的树型结构

方案 入队 出队(最大元素)
普通线性结构 O(1) O(n)
顺序线性结构 O(n) O(1)
O(logn) O(logn)

从上面的图中我们可以看到普通的线性结构、顺序线性结构总有一个的时间复杂度是O(n),顺序线性结构确实维护了一个有序的数据,取出最大元素复杂度在O(1),但是为了维持这个循序不得不遍历所有的元素来插入一个新的元素。 如果我们采用堆来实现优先队列,情况会好很多,入队出队复杂度都在O(logn),即便在最差的是否复杂度也是O(logn)

总结

自己最近在学习数据结构,对数据结构应该怎么学习不知道,一点点的敲代码,码字,写文章,我觉得比我之前学了就忘恐怕要好一些,至少不会忘记的那么快,还可以整理一下思路,在学完这个课程后,可以回过头来复习一下,看看自己有没有用心学习,学的怎么样。 一开始在写的时候句子难免有些不通顺的地方,我也在一点点的改进,争取一节课一篇文章,把学习的过程记录下来。 下篇文章将介绍使用实现的优先队列