ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

中级数据结构——堆

2019-09-25 09:36:56  阅读:318  来源: 互联网

标签:priority 中级 int 队首 pop queue push 数据结构


堆的定义

(heap)(heap)(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质

  • 堆中某个节点的值总是不大于或不小于其父节点的值

  • 堆总是一棵完全二叉树

下面是堆的图片:


我们再插入一个数000

堆的实现

由于代码实现过于麻烦,且不好调试,故此处只放STLSTLSTL实现的堆(其实是优先队列)

priority_queue<int> q;                               //队首是较大的数
priority_queue<int,vector<int>,greater<int> > q;     //队首是较小的数,注意空格

或者如果想实现队首是较小的数但忘记了第二种写法,那么这里还有一种解决方案:用第一种写法,然后把负值压入该队列,取出时再取负值即可。

priority_queue<int> q;
q.push(-a);
int ans=-q.top();
q.pop();
cout<<ans<<endl;

一些常用函数

q.push(a);   //插入
q.pop();     //出队
q.front();   //取队首
q.clear();   //清空

重载运算符

如果想将一个结构体放入优先队列,那么我们需要重载运算符。

struct node{
   int x,y;
   bool operator < (const node &m){
       return x<m.x;
   }
};
priority_queue<node> q;

典例

NOIP2004合并果子

#include<bits/stdc++.h>
using namespace std;
int n,x,ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>x,q.push(x);
    while(q.size()>=2){
        int a=q.top(); q.pop();
        int b=q.top(); q.pop();
        ans+=a+b;
        q.push(a+b);
    }
    cout<<ans<<endl;
    return 0;
}

标签:priority,中级,int,队首,pop,queue,push,数据结构
来源: https://blog.csdn.net/wljoi/article/details/101344347

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有