经典白话算法之优先级队列

<1>概念

优先级队列,顾名思义,就是一种根据一定优先级存储和取出数据的队列。它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序。优先级队列是堆的一种常见应用。有最大优先级队列(最大堆)和最小优先级队列(最小堆)。优先级队列是一种维护有一组元素构成的集合S的数据结构。

<2>优先队列支持的基本运算

[cpp] view
plain
copy

  1. //建立一个保存元素为int的优先级队列,其实是建了一个小顶堆
  2. //但是请特别注意这样的建的堆默认是大顶堆,即我们从堆顶去的元素是整个堆中元素最大的。
  3. priority_queue<int> Heap;
  4. //可以这样建一个表示小顶堆的优先级队列
  5. priority_queue<int , vector<int>, greater<int> > Heap;
  6. //将元素x放入优先级队列中
  7. Heap.push(x);
  8. //取出优先级队列第一个元素(堆顶元素),保存在x中
  9. int x = Heap.top();
  10. //弹出堆顶元素,取出后堆会自动调整为一个最小堆(最大堆)
  11. Heap.pop();
  12. //判断是否为空
  13. Heap.empty();
  14. //头文件
  15. #include<queue>

<3>自定义优先级

添加元素为结构体需要重载‘<‘

[cpp] view
plain
copy

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<queue>
  4. using namespace std;
  5. struct Node
  6. {
  7. //值
  8. int value;
  9. //编号
  10. int key;
  11. //重载操作符
  12. friend bool operator < (Node node1,Node node2)
  13. {
  14. //最大优先队列
  15. return node1.value < node2.value;
  16. }
  17. /*
  18. 不要重载这个‘>‘只重载‘<‘
  19. friend bool operator > (Node node1,Node node2)
  20. {
  21. return node1.value > node2.value;
  22. }
  23. */
  24. };
  25. struct Node2
  26. {
  27. //值
  28. int value;
  29. //编号
  30. int key;
  31. //重载操作符
  32. friend bool operator < (Node2 node1,Node2 node2)
  33. {
  34. //最小优先队列
  35. return node1.value > node2.value;
  36. }
  37. };
  38. int main(){
  39. int i;
  40. //实例一 结构体1
  41. Node b[5];
  42. b[0].value = 6; b[0].key = 1;
  43. b[1].value = 9; b[1].key = 2;
  44. b[2].value = 2; b[2].key = 3;
  45. b[3].value = 8; b[3].key = 4;
  46. b[4].value = 1; b[4].key = 5;
  47. //最大优先队列
  48. priority_queue<Node> Heap;
  49. //入队列
  50. for(i = 0;i < 5;i++){
  51. Heap.push(b[i]);
  52. }
  53. printf("最大优先队列:\n");
  54. //出队列
  55. for(i = 0;i < 5;i++){
  56. printf("key:%d value:%d\n",Heap.top().key,Heap.top().value);
  57. Heap.pop();
  58. }
  59. //实例二 结构体2
  60. Node2 b2[5];
  61. b2[0].value = 6; b2[0].key = 1;
  62. b2[1].value = 9; b2[1].key = 2;
  63. b2[2].value = 2; b2[2].key = 3;
  64. b2[3].value = 8; b2[3].key = 4;
  65. b2[4].value = 1; b2[4].key = 5;
  66. //最大优先队列
  67. priority_queue<Node2> Heap2;
  68. //入队列
  69. for(i = 0;i < 5;i++){
  70. Heap2.push(b2[i]);
  71. }
  72. printf("最小优先队列:\n");
  73. //出队列
  74. for(i = 0;i < 5;i++){
  75. printf("key:%d value:%d\n",Heap2.top().key,Heap2.top().value);
  76. Heap2.pop();
  77. }
  78. return 0;
  79. }

注意:

[cpp] view
plain
copy

  1. struct Node
  2. {
  3. //值
  4. int value;
  5. //编号
  6. int key;
  7. friend bool operator > (Node node1,Node node2)
  8. {
  9. return node1.value > node2.value;
  10. }
  11. };

这样会报错。因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

具体实例:点击打开链接

看病要排队

搬水果

经典白话算法之优先级队列,布布扣,bubuko.com

时间: 2024-10-10 04:10:34

经典白话算法之优先级队列的相关文章

经典白话算法之归并排序

void Merge(int A[],int p,int q,int r){ int i,j,k; //计算子数组A[p..q]的元素个数 int n1 = q - p + 1; //计算子数组A[q+1..r]元素个数 int n2 = r - q; //创建子数组L,R int* L = (int*)malloc(sizeof(int)*(n1+1)); int* R = (int*)malloc(sizeof(int)*(n2+1)); //将子数组A[p..q]赋值到L数组 for(i

经典白话算法之快速排序

[分析] [伪代码] [运行过程] [代码] /********************************* * 日期:2014-04-01 * 作者:SJF0115 * 题目:快速排序 **********************************/ #include <iostream> #include <stdio.h> using namespace std; //对子数组array[p...r]就地重排 int Partition(int array[],i

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

经典白话算法之中缀表达式和后缀表达式

一.后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储. 假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下: (1)遍历表达式,遇到的数字首先放入栈中,依次读入6 5 2 3 此时栈如下所示: (2)接着读到"+",则从栈中弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中. (3)然后读到8(数字入栈),将其直接放入栈中. (4)读到"*",弹出8和5,执行8*5,并将结果40压入栈中

初学图论-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

java数据结构与算法值优先级队列

一.优先级队列 什么是优先级队列:优先级队列是一种比栈和队列更加常用的一种数据结构.在优先级队列中,数据项按照关键字的值有序.数据项插入到队列中时,会按照顺序插入到合适的位置,用来保证队列的顺序. 生活中的例子,假设你有若干封件,你最急需要处理的文件就放在所有邮件的 顶部,如果不急需处理的文件就放放在下面. 参考代码: package edu.structure.queue; public class PriorityQ { private int maxSize; private int[]

经典白话算法之二叉树各种遍历

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,如果其终端

经典白话算法之堆排序

前序: (二叉)堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.树中每个节点与数组中存放该节点值的那个元素对应. 树的每一层都是填满的,最后一层除外. 树的根为a[1] (在这里是从1开始的,也可以从0开始),给定了某个节点的下标i,其父节点为i/2,左二子为2*i,右儿子为2*i+1. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时

浅谈算法和数据结构: 五 优先级队列与堆排序

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