首页 > 其他分享 >堆Heap

堆Heap

时间:2024-08-23 09:54:59浏览次数:5  
标签:index 大根堆 int 插入 二叉树 Heap 节点

堆本质上是一个完全二叉树,一般分为大根堆和小根堆。
大根堆:父节点的值大于或等于子节点的值
小根堆:父节点的值小于或等于子节点的值

堆的操作

插入

将值插入到堆空余位置,保持完全二叉树,然后开始比较插入值和当前父节点的大小,根据大根堆和小根堆进行节点之间的交换

删除

一般是删除头节点,一般是通过将最后一个节点和头节点交换,然后进行当前头节点的下移,最后删除最后一个节点就可以了

堆的实现

可以理解为将一个数组,变换为一个大根堆或者小根堆,由于是完全二叉树,所以对于一个节点i,那么其子节点就是2i+1和2i+2;为了实现这个结构需要实现前面说的两个操作

堆的初始化

vector<int> h(N); // 堆的数组,数据下标从1开始
int m = 0; // 堆的大小

插入实现

插入后,需要向上移动该节点

void insert(int val)
{
   h[++m] = val;
   up(m);
}

void up(int index)
{
  while(index/2 > 0 && h[index] > h[index/2]) // 大根堆
  {
    swap(h[index], h[index/2]);
    index /= 2;
  }
}

删除实现

将第一个节点,和最后一个节点交换,之后将第一个节点调整顺序

void pop()
{
  if(m <= 1) 
  {
    h.resize(0);
    return;
  }
  h[1] = h[m--];
  down(1);
  h.resize(m);
}
void down(int index)
{
  while(index <= m)
  {
    int cur = index;
    if(index*2 <= m && h[cur] < h[index*2]) cur = index*2; // 与左子节点比较,如果小,则可能变换的下标变为index*2
    if(index*2+1 <= m && h[cur] < h[2*index+1]) cur = index*2+1; //与右子节点比较,如果小,则可能变换的下标变为index*2+1
    if(index == cur) break;
    swap(h[cur],h[index]); //得到右节点,左节点和父节点中最小的位置,实现交换
    index = cur; //移动index为当前下标,继续向下移动
  }
}

标签:index,大根堆,int,插入,二叉树,Heap,节点
From: https://www.cnblogs.com/XTG111/p/18375162

相关文章

  • 【第68课】Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE
    免责声明本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。文中所涉......
  • 面试题:在Java中,JVM(Java虚拟机)的内存模型是如何设计的?请详细解释堆(Heap)、栈(Stack)、方法
    面试题:在Java中,JVM(Java虚拟机)的内存模型是如何设计的?请详细解释堆(Heap)、栈(Stack)、方法区(MethodArea)以及程序计数器(ProgramCounterRegister)的作用和它们之间的关系。更多答案在这里,手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项......
  • C++标准库 algorithm 堆操作 heap
    算法库-堆操作基本操作make_heap()(1)从一个元素范围创建出一个最大堆(2)将区间内的元素转化为heap.--传比较器push_heap()对heap增加一个元素.将一个元素加入到一个最大堆pop_heap()对heap取出下一个元素.从最大堆中移除最大元素sort_heap()对heap转化为一......
  • 博客园T恤 TALK IS CHEAP 系列精梳棉升级款
    这款与第一款TALKISCHEAP系列T恤用的是同样的设计,版型有些不同,领口稍大一些,从我们自己的穿着体验看这款更舒适一些,经过总体评估,我们觉得这一款更好些,所以叫升级款,暂时还没拍实物照片。产品特点来自厂家的介绍:选用新疆地区的优质精梳棉定织定染,紧密砂线全棉面料,既保持其舒......
  • STL heap 算法库 堆操作
    算法库-堆操作基本操作make_heap()(1)从一个元素范围创建出一个最大堆(2)将区间内的元素转化为heap.--传比较器push_heap()对heap增加一个元素.将一个元素加入到一个最大堆pop_heap()对heap取出下一个元素.从最大堆中移除最大元素sort_heap()对heap转化为一......
  • CF1253F Cheap Robot
    Codeforces,luogu。如果我们从走的路径长短出发去思考问题会很困难。因为目的是走到终点,求出容量,这一过程中只有行与不行之分。从此出发,对于当前点\(u\),可以通过走到最近的一个充电站再走回来以增加当前电量。因此我们要处理每个点到最近充电站的距离。距离可以通过建一个超级源......
  • 排序算法 堆排序 HeapSort -- C语言实现
    堆排序堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:大顶堆:每个节点的值都大于或等于其子......
  • 博客园T恤 TALK IS CHEAP 系列新疆长绒棉款上架预售
    这一款与第一款TALKISCHEAP系列T恤用的是同样的设计,主要区别是面料不同,这款用的是新疆长绒棉,第一款用的是精梳棉,个人感觉新疆长绒棉更舒适一些,另外版型稍有区别,这款衣长更长一些。面料参数100%新疆长绒棉32支克重240g颜色与尺码默认白色与黑色,其他颜色可联系客服定......
  • Android 内存分析(java native heap内存、虚拟内存、处理器内存.
    1.jvm堆内存(dalvik堆内存)每个Java应用程序在运行时都会拥有自己的JVM实例,这个实例会为其分配独立的堆内存空间。这意味着不同的应用程序之间不会共享堆内存。不同手机中app进程的jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在AndroidStudio创建模......
  • Java中的Heap(堆)(如果想知道Java中有关堆的知识点,那么只看这一篇就足够了!)
        前言:(Heap)是一种特殊的完全二叉树,它在诸多算法中有着广泛的应用,本文将详细介绍Java中的堆。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客先让我们看一下本文大致的讲解内容:目录1.堆的初识       ......