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 简介: 堆是一种非常实用的数据结构,其中以二叉堆最为常用.二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序.我们关心的通常 ...
随机推荐
- Vue Element-ui表单校验规则,你掌握了哪些?
1.前言 Element-ui表单校验规则,使得错误提示可以直接在form-item下面显示,无需弹出框,因此还是很好用的. 我在做了登录页面的表单校验后,一度以为我已经很了解表单的校验规则. ...
- 资源:CentOS下载地址资源
新版本系统镜像下载(当前最新是CentOS 7.4版本) CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64 ...
- Hibernate框架(四)缓存策略+lazy
Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两 ...
- linux添加用户并授权访问目录
1.创建用户及访问目录 useradd test -d /data/app -M设置密码passwd test 将访问目录权限全部赋予用户chown -R test /data/app2. 创建组(如 ...
- XCTF EasyRE
一.查壳 无壳,并且发现是vc++编译的 二.拖入ida,来静态分析,这题让我深刻感觉到汇编的nb. 这段算是灵性的一段了,单从静态语句来看,发现分析不出啥,只能靠猜一下,我当时猜的是将输入的字符串又 ...
- IP地址详解
讲之前了解一些网络设备的作用: 交换机:组建局域网 路由器:连接内外网 网关:一个网络的出口(Gate Way = GW)一般网关在路由器上 局域网(也称内网) 一个简单的局域网的基本组成设备:交换机 ...
- C语言:printf标志符
%d 十进制整数 %i %lf双精度浮点数 %o八进制整数 0%o或0%O %x十六进制整数 0x%x 或 0X%X %f单精度浮点数 %E %e科学计数法 %s 字符串 %c 字符(单个 ...
- 创建自己的RSA密钥来保护web.config 加密数据库连接字符串
通过创建自己的RSA密钥来保护web.config1创建RSA密钥:C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis - ...
- linux xsel命令
xsel操作在三个寄存器上,其中一个是系统剪切板(-b).一个是默认寄存器(-p).一个是(-s)
- springMVC-12-整合spring和springmvc
问题1: 好像我们只需要使用springmvc的配置文件作为IOC容器就可以了 --> 需要进行Spring 整合SpringMVC吗? ----> 还是否需要再加入Spring的IOC容 ...