AcWing算法基础课 堆
堆可以用二叉树存储。
当前节点比左右子节点的值都小或等于(小根堆)。
对于完全二叉树,根节点编号为1,则,对于编号为n的节点,左子节点编号为2n,右子节点标号为2n+1。
完全二叉树可以用一维数组存储(编号→下标)
基本操作:up和down
up:当节点数值比父节点小时,交换当前节点与父节点的值,然后递归。
down:当前节点数值比子节点大时,交换当前节点与较小的子节点的值,然后递归。
用于修改节点的值。
堆的操作:
1、插入一个数:在数组的末尾插入,然后进行up操作。heap[++size]=x; up(size);
2、求堆中最小值:返回第一个元素。heap[1];
3、删除最小值(堆顶元素),用数组中最后一个元素覆盖最小值,size--,然后进行down,heap[1]=heap[size]; size--; down(1);
4、删除任意元素,用数组中最后一个元素覆盖。heap[k]=heap[size]; up(k) or down(k) or not;
5、修改任意元素,然后调整。 heap[k]=x; up(k) or down(k) or not;
o(n)的快速建堆方式
在heap中读取全部元素
然后对n/2~1进行down()
for(int i=n/2;i;i--) down(i);
可以认为n/2后的节点位于叶节点位置,不需要down,其他的需要从下到上down()
带映射的堆:dijkstra算法中需要用
ph[k]记录第k个插入节点在数组中的位置,
hp[k]记录数组中第k个节点是第几个插入的,
ph与hp互为反函数
swap→heap_swap
void heap_swap(int a,int b)
{
swap(ph[hp[a]],ph[hp[b]]);
swap(hp[a],hp[b]);
swap[heap[a],heap[b]];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人