(转加整理)优先队列

队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部。

priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级。这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。标准库默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载 < 操作符。每次从队列中取出的是具有最高优先权的元素。优先队列的效率:其时间复杂度为O(logn).n为队列中元素的个数,存取都需要消耗时间。

1) 优先队列的定义

包含头文件:#include<functional> #include<queue>

可以使用具有默认优先级的已有数据结构;也可以再定义优先队列的时候传入自定义的优先级比较对象;或者使用自定义对象(数据结构),但是必须重载好< 操作符。

2) 优先队列的常用操作

优先级队列支持的操作

q.empty()         如果队列为空,则返回true,否则返回false

q.size()            返回队列中元素的个数

q.pop()             删除队首元素,但不返回其值

q.top()             返回具有最高优先级的元素值,但不删除该元素

q.push(item)     在基于优先级的适当位置插入新元素

#include<iostream>
#include<functional>
#include<queue>
#include<vector>
using namespace std;

//定义比较结构
struct cmp1{
    bool operator ()(int &a,int &b){
        return a>b;//最小值优先
    }
};

struct cmp2{
    bool operator ()(int &a,int &b){
        return a<b;//最大值优先
    }
};

//自定义数据结构
struct number1{
    int x;
    bool operator < (const number1 &a) const {
        return x>a.x;//最小值优先
    }
};
struct number2{
    int x;
    bool operator < (const number2 &a) const {
        return x<a.x;//最大值优先
    }
};
int a[]={14,10,56,7,83,22,36,91,3,47,72,0};
number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};
number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};

int main()
{
    priority_queue<int>que;//采用默认优先级构造队列

    priority_queue<int,vector<int>,cmp1>que1;//最小值优先
    priority_queue<int,vector<int>,cmp2>que2;//最大值优先

    priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,
    priority_queue<int,vector<int>,less<int> >que4;////最大值优先

    priority_queue<number1>que5; //最小优先级队列
    priority_queue<number2>que6;  //最大优先级队列

    int i;
    for(i=0;a[i];i++){
        que.push(a[i]);
        que1.push(a[i]);
        que2.push(a[i]);
        que3.push(a[i]);
        que4.push(a[i]);
    }
    for(i=0;num1[i].x;i++)
        que5.push(num1[i]);
    for(i=0;num2[i].x;i++)
        que6.push(num2[i]);

    printf("采用默认优先关系:/n(priority_queue<int>que;)/n");
    printf("Queue 0:/n");
    while(!que.empty()){
        printf("%3d",que.top());
        que.pop();
    }
    puts("");
    puts("");

    printf("采用结构体自定义优先级方式一:/n(priority_queue<int,vector<int>,cmp>que;)/n");
    printf("Queue 1:/n");
    while(!que1.empty()){
        printf("%3d",que1.top());
        que1.pop();
    }
    puts("");
    printf("Queue 2:/n");
    while(!que2.empty()){
        printf("%3d",que2.top());
        que2.pop();
    }
    puts("");
    puts("");
    printf("采用头文件/"functional/"内定义优先级:/n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)/n");
    printf("Queue 3:/n");
    while(!que3.empty()){
        printf("%3d",que3.top());
        que3.pop();
    }
    puts("");
    printf("Queue 4:/n");
    while(!que4.empty()){
        printf("%3d",que4.top());
        que4.pop();
    }
    puts("");
    puts("");
    printf("采用结构体自定义优先级方式二:/n(priority_queue<number>que)/n");
    printf("Queue 5:/n");
    while(!que5.empty()){
        printf("%3d",que5.top());
        que5.pop();
    }
    puts("");
    printf("Queue 6:/n");
    while(!que6.empty()){
        printf("%3d",que6.top());
        que6.pop();
    }
    puts("");
    return 0;
}
/*
运行结果 :
采用默认优先关系:
(priority_queue<int>que;)
Queue 0:
83 72 56 47 36 22 14 10  7  3

采用结构体自定义优先级方式一:
(priority_queue<int,vector<int>,cmp>que;)
Queue 1:
 7 10 14 22 36 47 56 72 83 91
Queue 2:
83 72 56 47 36 22 14 10  7  3

采用头文件"functional"内定义优先级:
(priority_queue<int,vector<int>,greater<int>/less<int> >que;)
Queue 3:
 7 10 14 22 36 47 56 72 83 91
Queue 4:
83 72 56 47 36 22 14 10  7  3

采用结构体自定义优先级方式二:
(priority_queue<number>que)
Queue 5:
 7 10 14 22 36 47 56 72 83 91
Queue 6:
83 72 56 47 36 22 14 10  7  3
*/

  

时间: 2024-10-05 05:57:46

(转加整理)优先队列的相关文章

info grep半翻译加整理

内容来源基本上是整理info grep而来,当然只整理了关于用法的部分.有些地方给出了些解释,算是对grep的一个细节概述吧. 1.1 grep选项 grep家族:grep -G或者grep使用基本正则表达式:grep -E或者egrep使用扩展正则表达式:grep -F或者fgrep使用固定字符串进行匹配,不使用正则表达式进行匹配,速度很快. grep [options] pattern [file...] 1.1.1 关于匹配类型选项 -G:使用基本正则表达式,即默认的.所以一般都会省略该选

面向互联网的文本信息处理,语音和音乐搜索技术的发展现状【搜集资料时学习所得,未详加整理】

Speech recognition: Key Words: Distributed Speech Recognition(DSR 将嵌入式语言识别系统的识别功能架构在服务器上[并非是指分布式服务器,而是指终端与服务器属于分布式关系[8]]) Network Speech Recognition(NSR 重点在于网络,终端高效实时传输语音信号,服务器处理[9]).当下都是终端语音信号由服务器/云来做处理. Emotion Speech Recognition(ESR), Spoken Infor

HDU 5638 拓扑排序+优先队列

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序的算法稍微改一下,如果某个顶点的入度小于k也把它加到优先队列里面去. k减小后队列里面会有些点不满足<=k,直接踢出来就好了. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<

HDU 4857 逃生 (优先队列+反向拓扑)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 解题报告:有n个点,有m个条件限制,限制是像这样的,输入a  b,表示a必须排在b的前面,如果不能确定两个数谁排在前面则尽量把小的排在前面. 首先把出度为0的点加入到优先队列中,然后每次用优先队列中弹出的点去更新其它点的出度,更新的同时如果又有其它点的出度为0的话又加到优先队列中, 最后按照从优先队列中出队的反序输出就可以了.我还是不懂为什么按照入度为0然后加入到优先队列然后正序输出这样为什么

机器学习基础(一)

之前学习了Cousera上华盛顿大学的机器学习课程,近期准备整理当时的学习笔记.本篇总结是基于该专项课程中第一篇的内容 分类算法: 1.分类算法实际用途:情感分析等,比如分析餐馆的评论,根据某个人的评论内容推测他对餐馆的评分:又如根据网页文本预测网页标签(如金融,教育,科技等) 垃圾邮件过滤(Spam filtering). 图片分类 情感分析线性分类器: 比如我们为某个APP构建一个简单的评论分类器,预测某个评论是积极还是消极,算法伪代码如下: if(评论中词性为正的数量>评论中词性为负的数量

1153 - Keep the Customer Satisfied(贪心)

又是一道经典的贪心算法题目 . 乍看题目,想到了紫书一开始讲的区间问题(给定一些区间,选择尽可能多的不相交区间),和另一个经典问题:"活动安排"  的实质是一样的. 但是本题又和区间问题不同,因为区间起点未知,我们所知道的仅仅是等待时间和截至时间,但是其实贪心思想是一致的,即:尽可能的给后面的人留下更多时间,满足当前所用时间最少. 因此可以写出贪心算法 : 按照截至时间排序,将元素的消耗时间加到优先队列里,这样队首元素就是消耗时间最长的人,如果加上当前的人时间超过了他的截至时间,那么将

Ignatius and the Princess I

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 114 Accepted Submission(s): 71   Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero

Java基础复习(1) 为什么在java中我们要将main定义为一个static方法?

2015-10-20 以前学习java知识,只是跟着用到的代码跳着学了些,学的不全还错漏成片……恩,好惨! 思来想去,是必须要好好复习加整理下,不然写出来的东西真没法读了.所以,就从今儿起一点一点的啃下去吧. 回头创建了Class文件,又看到了熟悉的main函数……然后,有了标题的问题.那么,今天就回顾这个问题吧. 1 public class Review_p2 { 2 public static void main(String[] args) { 3 byte b = 3; 4 5 byt

filter_var() 验证邮箱、ip、url的格式 php

验证邮箱格式的正确与否:你的第一解决方案是什么呢? 不管你们怎么思考的:反正我首先想到的就是字符串查找看是否有@符号: 但是对于结尾的.com或者.net 亦或者.cn等等越来越多的域名验证感觉棘手: 直到了某一天认真的研究了filter_var()函数的参数: 我对以前走马观花式的阅读php文档表示深深的惭愧: 其实filter_var()第二个参数传FILTER_VALIDATE_EMAIL即可验证邮箱.略加整理就如下: /** * 验证是否是邮箱 * @param  string  $em