其他分享
首页 > 其他分享> > 学习笔记—堆

学习笔记—堆

作者:互联网

堆学习笔记

一、何为堆

  堆(Heap)是一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看做一棵完全二叉树的数组对象。通常分为大顶堆(降序数组)和小顶堆(升序数组)

二、实现方法及基本操作

1.如何定义

  STL中堆可以用优先队列实现(使用时要加头文件),即 priority_queue<typename> name; 其默认为大顶堆,其大小顶堆的展开书写方式为 

    priority_queue<typename,vector<typename>,less<typename> > name;大顶堆(默认) 
  priority_queue<typename,vector<typename>,greater<typename> > name;小顶堆
  其中typename处填数据类型(可为自定义的结构体或pair)name处填堆的名字
2.基本操作
  设我们定义了一个优先队列为q,则:
  q.push(x);向堆中添加元素x
  q.pop();删除堆顶元素
  q.top();访问堆顶元素
  q.empty();判断是否为空,是返回1否返回0
三、经典例题
  1.P1631 序列合并传送门

    题目描述

      有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个。

    输入格式

      第一行一个正整数N;

      第二行N个整数A_iAi​, 满足A_i\le A_{i+1}Ai​≤Ai+1​且A_i\le 10^9Ai​≤109;

      第三行N个整数B_iBi​, 满足B_i\le B_{i+1}Bi​≤Bi+1​且B_i\le 10^9Bi​≤109.

      【数据规模】

      对于50%的数据中,满足1<=N<=1000;

      对于100%的数据中,满足1<=N<=100000。

    输出格式

      输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。

    输入输出样例

    输入

3
2 6 6
1 4 8

    输出

3 6 7

  分析

    看数据这是一道水题,思路暴力加优化加堆排序

    上代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+5;
ll a[N],b[N],n;//记得开long long
priority_queue<ll> q;//大顶堆
int main(){
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)cin>>b[i];
    sort(a,a+n);
    sort(b,b+n);
//先升序排一边,便于优化 for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(q.size()==n){//在已满n个是判断 if(q.top()<=a[i]+b[j])break;如相加大于已有的n个中最大的结束循环,因为后面的循环一定比前面的大 } q.push(a[i]+b[j]);//没满n个或现在的和小于之前n个中最大的话,入堆 if(q.size()>n)q.pop();//将多余n个的移除 } } for(int i=n-1;i>=0;i--){ a[i]=q.top(); q.pop();
     //因为是大顶堆但题目要求要从小到大,所以倒存一边 } for(int i=0;i<n;i++)cout<<a[i]<<" "; return 0; }

  如有错误,欢迎指出

标签:priority,le,name,int,queue,long,学习,笔记
来源: https://www.cnblogs.com/2009cqr/p/16475868.html