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

模拟堆详解

代码解析

h[N]:用于存储堆中的元素。

ph[N]:存储第 k 个插入的元素在堆中的位置(eg:ph[k] = i,表示将第 k 个插入的元素在 h[i] 中)。

hp[N]:存储堆中第 i 个元素是第几个插入的(eg:hp[i] = k,表示 h[i] 是第 k 个插入的元素)。

cnt:当前堆中元素的数量。

m:记录插入操作的总次数。

heap_swap 函数

通过 ph 和 hp 数组实现了堆中元素的索引映射,可以使我们在堆中快速定位和修改特定元素。

功能:交换堆中的两个元素,并更新 ph 和 hp 数组。

实现:

void heap_swap(int a, int b)
{swap(ph[hp[a]],ph[hp[b]]);swap(hp[a], hp[b]);swap(h[a], h[b]);
}

交换 ph[hp[a]] 和 ph[hp[b]]。

交换 hp[a] 和 hp[b]。

交换 h[a] 和 h[b]。

简单理解heap交换映射的逻辑:

假设小明和小红 要互换住址,居委会那边可以查小明和小红的住址【ph】,同时小明身上的身份证【hp】用于修改地址 小红同理。那么搬家该怎么搬呢,
首先 小明小红 先去居委会出示了 身份证 swap(ph[hp[小明]],ph[hp[小红])更换了户口,
户口换完了 当然的身份证信息也要修改啦~swap(hp[小红],ph[小明]),
最后俩人找来搬家公司 搬完了东西 最后顺利入住了 swap(小明,小红)

简单理解来自种花家的鸭脖 

down 函数

向下调整堆,确保以 u 为根的子树满足小根堆的性质。

up 函数

向上调整堆,确保以 u 为根的子树满足小根堆的性质。

strcmp 函数

strcmp  是 C 和 C++ 标准库中的一个字符串比较函数,用于比较两个以空字符( \0 )结尾的字节字符串。它定义在头文件  <cstring> (C++)或  <string.h> (C)中。

比较规则 :strcmp  按字典序比较两个字符串,逐个字符进行比较,直到遇到不同的字符或字符串结束符  \0 。比较时,字符的大小是根据它们的 ASCII 值来确定的。

返回值 < 0:表示  str1  小于  str2 。

返回值 == 0:表示  str1  和  str2  相等。

返回值 > 0:表示  str1  大于  str2 。

AC代码

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=100010;
int h[N],ph[N],hp[N],cnt;
//ph表示第k个插入的数在堆中的位置,hp表示堆中位置k对应的是第几个插入的数
void heap_swap(int a,int b){  //索引映射,用于在堆中快速定位和修改特定元素swap(ph[hp[a]],ph[hp[b]]);swap(hp[a],hp[b]);swap(h[a],h[b]);
}
void down(int u){int t=u;if(u*2<=cnt&&h[u*2]<h[t])t=u*2;if(u*2+1<=cnt&&h[u*2+1]<h[t])t=u*2+1;if(u!=t){heap_swap(u,t);down(t);}
}
void up(int u){while(u/2&&h[u]<h[u/2]){//完全二叉树[n/2]处是最后一个非叶子节点heap_swap(u,u/2);u>>=1;}
}
int main()
{int n, m = 0;cin>>n;while (n -- ){char op[5];int k, x;cin>>op;if (!strcmp(op, "I")){cin>>x;cnt ++ ;m ++ ;ph[m] = cnt, hp[cnt] = m;h[cnt] = x;up(cnt);}else if(!strcmp(op, "PM")) cout<<h[1]<<endl;else if(!strcmp(op, "DM")){heap_swap(1, cnt);cnt -- ;down(1);}else if (!strcmp(op, "D")){cin>>k;k = ph[k];heap_swap(k, cnt);cnt -- ;up(k);down(k);}else{cin>>k>>x;k = ph[k];h[k] = x;up(k);down(k);}}return 0;
}

http://www.xdnf.cn/news/815.html

相关文章:

  • 软件工程中的维护类型
  • OpenSSL1.1.1d windows安装包资源使用
  • [预备知识]1. 线性代数基础
  • 浙江大学 DeepSeek 公开课 第三季 第1期讲座 - 唐谈 研究员 (附PPT下载) | 突破信息差
  • 腾讯云×数语科技:Datablau DDM (AI智能版)上架云应用!
  • 虚拟环境下编译ros2节点需注意的地方
  • 【上位机——MFC】运行时类信息机制
  • # 05_Elastic Stack 从入门到实践(五)
  • Kafka 在小流量和大流量场景下的顺序消费问题
  • Spring MVC DispatcherServlet 的作用是什么? 它在整个请求处理流程中扮演了什么角色?为什么它是核心?
  • 平板电脑做欧盟网络安全法案(EU)2022/30
  • 人工智能100问☞第9问:什么是AI芯片?
  • 形象理解华为云物联网iotDA开发流程
  • MYSQL之慢查询分析(Analysis of Slow MySQL Query)
  • PyCharm 初级教程:从安装到第一个 Python 项目
  • 基于ueditor编辑器的功能开发之重写ueditor的查找和替换功能,支持滚动定位
  • 链式栈和线性栈
  • WebForms Validation
  • Spark SQL核心解析:大数据时代的结构化处理利器
  • 【基于WSAAsyncSelec模型的通信程序设计】
  • 云原生与AI的关系是怎么样的?
  • Jinja2 内置变量和函数详解
  • VScode-py环境
  • 【JS】计算任意字符串的像素宽度(px)
  • VR、AR、互动科技:武汉数字展馆制作引领未来展览新体验
  • 单例模式(线程安全)
  • Docker Compose 使用实例
  • 【漫话机器学习系列】214.停用词(Stop Words)
  • 查看MAC 地址以及简单了解
  • CHAPTER 11 A Pythonic Object