优先队列 订阅
优先队列(priority queue)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。 展开全文
优先队列(priority queue)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。
信息
类    型
数据结构
定    义
一种先进先出的数据结构,元素在队列尾追加,而从队列头删除
实现方式
通常采用堆数据结构
中文名
优先队列
外文名
priority queue
特    点
元素被赋予优先级
优先队列定义
例如右图:任务的优先权及执行顺序的关系 优先队列的类定义优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min priority queue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.最大优先权队列的抽象数据类型描述下所示,最小优先队列的抽象数据类型描述与之类似,只需将最大改为最小即可.ADT 最大优先队列的抽象数据类型描述抽象数据类型pascal 版本优先队列
收起全文
精华内容
下载资源
问答
  • 优先队列

    千次阅读 2021-02-12 09:11:50
    优先队列 优先队列可以完成以下操作: 插入一个数值 取出最小的数值(获得数值,并且删除) 在之前的堆排序,我们已经初步引出了优先队列的概念。 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素...

    本文摘自博客,欢迎前往博客以获得更好的体验。

    优先队列

    优先队列可以完成以下操作:

    • 插入一个数值
    • 取出最小的数值(获得数值,并且删除)

    在之前的堆排序,我们已经初步引出了优先队列的概念。

    优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。

    声明方式

    priority_queue <int> q;
    priority_queue <double> q;
    
    priority_queue <node> q;
    priority_queue<int, vector<int>, cmp>q; 
    
    priority_queue <int,vector<int>,greater<int> > q;
    priority_queue <int,vector<int>,less<int> >q;
    

    排序特性

    自动排序

    在堆排序文章里,我们了解到的是优先队列的最普通形式,按从大到小排列。

    但是,日常的使用时,我们总不可能一直使用从大到小的排列方式吧?那我们应该怎么办呢?

    自定义优先级

    无论是C的qsort,还是C++的sort,我们都可以使用cmp函数来自定义排序规则。那么,在优先队列中,是否也可以使用cmp函数呢?

    答案是肯定的。

    bool cmp(int a,int b){
        return a < b;
    };
    priority_queue<int, vector<int>, cmp>q;
    

    less和greater优先队列

    //从大到小
    priority_queue <int,vector<int>,less<int> > q;
    //从小到大
    priority_queue <int,vector<int>,greater<int> > q;
    
    

    结构体重载

    //operator< 重载
    struct node{
    	  int x,y;
    	  bool operator < (const node & a) const{
    	    	return x < a.x;
    	  }
    };//y为值, x为优先级。
    priority_queue <node> q;
    
    //operator< 重载
    struct node {     
      int x, y;     
      bool operator < (node a, node b){         
        return a.x > b.x;    //结构体中,x小的优先级高     
      }
    }; //y为值, x为优先级。
    priority_queue<node>q;   //定义方法
    

    例题

    合并果子

    在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

    每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n1n-1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

    因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 11 ,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

    例如有 33 种果子,数目依次为 112299 。可以先将 1122 堆合并,新堆数目为 33 ,耗费体力为 33 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 1212 ,耗费体力为 1212 。所以多多总共耗费体力 =3+12=15=3+12=15 。可以证明 1515 为最小的体力耗费值。

    这是一道典型的优先队列题目。

    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    long long m,n,sum;
    priority_queue<int,vector<int>,greater<int> >q;
    
    int main(){
        ios::sync_with_stdio(false);
        cin >> n;
        for(int i = 0;i < n;i++) cin >> m,q.push(m);
        for(int i = 1;i < n;i++){
            m = q.top();
            q.pop(),
            m += q.top();
            q.pop();
            sum += m;
            q.push(m);
        }
        cout << sum << "\n";
    
        return 0;
    }
    

    更多[优先队列题目](https://blog.csdn.net/Sky_River_Z/article/details/113826348)
    单调队列

    展开全文
  • 优先队列优先队列优先队列 那么,优先队列又是什么样子呢?   优先队列不再遵循先入先出的原则,而是分为两种情况:   最大优先队列,无论入队顺序,当前最大的元素优先出队。 最小优先队列,无论入队顺序,...

    优先队列优先队列优先队列

    那么,优先队列又是什么样子呢?

     

    优先队列不再遵循先入先出的原则,而是分为两种情况:

     

    最大优先队列,无论入队顺序,当前最大的元素优先出队。

    最小优先队列,无论入队顺序,当前最小的元素优先出队。

     

    比如有一个最大优先队列,它的最大元素是8,那么虽然元素8并不是队首元素,但出队的时候仍然让元素8首先出队:

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,309
精华内容 13,723
关键字:

优先队列