堆(Heap)——(一)优先队列

2023-11-06

堆可以利用数组、链表或者搜索二叉树实现,但是最好方法是利用完全二叉树。

1.完全二叉树

完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐,如下图

重新构建一种树, 专注于插入和删除最大或最小。 即, 根节点总是最大或最小且结构满足完全二叉树。 满足这种结构的树称为堆。


特点:

  1. 结构性: 用数组表示完全二叉树
  2. 有序性: 任一节点的关键字是其子树所有节点的最值(最大或最小) 。 最大值者,称为最大堆, “最大堆(MaxHeap)” ,也称“大顶堆” 。 “最小堆(MinHeap)” ,也称“小顶堆” 。

下标性:

当 i=1 时, 该结点为根结点, 它无双亲结点;
当 i>1 时, 其双亲是结点 i/2 (“/” 表示整除);
若 2i≤n, 则第 i 个结点有编号为 2i 的左孩子;
若 2i+1≤n, 则第 i 个结点有编号为 2i+1 的右孩子

 

2.“最大堆:示例

插入

最大堆的插入操作可以简单看成是“结点上浮”。 当我们在向最大堆中插入一个结点我们必须满足完全二叉树的标准, 那么被插入结点的位置的是固定的。 而且要满足父结点关键字值不小于子结点关键字值,那么我们就需要去移动父结点和子结点的相互位置关系。(不断交换,直到满足最大堆的规则,父节点值大于子节点值
 

 

删除

最大堆的删除操作,总是从堆的根结点删除元素。同样根元素被删除之后为了能够保证该树还是一个完全二叉树,我们需要来移动完全二叉树的最后一个结点,让其继续符合完全二叉树的定义,从这里可以看作是最大堆最后一个结点的下沉。

此时满足的完全二叉树的要求,但是仍然不满足根节点是最大值的要求。继续调整如下:

在已经确定的最大堆中做删除操作,被删除的元素是固定的,需要被移动的结点也是固定的,这里我说的被移动的元素是指最初的移动,即最大堆的最后一个元素。移动方式为从最大的结点开始比较。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆(Heap)——(一)优先队列 的相关文章

  • JVM调优-解决native heap持续增长

    问题的提出 xff0c 分析 xff0c 请参考JNI 小心 xff0c 内存怪兽出没 xff08 简单的说起来 xff0c 就是java进程占用了4G内存 xff0c 但是折腾来折腾去 xff0c 整个JVM的堆才100M上下 xff0c
  • (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

    文章目录 bssdatatextheapstack总结例子 bss bss段 xff08 bss segment xff09 通常是指用来存放程序中未初始化的全局变量的一块内存区域 bss是英文Block Started by Symbol
  • jmap -heap [pid]运行报:Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException(不允许的操作)

    一 运行环境 操作系统 xff1a Ubuntu 5 4 0 6 Java版本 xff1a JDK8 二 执行命令 jmap heap span class token punctuation span pid号 span class to
  • FreeRTOS代码阅读笔记:heap_4.c

    FreeRTOS中对于内存的管理当前一共有5种实现方式 xff08 作者当前的版本是10 1 1 xff09 xff0c 均在 Source portable MemMang 下面 xff0c 这里笔记下 heap 4 c和第二种方式比较相
  • FreeRTOS heap 4 机制解析

    FreeRTOS提供了几个内存管理的方案 xff0c 其中一个实现较好的方式是heap4 本篇就来形象讲述heap4的工作原理 本文暂时只用作自己对heap4的工作机制的总结和记录 xff0c 有空了再修改成教程吧 xff0c 所以 xff
  • HEAP[test0621.exe]: Heap block at 00FB3D08 modified at 00FB3D14 past requested size of 4

    错误代码如下 xff1a int main int argc char argv char p 61 new char 4 p 4 61 39 0 39 delete p return 0 此类问题在执行delete时会报错并引起程序崩溃
  • 树(Tree)——(五)搜索二叉树的节点删除和销毁

    目录 节点删除的三种情况 第一种情况 第二种情况 第三种情况 代码实现 main函数 节点删除的三种情况 节点删除总共分成三种情况 第一种情况 若为叶子节点则直接删除 如左图节点1 3 8或者右图的1 4 8 若为单独一个根叶子要单独处理
  • 最大堆和最小堆

    堆和栈的区别 一 堆栈空间分配区别 1 栈 操作系统 由操作系统自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构中的栈 2 堆 操作系统 一般由程序员分配释放 若程序员不释放 程序结束时可能由OS回收 分配方式倒是类
  • 树(Tree)——(六)平衡搜索二叉树理论篇

    目录 平衡 分类 最小不平衡子树 AVL Tree AVL树的失衡调整的四种情况 1 左单旋 RR 关键代码 例 补充 2 右单旋 LL 关键代码 3 右左双旋 RL 4 左右双旋 LR 总结 平衡 影响树的平衡的因素主要有 插入顺序 删除
  • java堆,栈,常量池最通俗易懂的图文解释

    转自 http www iteye com topic 634530 1 寄存器 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 2 栈 stack 存放基本类型的变量数据和对象的引用 但对象本身不存放在栈中 而是存放在堆 n
  • 树(Tree)——(二)链式存储

    用代码实现前序 中序 后序 第一种方法就是使用递归 另一种是使用栈 将分别讲述 目录 1 递归实现 main函数 C语言版本 2 利用栈实现 mystack h mystack cpp main函数 3 补充 求树高度的函数 1 递归实现
  • 数据结构——堆(带图详解)

    目录 堆 堆的概念 堆的性质 堆的创建 1 堆向下调整 2 堆的创建 3 建堆的时间复杂度 堆的插入和删除 1 堆的插入 2 堆的删除 堆的应用 1 优先级队列的实现 2 堆排序 3 Top k问题 堆 Heap 堆的概念 前面介绍的优先级
  • 我们可以用二叉搜索树来模拟堆操作吗?

    我想知道我们是否可以使用二叉搜索树来模拟堆操作 插入 查找最小值 删除最小值 即使用 BST 来完成相同的工作 这样做有什么好处吗 我们当然可以 但具有平衡的 BST 最小值是最左边的元素 最大值是最右边的元素 找到这些元素是O logn
  • 证明二叉堆构建最大比较是(2N-2)

    我试图证明对于二进制堆 buildHeap 最多会在元素之间进行 2N 2 次比较 我发现很难证明这一说法 构建堆算法从中点开始 并根据需要向下移动项目 让我们考虑 127 个项目 7 个级别 的堆 在最坏的情况下 64 nodes the
  • 为什么在堆排序中使用平面列表?

    In heapsort 数据存储在称为 heap 我见过的几乎所有实现都使用平面列表对于数据结构 有人可以向我解释这是为什么吗 为什么不使用嵌套数组 or an 二叉树的实例 显式不是比隐式更好吗 是因为遍历结构等实现困难 还是其他原因 如
  • python heapq 合并的内部工作。如何在不生成列表的情况下对列表进行排序

    如何heapq merge 即使不生成列表也可以对列表进行排序 不确定我说清楚了没有 所以 这是从leetcode 的超级丑数问题 https leetcode com problems super ugly number 和这个Pytho
  • python topN 最大堆,使用 heapq 还是自己实现?

    python中有heapq 用于一般用途 我想记录topN 0 20 10e7 条记录 如果使用heapq 应该使用 将最大值转换为最小值 并记录底部的最小数量 以调用 heapq heappushpop 我应该使用 heapq 还是自行实
  • 查找存储为 Ahnentafel 数组的二进制最大堆的最小元素

    我有一个二进制最大堆 顶部的最大元素 我需要通过摆脱smallest每次我达到 20 个元素时 二叉堆存储在一个数组中 节点 i 的子节点为 2 i 和 2 i 1 i 从零开始 在任何时候 堆都有 n elements 个元素 介于 0
  • 如何更新 Prim 算法堆中的元素优先级?

    我正在研究Prim算法 代码中有一部分穿过切割的下一个顶点将进入属于MST 在这样做的同时 我们还必须 更新另一组中与离开顶点相邻的所有顶点 这是来自的快照CLRS 有趣的部分在于第 1 行 11 但由于我们在这里使用堆 因此我们只能访问最
  • python 中的最小堆

    我想通过定义自定义比较函数将一组对象存储在最小堆中 我看到有一个 heapq 模块作为 python 发行版的一部分可用 有没有办法在此模块中使用自定义比较器 如果没有 其他人是否构建了自定义最小堆 两个选择 除了 Devin Jeanpi

随机推荐

  • 90后MIT博士开源创业再获5千万美元融资,进军3D数字内容创作者工具

    信息技术奥林匹克大赛获奖 保送清华姚班 麻省理工博士 创业公司CEO 这一组词汇对于大多数人来说仿佛都是可望而不可及的存在 个个都是如此地令人惊叹 随便沾上一个就能走上人生巅峰 但是偏偏能有这么一个人 集 巅峰 于一身 那就是 太极图形 创
  • APISIX Dashboard中文文档(一)

    2022年7月6日13 24 56 APISIX Dashboard中文文档 一 APISIX Dashboard中文文档 二 APISIX Dashboard中文文档 三 官方文档 https apisix apache org zh d
  • 51单片机中断系统的原理和运用

    QX MCS51开发板上使用的是DIP封装 双列直插式 有40只引脚 40只引脚按其功能来分 有三类 一 电源和时钟引脚 Vcc Vss XTAL1 XTAL2 电源引脚接入单片机工作电源 Vcc 40脚 接 5V电源 Vss 20脚 接地
  • java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒

    Java程序将毫秒转换为分钟和秒 在上面的程序中 您将学习如何在Java中将毫秒分别转换为分钟和秒 示例1 将毫秒分别转换为分钟和秒 import java util concurrent TimeUnit public class Mil
  • 【Qt】错误:‘connect‘ was not declared in this scope 解决方法

    这种错误主要出现在在非继承QObject的类中或者一般函数中使用connect导致 原因是connect是QObject的一个static方法 将connet替换为QObject connect即可
  • BUUCTF-随便注、Exec、EasySQL、Secret File

    目录 强网杯 2019 随便注 ACTF2020 新生赛 Exec SUCTF 2019 EasySQL 极客大挑战 2019 Secret File 强网杯 2019 随便注 打开场景 里面有输入框 上面自带一个1 点击提交 有回显 输入
  • 毕业设计 基于单片机的双足机器人

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • starRocks配置两个数据源的多个IP进行访问数据库查询

    1 yml文件配置 注意mysql为master datasource mysql master type com alibaba druid pool DruidDataSource driver class name com mysql
  • 手把手教你如何使用Fiddler及使用图文详解

    01 什么是 Fiddler Fiddler 是一个 HTTP 协议调试代理工具 它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯 Fiddler 提供了电脑端 移动端的抓包 包括 http 协议和 https 协议都可以捕获到报
  • linux中如何修改文件夹的用户权限

    linux中如何修改文件夹权限 linux中 可以使用chown命令来修改文件夹的用户权限 环境 windows 7 virtualbox fedora 15 kde 下面举例给出 1 以普通用户admin登录linux 利用su 切换到r
  • MySQL数据库基本操作-正则表达式

    文章目录 一 基本介绍 二 的用法 三 的用法 四 的用法 五 和 的用法 六 和 的用法 七 的用法 八 的用法 九 的用法 一 基本介绍 正则表达式 regularexpression 描述了一种字符串匹配的规则 正则表达式本身就是一个
  • SpringMVC-整合SSM框架(狂神学习笔记)2021-10-03

    SpringMVC 狂神 整合SSM框架 1 整合SSM 1 环境要求 环境 IDEA Eclipse MySQL 5 7 Tomcat 9 Maven 3 6 要求 需要熟练掌握MySQL数据库 Spring JavaWeb及MyBati
  • day01(Flume)

    简介 一 概述 Flume是Apache提供的一套用于进行日志收集 汇聚和传输的框架 2 Flume的版本 Flume ng 和Flume og 不兼容 a Flume1 x Flume ng b Flume0 X Flume og htt
  • [leetcode 双周赛 6] 1152 用户网站访问行为分析

    目录 1152 Analyze User Website Visit Pattern 用户网站访问行为分析 描述 思路 代码实现 1152 Analyze User Website Visit Pattern 用户网站访问行为分析 描述 为
  • 依赖注入_生命周期

    目录 一 生命周期 二 三种不同生命周期对象比较 1 AddTransient 瞬时生命周期 2 AddSingleton 单例 3 AddScoped 总结 三者的区别 一 生命周期 1 给类构造函数中打印 看看不同生命周期的对象创建使用
  • 前端高频面试题

    我们在找工作时 需要结合自己的现状 针对意向企业做好充分准备 什么是前端开发 前端开发的作用是什么 前端开发是指利用HTML CSS和JavaScript等技术 开发用户在浏览器中直接与之交互的网页或应用的过程 前端开发的作用是将后端提供的
  • 动态规划,计算股票最大收益

    问题描述 给定一个整数数组prices 它的第i个元素prices i 是一支给定的股票在第i天的价格 设计一个算法来计算你所能获取的最大利润 算法思路 动态规划 C 源码 class Solution public 1 最多交易一次 in
  • 详细!PyCharm连接MySQL数据库教程+心得

    一家懂得用细节留住客户的3年潮牌老店我必须支持 luyao1931 第一步 安装MySQL 下载地址 https dev mysql com downloads mysql 下载完后 我们将 zip 包解压到相应的目录 这里我将解压后的文件
  • 二叉树问题

    什么是二叉树 平衡二叉树 红黑二叉树 有哪些区别和应用 二叉树 Binary Tree 是结点的有限集合 这个集合或者为空 或者是由一个根结点和两颗互不相交的分别称为左子树和右子树的二叉树组成 二叉树中的每个结点至多有两棵子树 且子树有左右
  • 堆(Heap)——(一)优先队列

    堆可以利用数组 链表或者搜索二叉树实现 但是最好方法是利用完全二叉树 1 完全二叉树 完全二叉树从根结点到倒数第二层满足完美二叉树 最后一层可以不完全填充 其叶子结点都靠左对齐 如下图 重新构建一种树 专注于插入和删除最大或最小 即 根节点