「数据结构详解·十四」对顶堆

  • 「数据结构详解·一」树的初步
  • 「数据结构详解·二」二叉树的初步
  • 「数据结构详解·三」栈
  • 「数据结构详解·四」队列
  • 「数据结构详解·五」链表
  • 「数据结构详解·六」哈希表
  • 「数据结构详解·七」并查集的初步
  • 「数据结构详解·八」带权并查集 & 扩展域并查集
  • 「数据结构详解·九」图的初步
  • 「数据结构详解·十」双端队列 & 单调队列的初步
  • 「数据结构详解·十一」单调栈
  • 「数据结构详解·十二」有向无环图 & 拓扑排序
  • 「数据结构详解·十三」优先队列 & 二叉堆的初步
  • 「数据结构详解·十四」对顶堆

1. 对顶堆的概念

对顶堆,是二叉堆的一种应用。它是将处理的数据,分成一个小根堆、一个大根堆,然后可以快速求解出一些东西。
下面我们直接通过例题来理解。

2. 例题详解

2-1. P1168 中位数

我们可以开一个大根堆 q max ⁡ q_{\max} qmax,维护较小的值;再开一个小根堆 q min ⁡ q_{\min} qmin,维护较大的值。
每次加入一个数 x x x:若 x x x 大于大根堆堆顶 t max ⁡ t_{\max} tmax,则加入小根堆;若 x ≤ t max ⁡ x \le t_{\max} xtmax,则加入大根堆。
为什么要这么做呢?
首先,这样可以保证大根堆的元素值都小于小根堆的元素值。
那么这样的话,对于 t max ⁡ t_{\max} tmax,有 ∣ q min ⁡ ∣ |q_{\min}| qmin 个元素大于 t max ⁡ t_{\max} tmax,有 ∣ q max ⁡ ∣ − 1 |q_{\max}|-1 qmax1 个元素小于等于 t max ⁡ t_{\max} tmax;对于 t min ⁡ t_{\min} tmin 是正好相反的。
那么我们要找到当前中位数,只要让 ∣ ∣ q max ⁡ ∣ − ∣ q min ⁡ ∣ ∣ ≤ 1 ||q_{\max}|-|q_{\min}||\le1 ∣∣qmaxqmin∣∣1(即两个堆的元素数差值不大于)即可。
至于怎么做,不难想到,只要元素个数多的堆的堆顶取出,放入元素个数少的堆即可。然后奇数项的中位数就是元素个数多的堆的堆顶。
而时间复杂度,对于查询操作,自然是 O ( 1 ) O(1) O(1) 的;而每次插入元素后很难不发现最多调整一次,因此总时间复杂度是 O ( N log ⁡ N ) O(N\log N) O(NlogN)
下面我们来模拟一下样例二。
对于下面的示意图,上面是 q min ⁡ q_{\min} qmin,下面是 q max ⁡ q_{\max} qmax

首先遇到 3 3 3,大根堆为空,加入 q max ⁡ q_{\max} qmax

此时中位数为 t max ⁡ = 3 t_{\max}=3 tmax=3

接着遇到 1 1 1 1 ≤ t max ⁡ = 3 1\le t_{\max}=3 1tmax=3,故加入 q max ⁡ q_{\max} qmax

注意到 ∣ q max ⁡ ∣ − ∣ q min ⁡ ∣ = 2 > 1 |q_{\max}|-|q_{\min}|=2>1 qmaxqmin=2>1,因此将 q max ⁡ q_{\max} qmax 的堆顶元素调整到 q min ⁡ q_{\min} qmin 中。

然后遇到 5 5 5 5 > t max ⁡ = 1 5> t_{\max}=1 5>tmax=1,故加入 q min ⁡ q_{\min} qmin

此时中位数为 t min ⁡ = 3 t_{\min}=3 tmin=3

紧接着遇到 9 9 9 9 > t max ⁡ = 1 9> t_{\max}=1 9>tmax=1,故加入 q min ⁡ q_{\min} qmin

注意到 ∣ q min ⁡ ∣ − ∣ q max ⁡ ∣ = 2 > 1 |q_{\min}|-|q_{\max}|=2>1 qminqmax=2>1,因此将 q min ⁡ q_{\min} qmin 的堆顶元素调整到 q max ⁡ q_{\max} qmax 中。

再下来遇到 8 8 8 9 > t max ⁡ = 3 9> t_{\max}=3 9>tmax=3,故加入 q min ⁡ q_{\min} qmin

此时中位数为 t min ⁡ = 5 t_{\min}=5 tmin=5

再接下来遇到 7 7 7 7 > t max ⁡ = 3 7> t_{\max}=3 7>tmax=3,故加入 q min ⁡ q_{\min} qmin

注意到 ∣ q min ⁡ ∣ − ∣ q max ⁡ ∣ = 2 > 1 |q_{\min}|-|q_{\max}|=2>1 qminqmax=2>1,因此将 q min ⁡ q_{\min} qmin 的堆顶元素调整到 q max ⁡ q_{\max} qmax 中。

最后遇到 6 6 6 6 > t max ⁡ = 5 6> t_{\max}=5 6>tmax=5,故加入 q min ⁡ q_{\min} qmin

此时中位数为 t min ⁡ = 6 t_{\min}=6 tmin=6

参考代码:

#include<bits/stdc++.h>
using namespace std;priority_queue<int>a;
priority_queue<int,vector<int>,greater<int>>b;int read()
{int s=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=s*10+ch-48;ch=getchar();}return s*f;
}int main()
{int n=read();a.push(read());printf("%d\n",a.top());for(int i=2;i<=n;i++){int m=read();if(m>a.top()) b.push(m);else a.push(m);while(abs((int)a.size()-(int)b.size())>1){if(a.size()>b.size()){b.push(a.top());a.pop();}else{a.push(b.top());b.pop();}}if(i&1) printf("%d\n",a.size()>b.size()?a.top():b.top());}return 0;
}

2-2. P1801 黑匣子

虽然变成了第 k k k 小,但其实是同理。
我们仍然可以使用对顶堆解决问题。
只需要改变堆大根堆与小根堆内的元素个数即可。
代码留给读者自行思考。

3. 巩固练习

  • 例题 14-2-2 P1801 黑匣子
  • SP15376 RMID - Running Median
  • SP16254 RMID2 - Running Median Again

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机毕业设计】017基于微信小程序的学生公寓电费信息管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

多线程网络实战之仿qq群聊的服务器和客户端

目录 一、前言 二、设计需求 1.服务器需求 2.客户端需求 三、服务端设计 1.项目准备 2.初始化网络库 3.SOCKET创建服务器套接字 4. bind 绑定套接字 5. listen监听套接字 6. accept接受客户端连接 7.建立套接字数组 8. 建立多线程与客户端通信 9. 处理线程函数&…

【3GPP核心网】【5G】精讲5G核心网系统架构主要特征

目录 前言 1. 5G核心网系统架构主要特征 1.1 5G核心网与4G核心网EPC区别 1.2 5G核心网系统架构主要特征 2. 5G网络逻辑架构 2.1 新型基础设施平台 2.2 逻辑架构 前言 首先需要理解核心网的角色定位&#xff0c;作为移动通信网络的核心部分&#xff0c;核心网起着承上启下的作用…

【收藏】欧盟CE、美国FDA法规及标准查询常用网站

01 CE法规&标准查询网站 医疗器械主管部门的网站 网址: https://www.camd-europe.eu/ 简介: CAMD的全称是Competent authorities for medical devices&#xff0c;翻译成中文叫做医疗器械监管机构&#xff0c;实际上它指的是欧盟成员国医疗器械监管机构的联盟&#xff…

程序人生【追光的日子】今天我们不谈技术,谈一谈:人工智能的意义到底是什么?来看看今天分享的故事...我想我们都愿意相信,也许AI真的会有温度,这一天不远了~!

有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域…

Java SpringBoot MongoPlus 使用MyBatisPlus的方式,优雅的操作MongoDB

Java SpringBoot MongoPlus 使用MyBatisPlus的方式&#xff0c;优雅的操作MongoDB 介绍特性安装新建SpringBoot工程引入依赖配置文件 使用新建实体类创建Service测试类进行测试新增方法查询方法 官方网站获取本项目案例代码 介绍 Mongo-Plus&#xff08;简称 MP&#xff09;是一…

网络服务器配置与管理

网络服务器配置与管理是一个涉及多个方面的领域&#xff0c;它涵盖了从物理硬件的设置到操作系统、网络服务和应用的配置&#xff0c;再到日常维护和安全策略的实施。以下是网络服务器配置与管理的一些核心概念和步骤&#xff1a; 硬件配置&#xff1a; 选择合适的服务器硬件&a…

基于docker上安装elasticSearch7.12.1

部署elasticsearch 首先&#xff0c;先创建网络 # 创建网络 docker network create es-net拉取elasticSearch的镜像 #拉取镜像 docker pull elasticsearch:7.12.1创建挂载点目录 # 创建挂载点目录 mkdir -p /usr/local/es/data /usr/local/es/config /usr/local/es/plugin…

【SD教程】进阶篇图片复现AnimateDiff动画插件基础教程(附模型插件)

当你成功安装了SD&#xff08;Stable Diffusion&#xff09;后&#xff0c;是否也产生过这样的疑惑&#xff1a;为何我创作的图片与他人的作品在风格和质量上存在差异&#xff1f; 看着别人创作的精致、引人入胜的图片&#xff0c;你是否也渴望缩小这种质感上的差距&#xff1…

游戏AI的创造思路-技术基础-决策树(1)

决策树&#xff0c;是每个游戏人必须要掌握的游戏AI构建技术&#xff0c;难度小&#xff0c;速度快&#xff0c;结果直观&#xff0c;本篇将对决策树进行小小解读~~~~ 目录 1. 定义 2. 发展历史 3. 决策树的算法公式和函数 3.1. 信息增益&#xff08;Information Gain&…

深度解析:STM32对接米家平台,打造WiFi智能插座(ESP8266、电流检测)

摘要: 智能插座作为智能家居的入门级设备&#xff0c;凭借其低成本、易部署等优势&#xff0c;受到了广大用户的青睐。本文将引领你从零开始&#xff0c;使用功能强大的STM32微控制器、广受欢迎的ESP8266 WiFi模块以及功能丰富的米家IoT平台&#xff0c;一步步打造出一款能够远…

代码随想录-Day50

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

Linux环境中安装JDK

1.下载安装包 可以通过访问oracle官网&#xff1a;Java Downloads | Oracle 中国 下载对应的安装包。 本文使用的是java8的安装包&#xff0c;包名为&#xff1a;jdk-8u401-linux-x64.tar.gz 2.上传安装包到Linux环境 3.进入/usr目录下&#xff0c;新建一个java的目录&#…

Python数据分析-欧洲经济聚类和主成分分析

一、研究背景 欧洲经济长期以来是全球经济体系中的重要组成部分。无论是在全球金融危机后的复苏过程中&#xff0c;还是在新冠疫情期间&#xff0c;欧洲经济的表现都对世界经济产生了深远的影响。欧洲各国经济体之间既存在相似性&#xff0c;也存在显著的差异。这些差异不仅体…

Linux下QT程序启动失败问题排查方法

文章目录 0.问题背景1.程序启动失败常见原因2.排查依赖库问题2.1 依赖库缺失2.2 依赖库加载路径错误2.3 依赖库版本不匹配2.4 QT插件库缺失2.4.1 QT插件库缺失2.4.2 插件库自身的依赖库缺失 2.5 系统基础C库不匹配 3.资源问题3.1 缺少翻译文件3.2 缺少依赖的资源文件3.3 缺少依…

水果商城系统 SpringBoot+Vue

1、技术栈 技术栈&#xff1a;SpringBootVueMybatis等使用环境&#xff1a;Windows10 谷歌浏览器开发环境&#xff1a;jdk1.8 Maven mysql Idea 数据库仅供学习参考 【已经答辩过的毕业设计】 项目源码地址 2、功能划分 3、效果演示

化工厂定位的意义?如何有效解决管理难题

化工厂定位是运用于工厂人员定位管理的新技术&#xff0c;这一技术的应用具有特殊的意义&#xff0c;和传统管理模式相比具有很大的区别&#xff0c;那么&#xff0c;你是否清楚化工厂定位的意义&#xff0c;它是如何有效的去解决工厂现存的管理难题呢? 传统化工厂管理到底有哪…

PySide6开发桌面程序,PySide6入门实战(上)

文章目录 系列文章索引一、前期准备1、简介及安装2、PyCharm PySide6环境搭建&#xff08;1&#xff09;基础环境&#xff08;2&#xff09;配置QT Designer、PyUIC、PyRCC&#xff08;3&#xff09;使用pyside6项目&#xff08;4&#xff09;资源文件编写与编译 二、QT常用控件…

排序矩阵查找

题目链接 排序矩阵查找 题目描述 注意点 每一行、每一列都按升序排列 解答思路 可以从右上角开始遍历&#xff0c;如果当前元素就等于target&#xff0c;直接返回true&#xff1b;如果当前元素小于target&#xff0c;则target肯定在当前位置下方&#xff1b;如果当前元素大…

挑战杯 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…