优先级队列(priority queue)屌丝版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cadi2011/article/details/52558608

1、队列(queue)想必大家已经知道了,是一种先进先出的思想,在英国人眼里就是line(排),而我们的中文 排队,我想大概也就是这么翻译过来的(斗胆猜一下,前辈勿怪)

2、优先级队列(priority queue),可以说是一种特殊的队列,其实就是每个元素经过排序的队列(queue),首先它也是只有一个队头和一个队尾,当然是也从队头delete,从队尾insert,优先级队列(priority queue)最重要的特点就是:是按照元素的规则(你来制定)进行了排序,每次插入或者移除的时候可以进行排序,这样就保证队头每次都指向的是最高级别或者最低级别的元素(看你排序是升序还是降序了)。

别称:有序队列,有序队列,有序队列

3、书中形象的使用了日常生活中的收到的信件做了比喻,你有一堆信件,最上面的是最优先要处理的,也就是队头,压在最下面的就是最后要处理的,就是队尾。还是插图,比较形象,每次插入新的信件时,当然是从队尾插了,只不过作了排序,就是任意位置插入了(除了队头)

4、上代码了,我们在普通队列(queue)中进行改造,就不加入到循环队列(loop queue)中了,而且是降序的优先级队列(priority queue),每次插入的元素,都要与原来的元素进行对比,已找到合适的位置,所以插入很慢, 删除快(废话,都是队头删,能不快吗),而且仍然使用数组作为存储结构哦

5、我去,终于谈到了优先级队列的插入,每次插入的时候,都要与原来的元素进行对比,然后找到合适的位置,放入元素,所以插入时慢一些,因为每次都要把元素做一个对比

6、有一个好问题:优先级队列是插入的时候排序,还是移除的时候排序?什么时候对元素排序,让当前的队列一直保持有序状态呢?这里指的是常规的双向链表实现的优先级队列

答:如果是插入的时候排序,那么每次插入的话,效率稍微差点(因为每次插入一个元素,就要做排序),如果是移除的时候再去排序,那么插入的元素都先暂放在队列尾部,等要移除队列头部,即队头元素的时候,再把每个插入的元素逐个(只要没排序的)都进行一次排序,那么只要有没有排序的元素存在,移除就会变慢了,不过排序完成后,队头移除的时间复杂度仍为O(1)

7、优先级队列的数据结构使用,首先可以用链表(双向链表,双向循环链表),另外就是用二叉排序树(当然底层是用的链表,这个我后面要认真总结)

8、优先级队列,还有个美丽的名字,叫做有序队列,而且需求中,经常会用到这个数据结构,非常重要。。

9、上文部分内容是我摘抄的书籍,有谈到使用数组实现的有序队列、也有链表的实现的有序队列,还有二叉排序树实现的有序队列

priority queue

猜你喜欢

转载自blog.csdn.net/cadi2011/article/details/52558608