参考资料:

  • 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();         //打印小根堆};
      

小根堆的操作

插入元素

算法步骤:

  1. 将新元素添加到小根堆的末尾
  2. 类比插入排序的思想, 向上调整, 将新元素调整到合适的位置

代码实现:

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;}
}

删除元素

只允许删除根节点
算法步骤:

  1. 将最后一个元素x赋值给第一个元素
  2. x与它的孩子结点中的较小者min相比较: 若x <= min则算法完成; 若x > min则交换xmin,继续执行算法.

代码实现:

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)相关推荐

  1. c语言建立小根堆的算法,小根堆(Heap)的详细实现

    堆的介绍 Heap是一种数据结构具有以下的特点: 1)完全二叉树 2)heap中存储的值是偏序 Min-heap: 父节点的值小于或等于子节点的值 Max-heap: 父节点的值大于或等于子节点的值 ...

  2. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  3. codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值:

  4. 算法自学__珂朵莉树

    参考资料: https://zhuanlan.zhihu.com/p/106353082 https://blog.csdn.net/CC_dsm/article/details/98166835 珂 ...

  5. 堆(Heap)大根堆、小根堆

    目录 堆(Heap)大根堆.小根堆 1.堆的存储: 2.堆的操作:insert 3.堆的操作:Removemax 4.堆的操作:buildHeap 堆化数组 5.堆排序 堆(Heap)大根堆.小根堆 ...

  6. 大根堆和小根堆的区别

    大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...

  7. [C++]小根堆 插入/删除/初始化

    小根堆的性质:是完全二叉树,根节点的关键字小于等于两个子节点的关键字. 插入和删除操作都应当保证小根堆的性质不变. 由于小根堆是完全二叉树,所以使用数组存放具有显著优势:按照层次遍历将具有n个元素的小 ...

  8. 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法

    内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...

  9. 小根堆 的调整算法

    // 小根堆 的调整算法 /* heap[]:存储堆的数组 hlength:heap[]的节点数 */ //把节点 P 向下调整 void down(int p) { int q=p*2; a=hea ...

最新文章

  1. matlab处理txt文件数据
  2. Perl 模块安装总结
  3. 大多数的自动驾驶公司,注定要倒闭
  4. php追加编译imagick
  5. OpenGL拾取操作流程
  6. opencv精要(3)-win下codelite的opencv配置
  7. AngularJS特性
  8. 实验3 编程、编译、链接、跟踪
  9. mac/windows 端口占用解决记录
  10. 大话信号多久可以移服务器,关于第十届服务器联赛规则及日期详细介绍(二)...
  11. [转][中文/英文]VC6 sp6补丁下载|VS6 sp6补丁下载 [防VC6卡死]
  12. @property 和@synthesize
  13. 5-17 汉诺塔的非递归实现 (25分)
  14. for...in、for...of、forEach()有什么区别
  15. vs2015好看的字体_在VisualStudio中应该使用什么字体
  16. AVS2 有点令人不敢相信
  17. 发光二极管之二——正负极如何判断
  18. 65位高校教师接龙晒工资,全国各地高校,给打算入高校的博士们参考!
  19. HUST1005 渊子赛马【枚举】
  20. 波束形成算法学习笔记之一(Endfire,broadside)

热门文章

  1. python : turtle 画单车两轮
  2. 计算机一级网络设置网关步骤,网关有什么用_网关如何设置
  3. Java学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)
  4. nodejs+Vue餐饮点餐系统
  5. VS2019 无法打开包括文件“GL/gl.h“
  6. 微信小程序startLocationUpdateBackground()简单实现骑手配送位置
  7. 音乐播放器(1)--在线歌词获取
  8. python loads_Python中的dump() 和load()以及dumps()和loads()
  9. clock_nanosleep避免过度睡眠
  10. NSQ系列(一)nsq 介绍