前言
之前学习过队列,所谓队列就像我们平时排的队一样,排成一排,先排队的人先获得,先到先得。真实的世界不是这样的,有的人要插队,有的事情比较的紧急优先处理,生活中有很多这样的例子告诉我们并不是说先到先得的,我说这样的意思并不是说我们的社会不好,而是人们在经济活动中自然而然产生的情况。
现实生活中的优先队列
举一个栗子,比如你要去北京协和医院看病,首先你的挂专家的号,可是这个专家的号你要排队恐怕要等一年之久,当然病情也不允许这样,不许的马上治疗,于是乎你找人托关系找到了黄牛,他有资源可以马上让你挂到专家号,可以你得出5000RMB,就这样你通过黄牛挂到了这个专家的号。
计算机世界中的优先队列
上面我们花了大段文字讲了排队这件事情,其实我今天谈到话题就是数据结构中的优先队列,听起这个名字其实和队列有点不一样。普通队列是先到先得,先进先出,而优先队列出队列和入队的顺序无关,和优先级有关,可能最后一个入队的元素会最先出队
优先队列的实现
优先队列从底层来说还是一个队列,和普通队列在实现并没有太多的差别,唯一差别比较大的可能就是入队(enqueue) 和出队(dequeue)不一样,可以直接使用以前用到的队列接口,不一样的地方就是在接口的实现上。比如出队的元素不是入队最早的元素,而是优先级最高的元素最先出队
优先队列的底层实现方案
对于优先队列的底层实现,可以使用不同的数据结构,比如使用链表、数组这样的线性结构,也可以使用二叉树这样的树型结构
方案 | 入队 | 出队(最大元素) |
---|---|---|
普通线性结构 | O(1) | O(n) |
顺序线性结构 | O(n) | O(1) |
堆 | O(logn) | O(logn) |
从上面的图中我们可以看到普通的线性结构、顺序线性结构总有一个的时间复杂度是O(n),顺序线性结构确实维护了一个有序的数据,取出最大元素复杂度在O(1),但是为了维持这个循序不得不遍历所有的元素来插入一个新的元素。 如果我们采用堆来实现优先队列,情况会好很多,入队出队复杂度都在O(logn),即便在最差的是否复杂度也是O(logn)
总结
自己最近在学习数据结构,对数据结构应该怎么学习不知道,一点点的敲代码,码字,写文章,我觉得比我之前学了就忘恐怕要好一些,至少不会忘记的那么快,还可以整理一下思路,在学完这个课程后,可以回过头来复习一下,看看自己有没有用心学习,学的怎么样。 一开始在写的时候句子难免有些不通顺的地方,我也在一点点的改进,争取一节课一篇文章,把学习的过程记录下来。 下篇文章将介绍使用堆实现的优先队列