当前位置: 首页 > wzjs >正文

招聘网站模板页上海知名网站制作公司

招聘网站模板页,上海知名网站制作公司,做基因检测网站,web个人网站开发前引: 在算法竞赛中,选手们常常能在0.01秒内分出胜负;在实时交易系统中,毫秒级的延迟可能意味着数百万的盈亏;在高并发服务器中,每秒需要处理数万条不同优先级的请求——这些系统背后,都隐藏着同…

前引: 在算法竞赛中,选手们常常能在0.01秒内分出胜负;在实时交易系统中,毫秒级的延迟可能意味着数百万的盈亏;在高并发服务器中,每秒需要处理数万条不同优先级的请求——这些系统背后,都隐藏着同一种强大的数据结构:​优先队列(priority_queue)​作为C++标准库中最优雅的数据结构适配器,priority_queue完美封装了堆算法的高效性,却只需几行代码即可实现复杂优先级管理。本文将深入剖析:

(1)​堆原理与优先队列的机械美学​

(2)定制化优先级策略的高级技巧​

(3)实战性能对比与编译器级优化​

(4)在万亿级数据处理中的独特优势

目录

优先队列介绍

优先队列的渊源

实例化

插入元素

访问元素

获取元素个数

判断优先队列是否为空

删除堆顶元素

·

优先队列的模拟实现

类模板

插入元素

访问元素

获取元素个数

判断优先队列是否为空

删除堆顶元素

效果展示


优先队列介绍

优先队列priority_queue 是 C++ 标准模板库(STL)中的一个容器适配器,提供了堆数据结构的实现(默认为最大堆)。它在需要高效访问最大/最小元素的场景下非常有用!

如果需要使用小顶堆,可以这样传参 priority_queue< int , vector<int> , greater<int> > 

它是默认基于(大顶)堆实现的,例如一颗用数组存储的完全二叉树:

特点总结:

(1)采用数组形式存储

(2)默认基于最大堆实现

(3)适配器容器底层为 vector (使用需要包含#include<queue>) 

(4)每次只能访问队列顶部的元素,即优先级最高的元素

(5)复杂度:访问O(1)、插入O(log n)、删除顶部元素O(log n)

优先队列的渊源

我们通过 优先队列 的容器结构应该猜到,它的底层容器是 vector ,为什么不取名叫优先维克托呢

问:为什么底层容器是vector?

连续内存结构适合堆的随机访问需求,缓存友好,且动态数组支持高效尾部操作

问:为什么头文件是queue?

作为容器适配器,优先队列在概念上属于队列的一种,与queue共用同一头文件,体现了接口的一致性,比如队列的各种接口刚好吻合它的访问、插入、删除行为:

priority_queue --> "<queue>头文件" : 声明接口

问:为什么叫优先队列而不是优先维克托?

名称语义分解​:

优先(Priority):元素按内在重要性排序,而非插入顺序

队列(Queue):仅允许特定端点访问的操作模型(队尾插入,队首访问)

​行为本质​:

插入操作:push(),时间复杂度 O(log n)

访问操作:top(),总是获取优先级最高的元素

删除操作:pop(),移除当前最高优先级元素

实例化

采用:priority_queue<数据类型> 变量名;

我们可以选择默认初始化:

priority_queue<int> V1;

也可以选择范围初始化:

priority_queue<int> V2(arr,arr+n);
//或者用另一个容器去初始化
priority_queue<int> V3(V1.begin(),V1.end());

效果展示: 

插入元素

V.push(val);

访问元素

遵循堆的性质,只能访问堆顶元素

V.top();

获取元素个数

V.size();

判断优先队列是否为空

V.empty();

为空返回 true ;不为空返回 false

删除堆顶元素

V.pop();

优先队列的模拟实现

类模板

template<class T, class contain = vector<T>>
class priority_queue
{
public://构造可以不写,因为可以直接使用vector//函数实现
private:contain x;
}

既然底层是 vector,我们用缺省参数直接实例化出一个 vector 类型的变量就可以作为底层实现了

插入元素

插入元素调用vector的接口就行了,这里由于需要满足优先队列的性质(大顶堆),我们还需要在插入之后使用向上调整,保证堆顶(首元素)是最大的

插入元素:

//插入数据
void push(const T& date)
{x.push_back(date);//向上调整Upgrade(size() - 1);
}

向上调整:

//向上调整
void Upgrade(int child)
{//父节点int parent = (child - 1) / 2;//如果孩子节点大于父节点,就向上调整交换(根节点可能也需要调整)while (parent >= 0){//只要进入循环,那么节点下标一定是在合法范围if (x[child] > x[parent]){//交换swap(x[child], x[parent]);//更新孩子、父节点child = parent;parent = (child - 1) / 2;}elsebreak;}
}

这样经过向上调整就可以达到下面的效果:

访问元素

访问第一个元素即可(堆顶元素)

//访问元素
T top()
{return x[0];
}

获取元素个数

//计算元素个数
T size()
{return x.size();
}

判断优先队列是否为空

//判断是否为空
bool empty()
{return x.empty();
}

删除堆顶元素

这里的删除调用 vector的尾删即可。

删除的方法:先交换堆顶 和 尾部元素,再删除,再使用向下调整保证大顶堆的性质

//删除堆顶元素
void pop()
{Eliminate(size() - 1);
}

向下调整: 

//向下调整
void Eliminate(int child)
{//交换堆顶和末尾元素swap(x[child], x[0]);//去尾x.pop_back();//父子节点int parent = 0;child = 2 * parent + 1;//开始调整(子节点不能超过范围)while (child < x.size()){//如果右节点大于左节点if (x[child] < x[child + 1]){child++;}//如果父节点小于子节点if (x[parent] < x[child]){swap(x[parent], x[child]);//更新parent = child;child = 2 * parent + 1;}elsebreak;}
}

效果展示

void text1_t()
{priority_queue<int> V1;//插入元素V1.push(10);V1.push(15);V1.push(5);V1.push(20);V1.push(0);V1.push(25);//元素个数cout << V1.size() << endl;//访问堆顶元素cout << V1.top() << endl;//出堆顶元素V1.pop();//访问堆顶元素cout << V1.top() << endl;//判断是否为空cout << V1.empty() << endl;
}

                                                   【雾非雾】期待与你的下次相遇! 

http://www.dtcms.com/wzjs/324238.html

相关文章:

  • 网站建设业务前景营销策划书模板
  • 玩客云做网站品牌线上推广方案
  • 大学生兼职网站开发毕设论文杭州最专业的seo公司
  • 网站服务器ip地址在哪里看济南网络优化厂家
  • 太原做网站找谁网络视频营销策略有哪些
  • 学校网站群管理系统建设项目竞价出价怎么出
  • 深圳做网站的公司百度搜索引擎入口
  • 惠安网站建设报价seo优化软件有哪些
  • 网站建设模版中国软文网
  • 哪个网站可以做制图兼职软文是什么意思
  • 山西网站制作设计百度推广怎么收费标准
  • 建设外贸网站多少钱淘宝推广平台
  • 网上注册公司营业执照流程长沙seo运营
  • 网页制作与网站建设实战大全百度推广开户免费
  • 张掖网站建设培训班做百度推广的网络公司广州
  • 廊坊建设企业网站今天新疆新闻头条
  • 购物商城网站的运营广州新闻发布
  • 中国十大知名网站建设企业产品营销策划推广
  • 惠山做网站公司西安seo优化
  • 免费制作自己的微网站吗宁波seo网页怎么优化
  • 基于html5设计的网站建设开网站需要投资多少钱
  • xml天气预报网站怎么做sem是什么职位
  • 网站建设技术服务费怎么入账百度总部投诉电话
  • 网站备案 机构需要什么手续百度竞价排名公司
  • 个人电脑做服务器网站百度投诉热线中心客服
  • 梅兰商贸网站开发设计简介新型实体企业100强
  • 网站在线留言如何做谷歌seo外链
  • 关于进一步完善网站建设的请示竞价防恶意点击
  • 自己做电影网站违法东莞网站营销推广
  • 金山集团网站建设太原网站快速排名提升