算法自学__小根堆(Heap)
参考资料:
- https://www.cnblogs.com/WindSun/p/11444446.html
- https://www.cnblogs.com/huashanqingzhu/p/11040390.html
小根堆的性质
- 小根堆是一颗完全二叉树
- 父节点的值小于或等于子节点的值
小根堆的存储
- 由于小根堆是一颗完全二叉树, 所以一般用一维数组来实现堆.
- 映射关系: 对于一个树中的结点, 假设其在数组中的下标为i
其父结点的下标为
(i-1)/2
其左子结点的下标为
2i+1
, 其右子结点的下标为2i+2
class MinHeap {public:int capacity; //容量int size; //当前元素个数int* elem; //数组public:MinHeap(int capacity = 10010); //初始化void Insert(int x); //插入元素void UpModify(int start); //向上调整int remove(); //移除元素void DownModify(int start); //向下调整void print(); //打印小根堆};
小根堆的操作
插入元素
算法步骤:
- 将新元素添加到小根堆的末尾
- 类比插入排序的思想, 向上调整, 将新元素调整到合适的位置
代码实现:
void MinHeap::Insert(int x) {if (size == capacity)throw "Heap is Full!"; //堆满时抛出异常elem[size++] = x; //将新元素放在数组末尾UpModify(size - 1); //堆调整
}
void MinHeap::UpModify(int start) {while (start > 0) {int parent = (start - 1) / 2; //与双亲结点比较if (elem[start] < elem[parent]) swap(elem[start], elem[parent]);else break;start = parent;}
}
删除元素
只允许删除根节点
算法步骤:
- 将最后一个元素
x
赋值给第一个元素 - 将
x
与它的孩子结点中的较小者min
相比较: 若x <= min
则算法完成; 若x > min
则交换x
和min
,继续执行算法.
代码实现:
int MinHeap::remove() {int temp = elem[0]; //保存要移除的元素if (size >= 1) {elem[0] = elem[--size];DownModify(0); //堆调整}return temp;
}
void MinHeap::DownModify(int start){int L = 0, R = 0;while (1){L = 2 * start + 1, R = 2 * start + 2;if (R >= size) break; //判断L, R是否都合法if (elem[start] <= min(elem[L], elem[R])) return; //无需调整else { //和两个孩子中的较小者交换if (elem[L] < elem[R]) {swap(elem[start], elem[L]);start = L;}else {swap(elem[start], elem[R]);start = R;}}}if (L<size && elem[start]>elem[L]) swap(elem[start], elem[L]);
}
C++优先队列的用法
#include<queue>
优先队列priority_queue
与普通队列queue
的不同之处在于, 我们可以自定义队列中元素的优先级, 让优先级高的元素排在队列前面, 优先出队.
- 定义: priority_queue<Type, Container, Functional>
参数 解释 Type 数据类型 Container 容器类型,如: vector, deque等等 Functional 比较函数 //升序队列 (小根堆)priority_queue< int, vector<int>, greater<int> > q;//降序队列priority_queue< int, vector<int>, less<int> > q;
自定义数据结构的 优先队列
class FARMER{
public:int p;int a;
public:FARMER(int p, int a){this->p=p;this->a=a;}
};
class cmp{
public:bool operator()(FARMER f1, FARMER f2){return f1.p>f2.p;}
};
priority_queue< FARMER, vector<FARMER>, cmp >q;
算法自学__小根堆(Heap)相关推荐
- c语言建立小根堆的算法,小根堆(Heap)的详细实现
堆的介绍 Heap是一种数据结构具有以下的特点: 1)完全二叉树 2)heap中存储的值是偏序 Min-heap: 父节点的值小于或等于子节点的值 Max-heap: 父节点的值大于或等于子节点的值 ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值:
- 算法自学__珂朵莉树
参考资料: https://zhuanlan.zhihu.com/p/106353082 https://blog.csdn.net/CC_dsm/article/details/98166835 珂 ...
- 堆(Heap)大根堆、小根堆
目录 堆(Heap)大根堆.小根堆 1.堆的存储: 2.堆的操作:insert 3.堆的操作:Removemax 4.堆的操作:buildHeap 堆化数组 5.堆排序 堆(Heap)大根堆.小根堆 ...
- 大根堆和小根堆的区别
大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...
- [C++]小根堆 插入/删除/初始化
小根堆的性质:是完全二叉树,根节点的关键字小于等于两个子节点的关键字. 插入和删除操作都应当保证小根堆的性质不变. 由于小根堆是完全二叉树,所以使用数组存放具有显著优势:按照层次遍历将具有n个元素的小 ...
- 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法
内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...
- 小根堆 的调整算法
// 小根堆 的调整算法 /* heap[]:存储堆的数组 hlength:heap[]的节点数 */ //把节点 P 向下调整 void down(int p) { int q=p*2; a=hea ...
最新文章
- matlab处理txt文件数据
- Perl 模块安装总结
- 大多数的自动驾驶公司,注定要倒闭
- php追加编译imagick
- OpenGL拾取操作流程
- opencv精要(3)-win下codelite的opencv配置
- AngularJS特性
- 实验3 编程、编译、链接、跟踪
- mac/windows 端口占用解决记录
- 大话信号多久可以移服务器,关于第十届服务器联赛规则及日期详细介绍(二)...
- [转][中文/英文]VC6 sp6补丁下载|VS6 sp6补丁下载 [防VC6卡死]
- @property 和@synthesize
- 5-17 汉诺塔的非递归实现 (25分)
- for...in、for...of、forEach()有什么区别
- vs2015好看的字体_在VisualStudio中应该使用什么字体
- AVS2 有点令人不敢相信
- 发光二极管之二——正负极如何判断
- 65位高校教师接龙晒工资,全国各地高校,给打算入高校的博士们参考!
- HUST1005 渊子赛马【枚举】
- 波束形成算法学习笔记之一(Endfire,broadside)
热门文章
- python : turtle 画单车两轮
- 计算机一级网络设置网关步骤,网关有什么用_网关如何设置
- Java学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)
- nodejs+Vue餐饮点餐系统
- VS2019 无法打开包括文件“GL/gl.h“
- 微信小程序startLocationUpdateBackground()简单实现骑手配送位置
- 音乐播放器(1)--在线歌词获取
- python loads_Python中的dump() 和load()以及dumps()和loads()
- clock_nanosleep避免过度睡眠
- NSQ系列(一)nsq 介绍