由题入手
给定一个数列,初始为空,请支持下面三种操作:
1.给定一个整数 x,请将 x 加入到数列中。
2.输出数列中最小的数,如果数列中没有数,输出0。
3.删除数列中最小的数(如果有多个数最小,只删除 1 个,如果数列中没有数,则忽略该操作)。
该题需要不停的找最小值,并且删除最小值,如果按照暴力做法,每次删除或者插入一个数,时间复杂度太大了,所以我们需要找到一种能够一直维护当前数组最大/最小值的数据结构,在C++中,就存在这样一种STL—优先队列。他和普通队列不一样的地方在于普通队列是根据编号来确定出入队顺序,而有限队列是根据我们给定的优先级来确定出队顺序,比如该题我们就应该把最小的值的优先级赋值为最大,这样每次最小的数就先出队,他的原理是一种二叉堆,我们暂时不用了解。
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。也可以理解为,当把一个元素插入优先队列的时候,他会按照指定的优先顺序把该元素按照优先级插入对应的位置。但是这种寻找合适位置的时间复杂度为O(log n)而不是O(n)。用到的是一种叫堆的数据结构。他的作用就是在有插入和删除元素的操作中快速地动态维护极值。
基础
头文件:
#include<queue>
创建:
priority_queue<int> q;
其他的都和普通队列一样
如果是使用stl库默认的优先队列,他是按照插入数的大小来确定优先级的,数字越大,优先级最高。数字越小,优先级越低
无论我们输入的序列是什么样子的,它出队的顺序都是按照序列的值从到大到小出队的
如果要按照从小到大排序,则需要重载小于运算符。
struct node{
int x;
friend bool operator < (node a,node b){
return a.x>b.x;
}
};
默认的优先队列是按照从大到小排列的,所以我们需要把小于运算符重载,在函数中,默认是a.x<b.x;我们把它重载a.x>b.x。也就是把大小顺序交换。
作者在这里建议就用上述的方法,因为这样在结构体中有多个元素的时候任然可以用
当然,如果只有一个数,也可以用下述方法
1.从大到小输出(默认)
priority_queue<int ,vector<int>,less<int> > q;
//less表示从大到小
2.从小到大输出
priority_queue<int ,vector<int>,greater<int> > q;
//greater表示从小到大
优先队列的作用就是快速的找到当前数组元素中的最大值或者最小值,并且可以直接取出最大值或最小值,注意,优先队列只能查找和取出最大值和最小值,不能访问其他队列中其他位置的值。

文章介绍了如何使用C++中的优先队列数据结构解决数列中插入、查找最小值和删除操作的问题,通过重载比较运算符实现按需排序,提高时间复杂度效率。

355

被折叠的 条评论
为什么被折叠?



