【基本数据结构之堆】-C++
注意:这篇博客讲的是手写堆,喜欢用C++自带数据结构模拟的慎入
今天我们来聊一聊一种奇怪 的数据结构:
堆
为什么说这个数据结构有点奇怪呢?
先看看其他的在我眼里是正常的数据结构:
队列(近似于排队)
栈(类似于一个桶)
数组(就是一组存储各种数据类型的集合(?))
但是!
堆这个东西有点奇怪,它模拟的是:
完全二叉树。
这就很让人摸不着头脑了emmmm
后来去各种找资料 知道了它的模拟方式就是:
堆的物理结构就是数组。堆的逻辑结构是一棵完全二叉树。树中每个结点与数组中存放该结点中值的那个元素相对应。如下图:

尼玛这不就是给这棵树的结点编号存数组里吗(疯狂咆哮)
接下来堆的特性我就找了一段资料如下,做了解就可以了:

感觉说的有点多…下面进入代码实现部分。今天我们以小根堆为例来进行代码实现的讲解 .
堆的基本操作:
- 上浮(up)
- 下沉(down)
- 插入(insert)
- 删除(del)
- *建立(build)
第一个是上浮(up)操作。
上浮操作,顾名思义,就是将一个结点在树中的位置尽量往上浮
代码实现用到了【位运算】不了解的可以百度一下◀〓〓
基本思路:
以小根堆为例,当小根堆的元素值h[x]变小时,该结点可能会上浮,如果h[x]小于h[x>>1]则交换两个结点的值,如此循环下去直到x=1或h[x]>=h[x>>1].
e.g.


代码实现:
void up(int x)//h[x]上浮
{
while (x>1&&h[x]<h[x>>1]){
swap(h[x],h[x>>1]);
x>>=1;
}
}
时间复杂度为O(logn)。
下沉(down)操作:
思路:
当小根堆的元素值h[x]变大时,该结点可能会下沉,如果有儿子结点值小于该结点的值则跟较小儿子结点交换,如此循环下去直到条件不满足或者没有儿子结点。
代码:
void down(int x)//h[x]下沉,len是堆中元素个数
{
int y=x<<1;
while(y<=len){
if(y+1<=len&&h[y+1]<h[y])y++;
if(h[y]<h[x]){
swap(h[x],h[y]);
x=y;y=x<<1;
}
else break;
}
}
O(logn)
插入(insert)操作:
基本思路:
插入一个元素,把该元素放在最后,再做up操作。
程序如下:
void insert(int x)
{
h[++len]=x;
up(len);
}
时间复杂度为O(logn)
删除(del)操作:
基本思路:
删除第x个元素,为了不破坏堆的性质,把h[len]移到x处,堆元素个数len减一,注意可能是做up(x)也可能做down(x),根据h[x]的变化情况来定。
程序如下:
void del(int x)//删除h[x]
{
h[x]=h[len--];
up(x);
down(x);
}
时间复杂度为O(logn)
*建堆(build)操作

不做过多讲述,这个操作写法有很多,也可以尝试着自己去探索其他的写法!
ov.
【基本数据结构之堆】-C++的更多相关文章
- 算法手记 之 数据结构(堆)(POJ 2051)
一篇读书笔记 书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了 ...
- 数据结构之堆Heap
1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...
- Java数据结构之堆和优先队列
概述 在谈堆之前,我们先了解什么是优先队列.我们每天都在排队,银行,医院,购物都得排队.排在队首先处理事情,处理完才能从这个队伍离开,又有新的人来排在队尾.但仅仅这样就能满足我们生活需求吗,明显不能. ...
- python数据结构之堆(heap)
本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 数据结构:堆(Heap)
堆就是用数组实现的二叉树,所有它没有使用父指针或者子指针.堆根据"堆属性"来排序,"堆属性"决定了树中节点的位置. 堆的常用方法: 构建优先队列 支持堆排序 快 ...
- 算法&数据结构系列 -- 堆(优先队列)
前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...
- java数据结构之(堆)栈
(堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(L ...
- 数据结构(堆):POJ 1442 Black Box
Black Box Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10658 Accepted: 4390 Descri ...
随机推荐
- SQLServer 复制中移除和添加发布而不初始化所有项目
原文:SQLServer 复制中移除和添加发布而不初始化所有项目 -- 若提前"禁止架构更改",新增的列不会自动添加大发布,此时应使用 sp_articlecolumn 添加列 E ...
- SqlServer 更改复制代理配置文件参数及两种冲突策略设置
原文:SqlServer 更改复制代理配置文件参数及两种冲突策略设置 由于经常需要同步测试并更改代理配置文件属性,所以总结成脚本,方便测试. 可更新订阅的冲突策略有两种情况:一是在发布中冲突,即订阅数 ...
- js中的scrollTop、offsetTop、clientTop
scrollHeight:获取对象可滚动的高度. scrollWidth:获取对象可滚动的宽度. scrollTop:获取对象最顶端与对象可见区域最顶端的距离. scrollLeft:获取对象左边界与 ...
- Advanced Installer 中测试数据库连接提示“未发现数据源名称并且未指定默认驱动程序”的解决办法
原文:Advanced Installer 中测试数据库连接提示"未发现数据源名称并且未指定默认驱动程序"的解决办法 最近需要制作一个安装包,安装包的要求如下: 1.用户手工填写M ...
- Android零基础入门第87节:Fragment添加、删除、替换
前面一起学习了Fragment的创建和加载,以及其生命周期方法,那么接下来进一步来学习Fragment的具体使用,本期先来学习Fragment添加.删除.替换. 一.概述 在前面的学习中,特别是动态加 ...
- Android零基础入门第82节:Activity数据回传
上一节学习了将简单的数据从MainActivity传递到SecondActivity,本节一起来学习数据如何从SecondActivity回传到MainActivity. 一.简介 前面己经提到,Ac ...
- mysql8解压版安装
1.下载 下载mysql8 2.安装 ① 解压到需要安装的目录,然后新建一个my.ini(位于解压目录下,与bin目录在同一个目录下) # For advice on how to change se ...
- Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
XE系列虽然可以跨平台,但是在跨平台的道路上只是走了一小半的路,很多平台下的接口都没实现彻底,所以为了某些功能,还必须自己去摸索. 想实现程序中可以内嵌浏览器的功能,但是Firemonkey还没有对应 ...
- Delphi berlin ShowMessage的改进与使用
这个版本的delphi对ShowMessage进行了重新实现,更好的适应移动跨平台,即在移动平台下是异步执行的,而在Windows及os X下是同步执行的,如果自己控制是否异步显示对话框,也可以通过T ...
- UTM (Urchin Tracking Module) codes
UTM Codes are a great way to see the results of your offline marketing In today’s day and age, we ar ...