ACM学习笔记:二叉堆
title : 堆
date : 2021-8-3
tags : ACM,数据结构
什么是堆
堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质。堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h或h-1层,也就是说,堆应该是一棵完全二叉树。
堆的类型
大顶堆:顾名思义大的元素在顶部
小顶堆:顾名思义小的元素在顶部
堆的操作
上浮节点
void checkup(int node) //与父节点比较向上更新
{
if (node <= 1)
{
return; //已经达到堆顶
}
if (tree[node]<tree[node >> 1]) //该节点比父节点要小
{
swap(tree[node], tree[node >> 1]); //交换两者
checkup(node >> 1); //继续上浮
}
}
下沉节点
void checkdown(int node) //向下更新二叉堆
{
if (node > num)
{
return; //已经无法下沉
}
if (tree[node] < tree[node << 1] && tree[node] < tree[node << 1 | 1])
{
return; //没有比子节点小则返回
}
if (tree[node << 1] < tree[node << 1 | 1]) //左儿子小于右儿子
{
swap(tree[node], tree[node << 1]); //交换左儿子
if (node * 2 < num)
{
checkdown(node << 1); //继续下沉
}
}
else //右儿子小于左儿子
{
swap(tree[node], tree[node << 1 | 1]);
if (node * 2 + 1 < num)
{
checkdown(node << 1 | 1);
}
}
}
插入节点
void push(long long val) //插入val
{
tree[++num] = val; //先插入到最后的位置
checkup(num); //对他进行上浮操作
}
删除节点
void pop() //删除最小的数,即tree[1]
{
tree[1] = tree[num]; //首先让最后的元素移动到堆顶
tree[num] = inf; //原来的位置不再有任何元素
num--;
checkdown(1); //对堆顶进行下沉操作
}
构建二叉堆
把一个无序的完全二叉树调整为二叉堆,只需让所有非叶子节点依次下沉。
参考资料
https://blog.csdn.net/qq_41900081/article/details/86670001
https://blog.csdn.net/qq_39445165/article/details/84932335
ACM学习笔记:二叉堆的更多相关文章
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
- 二叉堆(binary heap)
堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...
- 在A*寻路中使用二叉堆
接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序 这一篇文章,是&q ...
- poj 3253 初涉二叉堆 模板题
这道题很久以前就做过了 当时是百度学习了优先队列 后来发现其实还有个用sort的办法 就是默认sort排序后 a[i]+=a[i-1] 然后sort(a+i,a+i+n) (大概可以这样...答案忘了 ...
- POJ 3253 Fence Repair【二叉堆】
题意:给出n根木板,需要把它们连接起来,每一次连接的花费是他们的长度之和,问最少需要多少钱. 和上一题果子合并一样,只不过这一题用long long 学习的手写二叉堆的代码,再好好理解= = #inc ...
- 数据结构 之 二叉堆(Heap)
注:本节主要讨论最大堆(最小堆同理). 一.堆的概念 堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性. 1.结构性质: 堆是一棵被完全填满的二叉树,有可能的 ...
- PHP利用二叉堆实现TopK-算法的方法详解
前言 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证 内存和速度的效率,我们可能第一个想法就是利用排序,然后 ...
- 《数据结构与算法分析:C语言描述》复习——第五章“堆”——二叉堆
2014.06.15 22:14 简介: 堆是一种非常实用的数据结构,其中以二叉堆最为常用.二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序.我们关心的通常 ...
随机推荐
- Mybatis学习(7)实现mybatis分页
上一篇文章里已经讲到了mybatis与spring MVC的集成,并且做了一个列表展示,显示出所有article 列表,但没有用到分页,在实际的项目中,分页是肯定需要的.而且是物理分页,不是内存分页. ...
- JDBC:MySQL5.x 与 MySQL8.x
jar包下载地址: https://dev.mysql.com/downloads/connector/j/ 或者 :http://central.maven.org/maven2/mysql/mys ...
- jvm代码热替换过程中异常
BTrace java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException 具体如下: 1. 信这个问题很多小伙伴已经遇到了,这是在你的jd ...
- buu 刮开有奖
一.查壳, 二.拖入ida,分析 直接搜字符串完全没头绪,在看了大佬的wp才找到了,关键函数. 明显那个String就是我们要求的flag,要开始分析程序. 字符串长度为8,同时这个函数对字符串进行了 ...
- CTF反序列化逃逸
刷了一下CTF反序列化的题,去年没有好好了解.又补了一次PHP,害太菜了.每天看看别人的博客真的可以鼓舞人.简单记录一下两道字符串逃逸问题 推荐一个反序列化总结的很好的笔记https://www.cn ...
- ESXi 切换直通导致无法识别硬盘解决
在解决虚机挂载U盘的过程中(已经处理了:VMware中的虚机如何挂载U盘),怎么样都无法加载U盘,故进行了一次操作直通操作的过程中,不小心把所有的存储和控制器全部直通了,导致Esxi主机无法识别到自己 ...
- java+selenium UI自动化001
selenium是一个用于Web应用程序测试的工具,可以用来模拟用户在浏览器上的操作. 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Googl ...
- postman使用笔记
postman主要是用来做接口测试的工具,用来模拟客户端向服务器发起请求. 一.postman支持的请求类型 1.get请求 get请求是用来向服务器获取数据 get请求没有请求体,只有url和请求头 ...
- SLAM十四讲第二版项目代码总结
github地址:https://github.com/gaoxiang12/slambook2/tree/master/ch13 双目视觉里程计 头文件 所有的类都在myslam命名空间中 1.co ...
- Vim的操作
记录下vim的快捷键操作: I 进入编辑: Esc 退出编辑: 按ESC键 跳到命令模式,然后::w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w ...