Peter算法小课堂—二叉堆(优先队列)

2024-01-29 04:04

本文主要是介绍Peter算法小课堂—二叉堆(优先队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

课前小视频:(7 封私信 / 62 条消息) 看动画,学算法,C++实现建立二叉堆,优先队列和堆排序的基础 - 知乎 (zhihu.com)

二叉堆(优先队列)

大家想想,什么数据结构能做到插入(删除)一个数、询问最小(大)值、 删除最小(大)值,时间复杂度最小。答案是:二叉堆!

那么,我们介绍一下二叉堆。看下图。

堆的定义

int h[MAXN],n;//用数组模拟堆

堆的插入

首先将元素x放到堆中的最后一个位置(即最底层最右边的位置),然后不断地把x往上调整,直到x调不动为止(即大于现在的父亲,或者x处于根节点)。

void up(int k){while(k>1){int i=k/2;if(h[k]<h[i]){swap(h[k],h[i]);k=i;}else break;}
}

堆的删除

具体方法:

void down(int k){while(k+k<=n){int i=k+k;if(i+1<=n&&h[i+1]<h[i]) i++;if(h[i]<h[k]){swap(h[i],h[k]);k=i;}else break;}
}

堆的插入/删除

void add(int x){++n;h[n]=x;up(n);
}
void del(int pos){swap(h[pos],h[n]);--n;up(pos);down(pos);
}

STL

优先队列STL:

大根堆:priority_queue

小根堆:priority_queue(int ,vector(int),greater(int)) p;

用法:p.top();p.push();p.pop();p.size();p.empty();

题目

1.给定 n个整数,用要求的排序方法(堆排序、归并排序)进行从大到小的排序。

#include <bits/stdc++.h>
using namespace std;
int n,a[100009],b[100009],k=1;
priority_queue<int> p;
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];p.push(a[i]);}for(int i=1;i<=n;i++){int a=p.top();p.pop();b[k]=a;k++;}for(int i=1;i<=n;i++){cout<<b[i]<<endl;}return 0;
}

2.

小明在玩一个数字游戏。游戏规则是这样的,一开始小明那里一个数字也没有,然后他会接受 2 种指令,根据这 2 种指令执行操作,并且回答其中的 q 指令。

2 种指令如下:

a X Y,表示增加一个数字 X,数字 X 的价值是 Y

q,查询目前最小的数字,并且把这个数字删除。如果存在多个数字相同的,删除价值最大的那个。

#include <bits/stdc++.h>
using namespace std;
int n,x,y;
char op[10];
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > pq;
int main()
{scanf("%d",&n);while (n--) {scanf("%s",op);if (op[0]=='a') {scanf("%d%d",&x,&y);pq.push(make_pair(x,-y));} else {pii p=pq.top(); pq.pop();printf("%d %d\n",p.first,-p.second);}}return 0;
}

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

#include <bits/stdc++.h>
using namespace std;
struct A {int v,id;bool operator > (const A& a) const {return v>a.v;}
};
int n,m,a[100010],b[100010],c[100010];
priority_queue<A,vector<A>,greater<A> > pq;
int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;++i) scanf("%d",&a[i]);for (int i=1;i<=n;++i) scanf("%d",&b[i]);sort(b+1,b+1+n);for (int i=1;i<=n;++i) c[i]=1;for (int i=1;i<=n;i++) pq.push((A){a[i]+b[c[i]],i});for (int i=1,v,id;i<=m;i++) {v=pq.top().v; id=pq.top().id; pq.pop();printf("%d\n",v);if (++c[id]<=n)pq.push((A){a[id]+b[c[id]],id});}return 0;
}

希望这些对大家有用,三连必回

这篇关于Peter算法小课堂—二叉堆(优先队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/655678

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig