数据结构【堆】的认识及建立

2023-10-31

目录

 

一.堆

1.什么是堆:

2.堆的存储方式

二.堆的建立与存储

三.堆的应用

1.堆排序

2.对顶堆


一.堆

1.什么是堆:

堆(Heap)是一种特殊的完全二叉树结构,其中最大堆(Max Heap)或最小堆(Min Heap)的每个节点的键值都大于或小于其子节点。在计算机科学中,堆通常用于实现优先队列,以及堆排序和图算法等算法的实现中。最大堆在堆排序中被广泛使用,最小堆通常用于贪心算法和Dijkstra算法等图算法的实现中。

堆是一种可以快速查询最大值和最小值,可以插入元素,删除最大值的数据结构。堆的本质是一棵完全二叉树。

2.堆的存储方式

对于一棵完全二叉树,其中每个节点都按照从上到下、从左到右的顺序依次编号为1到N。这个编号方案可以被看作是完全二叉树的一种“标准”编号方式。

以下是一个按1-N编号的完全二叉树的例子:

     1
   /   \
  2     3
 / \   / \
4   5 6   7

在这个例子中,节点1是根节点,它的左右子节点分别是节点2和节点3;节点2的左右子节点分别是节点4和节点5;节点3的左右子节点分别是节点6和节点7。

这种按1-N编号的完全二叉树通常被用于描述堆数据结构。在堆中,节点i的左子节点是节点2i,右子节点是节点2i+1;节点i的父节点是节点i/2(向下取整)。这个编号方案简化了堆操作的实现。

这样,寻找一个点的父节点,孩子只需要对它的下标进行算数运算,这种存储方式被称为“堆式存储”,常用来存储完全二叉树;

堆顶维护的是最大值的叫大根堆

堆顶维护的是最小值的叫小根堆

大根堆的父节点一定大于等于子节点的值,小根堆反之;

二.堆的建立与存储

手写堆我就不过多讲述具体可以看下这篇博客

我主要讲一下用STL中的优先队列来实现堆

//大根堆priority_queue<int> q1;
//小根堆priority_queue<int,vector<int>,greater<int> >q2;

注意小根堆,最后两个>号之间要打空格,否则编译器会认为是位运算符号>> 

三.堆的应用

1.堆排序

是一种由堆产生的排序算整体复杂度为O(nlogn),是稳定的排序算法代码

手写堆:

public void HeapSort() {
    int end = usedSize-1;
    while(end>0) {
        int tmp = elem[0];
        elem[0] = elem[end];
        elem[end] = tmp;
        shiftUp(0,end);
        end--;
    }
}

  STL只需压进堆内从堆顶开始输出即可;

大根堆排的是降序

小根堆是升序

2.对顶堆

对顶堆是堆的变形,具体可参考这篇博客

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

数据结构【堆】的认识及建立 的相关文章

  • 初识哈夫曼编码

    1 什么是哈夫曼编码 1 什么是编码 编码就是把一些信息比如文字文件 视频文件转成0101的一堆数字存储起来 这些数字就是编码 它们需要满足数字与字符的一一对应关系 当然还必须满足可以由这一堆数字转回到文件信息 这样的编码才是有意义的 2
  • 链表【1】

    文章目录 2 两数相加 1 题目 2 算法原理 3 代码实现 445 两数相加 II
  • 链表【2】

    文章目录 24 两两交换链表中的节点 题目 算法原理 代码实现 143 重排链表
  • 算法题-简单系列-07-判断一个链表是否为回文结构

    文章目录 1 题目 1 1 使用list集合判断 1 题目 给定一个链表 请判断该链表是否为回文结构 回文是指该字符串正序逆序完全一致 1 1 使用list集合判断 因为需要判断是否为回文结构 所以要比较头尾的数据 而链表无法随机查询数据
  • 算法题-简单系列-05-两个链表的第一个公共结点

    文章目录 1 题目 1 1 思路1 循环遍历 1 题目 输入两个无环的单向链表 找出它们的第一个公共结点 如果没有公共节点则返回空 1 1 思路1 循环遍历 使用两个指针N1 N2 一个从链表1的头节点开始遍历 我们记为N1 一个从链表2的
  • D (1173) : A DS二叉树_合并二叉树

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 给定两个二叉树 输出这两个二叉树合并后形成的二叉树 依次输出前序遍历 中序遍历 后序遍历 二 输入与输出 1 输入 第一行输入t 表示有t个测试样例 第
  • 不会做的题汇总

    摘苹果 题目描述 小红来到苹果园 帮园长摘苹果 园长请小红把摘完的苹果的最小的那个去掉 如果有 多个最小的苹果 那么都要去掉 剩余的苹果算一下平均一个苹果有多重 平均重 量请保留1位小数 输入 输入有2行 第一行 一个整数n代表小红摘的n个
  • 【C++】手撕string思路梳理

    目录 基本思路 代码实现 1 构建框架 2 构建函数重载 3 迭代器 4 遍历string 5 resetve 开空间 insert任意位置插入push back append 按顺序依次实现 6 erase删除 clear清除 resiz
  • 八大排序(希尔排序)

    上篇文章我们来看了看插入排序是怎么实现的 本章内容就是在插入排序的基础上完成希尔排序 希尔排序是一个比较强大的排序 我们希尔排序的时间复杂度是比较难算的 这里直接给出的结论就是时间复杂度就是O N 1 3 比较难算的原因就是我们每一次的次数
  • c 关于数组几个查序程序

    1 查询某元素是否在数组中 int main void char i 10 2 1 7 2 10 5 2 0 1 4 10 10 1 3 1 0 8 char z 10 1 2 3 4 1 4 6 8 0 9 int zz 0 标志位 0
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • DS八大排序之冒泡排序和快速排序

    前言 前两期我们已经对 插入排序 直接插入排序和希尔排序 和 选择排序 直接选择排序和堆排序 进行了详细的介绍 这一期我们再来详细介绍一组排序 交换排序 即耳熟能详的冒泡排序和赫赫有名的快速排序 本期内容介绍 冒泡排序 快速排序 Hoare
  • 每日一练2023.12.17——大笨钟的心情【PTA】

    题目链接 L1 077 大笨钟的心情 题目要求 有网友问 未来还会有更多大笨钟题吗 笨钟回复说 看心情 本题就请你替大笨钟写一个程序 根据心情自动输出回答 输入格式 输入在一行中给出 24 个 0 100 区间内的整数 依次代表大笨钟在一天
  • 力扣每日一题:162. 寻找峰值(2023-12-18)

    力扣每日一题 题目 162 寻找峰值 日期 2023 12 18 用时 10 m 9 s 时间 0 ms 内存 40 54 MB 代码 class Solution public int findPeakElement int nums i
  • Redis 底层数据结构

    在 Redis数据结构和对象机制 中提到的图中 我们知道 可以通过 redisObject 对象的 type 和 encoding 属性 可以决定Redis 主要的底层数据结构 SDS QuickList ZipList HashTable
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 【数据结构和算法】 K 和数对的最大数目

    其他系列文章导航 Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一 题目描述 二 题解 2 1 方法一 双指针排序 三 代码 3 1 方法一 双指针排序 3
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • 排序:计数排序

    一 概念 计数排序是非比较排序 是对哈希直接定址法的变形应用 二 思想 利用数组统计相同数据出现的次数 例如整型数据m出现n次 就在数组m位置记录数据为n 最后从头遍历数组打印数据即可 通俗来讲就是 数组下标即为数据 下标所指位置的值即为数
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • python三方模块nltk

    nltk Natural Language Toolkit 是一个Python第三方模块 用于处理自然语言处理 NLP 任务 它提供了许多工具和数据集 可以帮助开发人员对自然语言文本进行分词 词性标注 句法分析 语义分析 语料库管理等操作
  • JAVA开发:前端+后端面试题

    一 java基础面试题 1 JDK和JRE有什么区别 JRE Java Runtime Environment java 运行时环境 即java程序的运行时环境 包含了 java 虚拟机 java基础类库 JDK Java Developm
  • 合并二叉树

    将这两棵树合并成一棵新二叉树 合并的规则是 如果两个节点重叠 那么将这两个节点的值相加作为合并后节点的新值 否则 不为NULL的节点将直接作为新二叉树的节点 方法1 使用递归 递归三部曲 1 参数和返回值 参数为两个二叉树的根结点 返回值为
  • 学计算机买电脑显卡1605ti够吗,GTX1650和GTX1050Ti哪个好?GTX1050ti和GTX1650性能差距对比评测...

    GTX1650显卡在2019年4月22日进行发售 不少用户认为GTX1650是智商检测卡 真的是吗 从命名上来看 GTX1650应该是GTX1050的升级产品 不过根据英伟达的说法 GTX1650相比GTX1050提升幅度达到了70 但是相
  • HTML5 Web Worker深入浅出教程

    HTML5 Web Worker简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始 HTML5 承载了越来越多崭新的特性和功能 它不但强化了 Web 系统或网页的表现性能 而且还增加了对本地数据库等 Web 应用功能的支持
  • 机器学习评估方法——P值校验

    目标 假设在 0 05的情况下 根据舆情监测项目需求 查看召回率和准确率的置信区间 均值 过程 1 输入数据 三列分别是precision recall f1 score 每一列分别计算 以此为例 一共四十行 即样本容量为40 2 计算标准
  • linux下登陆mysql失败

    一 提示由于没有密码 拒绝登陆 ERROR 1045 28000 Access denied for user root localhost using password NO 1 关闭mysql service mysqld stop2
  • mysql索引之B+树

    1 概述 提到B 树就不得不提及二叉树 平衡二叉树和B树这三种数据结构了 B 树就是从他们三个演化来的 众所周知B 树是一种常见的数据结构 被广泛应用于数据库和文件系统等领域 B 树的设计目标是保持树的平衡性 以提供稳定的性能 并且适用于大
  • 链表插入详解

    单链表速成 增与删 众所周知 链表是数据结构的重中之重 但有许多朋友对此并不感冒 甚至想骂 本文主要介绍小编对于链表的喜与悲 乐于忧 先上图 添加结点 单链表结点类型声明 typedef int ElemType 假设ElemType为自定
  • python捕获异常时,打印异常的类型、报错文件、与报错所在的行

    捕获异常 异常的完整代码是 try raise Exception wa except print 报错 else print 没有报错 finally print 程序关闭 得到结果 报错 程序关闭 一般程序里的 try与except是一
  • 如何优化一个肽预测模型

    要优化一个肽预测模型 首先需要考虑的是输入数据的质量 确保输入的数据是完整的 正确的 而不是噪声数据 此外 还需要考虑模型的训练方式 比如是否使用正则化和提前停止来确保不会过拟合训练数据 最后 应该尝试在模型中使用不同的参数来改善模型的性能
  • 02 Java基本数据结构之队列实现

    系列文章目录 01 Java基本数据结构之栈实现 02 Java基本数据结构之队列实现 03 Java基本数据结构之优先级队列 04 Java基本数据结构之链表 如有错误 还请指出 文章目录 系列文章目录 前言 一 队列 简述 二 栈 数组
  • 【Hyperledger Fabric】学习笔记1—— 区块链介绍

    目录 1 区块链介绍 1 1 区块链技术起源 1 1 1 区块链技术 1 1 2 区块链技术发展 1 2 区块链核心技术 1 2 1 定义 1 2 2 区块链技术原理 1 2 3 区块链工作过程 1 3 区块链开发平台 1 3 1 公有链平
  • GIT使用教程(十五步吃透,全网最详细)

    一 安装GIT 到官网下载GIT https git scm com downloads 二 创建仓库 在要创建仓库的文件夹空白地方点击右键 在弹出的菜单中点击 GIT Bash Here 然后初始化仓库 git init 成功后该文件夹中
  • MySQL配置和设置问题小结

    问题1 root Tony ts tian bin mysqladmin uroot password kaka123 mysqladmin connect to server at localhost failed ERROR 1045
  • [4G+5G专题-144]: 测试-频谱分析仪工作原理与测试结果分析

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123222945 目录 前言 第1章
  • RSA/数字证书/签名原理详解

    文中首先解释了加密解密的一些基础知识和概念 然后通过一个加密通信过程的例子说明了加密算法的作用 以及数字证书的出现所起的作用 接着对数字证书做一个详细的解释 并讨论一下windows中数字证书的管理 最后演示使用makecert生成数字证书
  • 优惠卷测试案例

    提示 过期优惠卷 不同等级的用户 叠加使用 退款 支付失败 取消支付 退款中 订单信息 网络问题 退货 兼容性 优惠券是否可以正常使用 外观是否与UI保持一致 部分商品是否能正常使用 购买商品的时候会不会提示使用优惠券 优惠券是否能分享 分
  • git锁住如何解决GitLab: Your account has been blocked.

    今天用gitpush和pull的时候出现了一个问题 报了一个错误 GitLab Your account has been blocked 然后我怀疑是账号错误 然后发现账号密码对 后来发现是两个git账号同时占用了一个目录 强制删除目录下
  • 数据结构【堆】的认识及建立

    目录 一 堆 1 什么是堆 2 堆的存储方式 二 堆的建立与存储 三 堆的应用 1 堆排序 2 对顶堆 一 堆 1 什么是堆 堆 Heap 是一种特殊的完全二叉树结构 其中最大堆 Max Heap 或最小堆 Min Heap 的每个节点的键