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