关于优先级队列的实现

1.为何要实现优先级队列这种数据结构

    考虑实际中的问题,某个夜间门诊只有一个接诊医生,在接诊病人时的次序自然是按照队列的FIFO(先进先出)的原则进行实行。但是这是有一个伤口出血的病人自然是要比平常感冒的病人要先被接诊,而相对于一个心脏病突发的病人更是需要把他放置在更高的优先级。

    在计算机系统中,运行程序也是遵循某个优先级关系。在一批待处理的进程中,系统总是将优先级更高的进程优先传递给CPU进行处理。

    这些问题都需要运用到优先级队列这种数据结构。

2.优先级队列所要实现的基本接口

  

  根据以上接口,可知要实现的三种方法要控制在一个良好的复杂度。

   1.若采用向量vector来实现优先级队列

    其插入可以采用在尾部插入的vector::put_back(const T& e)  -  复杂度为O(1)

    其get_max需要遍历整个向量才能得出最高优先级词条  -  其复杂度为O(n)

    而del_max则更是需要get_max后再进行删除 - 其复杂也可达O(n)

  2.若采用有序的向量sorted_vector来实现优先级队列

    固然其查找和删除都可以在向量的尾部进行 - 其复杂度仅仅只有O(1)

    但是其插入操作为了保证有序插入 - 需要进行二分查找(O(logn)) - 而插入操作涉及元素的移动也可达O(n)复杂度

  3.若采用链表list进行实现优先级队列

    其插入操作固然可以达到O(1)

    但是其get_max和del_max接口都需要对最高优先级的元素进行查找,其复杂度都可达O(n)

    ----------------即使采用有序化的链表

    其get_max接口和del_max接口都可在把首节点设为最高优先级的情况下,复杂度为O(1)

    但是其插入操作则不得在有序的查找下进行O(n) + O(1) - O(n)复杂度

  4.继而考虑采用平衡二叉搜索树(BBST) - AVL树、splay树、red_black树

    可以相信其三种操作都是可以在O(logn)复杂度下实现

    但是优先级队列只需维护队列中优先级最高的元素即可 - BBST则需要维护这种全序,未免显得有些杀鸡用牛刀

3.以上实现方法都不能在效率和成本上比较好的实现,考虑采用—以向量为形,完全二叉树为神—来实现优先级队列

  3.1 完全二叉树

    从根节点到倒数第二层构成的是一个满二叉树(2^h-1 - 1个节点),最后一层可能不满

    也可看作平衡因子非负的AVL树,平衡因子为0,左子树为满二叉树时 // 平衡因子为1,右子树为满二叉树时

   3.2 向量之形

    其存储的形式是以一个动态分配的可扩充数组来实现的,将有20个节点的完全二叉树存储为向量其对应形式可视为:

      

  3.3 完全二叉树之神

    根据宏定义可将向量中秩所对应的元素确定子父关系

      #define Parent(i) ( ( ( i ) - 1 ) >> 1 );  //某个节点的父亲的秩必为其( rank - 1 )/ 2

      #define Lchild(i) ( 1 + ( ( i ) << 1 ) );  //某个节点存在左孩子其左孩子的秩为其 ( rank * 2 ) + 1  - 为奇数

      #define Rchild(i) ( ( 1 + ( i ) ) << 1 );  //某个节点存在右孩子其右孩子的秩为其 ( rank + 1  ) * 2 - 为偶数

   为了对优先级队列中优先级高的词条进行快速处理,规定完全二叉树还要满足堆序性

          即其H( i )  <=  H( Parent( i ) )  -   从而保证最大元始终在根节点处  - 即向量中秩为0所对应的词条

  

原文地址:https://www.cnblogs.com/exhina/p/12368988.html

时间: 2024-08-30 11:09:01

关于优先级队列的实现的相关文章

Rabbitmq中的优先级队列操作

1.%% 普通队列操作 in(X, 0, {queue, [_] = In, [], 1}) ->{queue, [X], In, 2}; in(X, 0, {queue, In, Out, Len}) when is_list(In), is_list(Out) -> {queue, [X|In], Out, Len + 1}; 优先级队列操作: in(X, Priority, Q = {queue, [], [], 0}) -> in(X, Priority, {pqueue, []

初学算法-基于最小堆的优先级队列C++实现

笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出! 在实现优先级队列时,笔者表示萌萌哒没有用过template写派生类,结果写完了出现error: *** was not decleared in this scope..后来各种补上this->才完事,在CSDN(笔者的帖子地址? http://bbs.csdn.net/topics/391806995)上提问后才知道是模板参数依赖,笔者表示涨姿势了.. /**  * The Minimum Heap Class an

【转】java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

STL学习系列七:优先级队列priority_queue容器

1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一

优先级队列及小顶堆排序

优先级队列及小顶堆排序实现 /** @file          HeapSort.h *  @copyright     personal *  @brief         优先级队列及堆排序 *  @version       V1.0.0 *  @author        fangyuan *  @date          2015/12/31 *  @note          测试版本 */ #include "iostream" using namespace std

初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现

这一次,笔者使用了STL库中的优先级队列(Priority Queue)来完成Dijkstra算法中extract-min()语句(即从未选中的节点中选取一个距离原点s最小的点)的功能.由于优先级队列的插入.删除操作只需要logn的时间花费,因此降低了不少运行时间. 本文使用C++实现了这一基本算法.参考<算法导论>第24.3节. /**  * Dijkstra's Single Source Shortest Path Algorithm in C++  * Time Cost : O(Ml

STL之优先级队列priority_queue

摘要: priority_queue,自适应容器(即容器适配器):不能由list来组建: 最大值优先级队列(最大值始终在对首,push进去时候) 最小值优先级队列: 优先级队列适配器 STL  priority_queue priority_queue<int, deque<int> > pg; priority_queue<int, vector<int> > pg; STL中实现的方法: pg.empty(); pg.size(); pg.top();

队列的应用:优先级队列

优先级队列:如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了. 优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素(3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行. 以上是网上常见的对优先级队列的描述.偷

JAVA优先级队列测试

package code.test; import java.util.Comparator; import java.util.Iterator; import java.util.PriorityQueue; import java.util.Queue; /** * 实验表明,在java中: * 1.优先级队列打印或者迭代,得到的输出顺序为堆结构数组的顺序,大致有序但不完全保证顺序 * 2.由于堆排序是不稳定排序,在优先级相同的情况下,元素不会保持原来的顺序输出 * Created by

优先级队列与堆排序

转自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象.这种数据结构就是优先级队列(Pri