堆(Heap)

堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。同时堆是一种特殊的“队列

完全二叉树

既然说堆是完全二叉树,那么就得介绍下什么是完全二叉树

定义:若设二叉树的高度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,且第h层所有的节点都连续集中在最左边,这就是完全二叉树。

完全二叉树是由满二叉树而引出来的。对于深度为K,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

若一棵二叉树至多只有最下面两层的结点的度数可以小于2,并且最下层的结点都集中在该层最左边的若干位置上,则此二叉树为完全二叉树。

完全二叉树的性质

  1. 设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,则n0=n2+1
  2. n层完全二叉树,在1~n-1层,节点个数为2^(n-1),在第n层,节点数范围为[1,2 ^ (n-1)]

堆的特点

堆的两个特性:

  1. 结构性:用数组表示的完全二叉树
  2. 任意节点的关键字是其子树所有节点的最大值(或者最小值)
    • “最大堆(Max Heap)”也称大顶堆:最大值
    • “最小堆(Min Heap)”也称小顶堆:最小值

最大堆

最小堆

把最大堆和最小堆的逻辑结构映射到数组中,如下图

数组arr下标从零开始
对于最大堆:arr[i] >= arr[2i + 1] && arr[i] >= arr[2i + 2]

对于最小堆:arr[i] <= arr[2i + 1] && arr[i] <= arr[2i + 2]

Ps:此篇文章主要供自己复习所用,若读者发现错误,欢迎跟我指出

数据结构之——堆(Heap)相关推荐

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

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

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

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

  3. 数据结构之堆(Heap)及其用途

    本文采用图文码结合的方式介绍堆来实现优先队列 什么是优先队列? 队列是一种先进先出(FIFO)的数据结构.虽然,优先队列中含有队列两个字,但是,他一点也不像队列了.个人感觉,应该叫他优先群.怎么说那, ...

  4. 数据结构之堆Heap

    1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...

  5. Java数据结构之堆(Heap)

    文章目录 一.基本概念 二.上浮操作(siftUp) 三.下沉操作(siftDown) 四.数组堆化 五.实现大根堆 提示:以下是本篇文章正文内容,Java系列学习将会持续更新 一.基本概念 堆在逻辑 ...

  6. 数据结构-堆(Heap)

    数据结构-堆(Heap) 我认识的堆: 1.建立在完全二叉树的基础上 2.排序算法的一种,也是稳定效率最高的一种 3.可用于实现STL中的优先队列(priority_queue)  优先队列:一种特殊 ...

  7. 数据结构--堆Heap

    数据结构:堆(Heap) 堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针.堆根据"堆属性"来排序,"堆属性"决定了树中节点的位置. 堆的常用方法: 构 ...

  8. heap python_数据结构-堆(Heap) Python实现

    堆(Heap)可以看成近似完全二叉树的数组,树中每个节点对应数组中一个元素.除了最底层之外,该树是完全充满的,最底层是从左到右填充的. 堆包括最大堆和最小堆:最大堆的每一个节点(除了根结点)的值不大于 ...

  9. 数据结构--堆(Heap)

    堆(Heap) 本文主要介绍以下内容: Heap的实现 HeapSort(堆排序) 完善各种堆的函数接口 TopK经典问题 堆就是一棵完全二叉树.因为它的某些性质,我们可以用数组存储. 堆的性质 1 ...

最新文章

  1. tpopela/vips_java
  2. HTTPS 接入优化建议
  3. android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
  4. 正则表达式——获取指定IP的物理地址(二)
  5. 2月第3周全球五大顶级域名总量净减6.1万个 降幅明显
  6. cube一站式云原生机器学习平台-推理服务的工程化加速
  7. php array_diff 用法
  8. 类模板使用示例(二)类模板整体特化
  9. Atitit dubbo使用总结 attilax总结 艾龙 总结 1. 概念 1 1.1. Dubbo提供的注册中心有如下几种类型可供选择: 2 1.1.1. Multicast注册中心 2 1.1
  10. php 字符显示不出来,ps文字显示不出来怎么办?
  11. 商标知识:食品行业商标注册应注册哪几个类别?
  12. 体脂秤方案开发脂肪秤方案设计
  13. 干货 | 应用打包还是测试团队老大难问题?
  14. 移动端网页开发-vh/vw/rem
  15. 基于人工智能算法的多元负荷预测
  16. NOSuchKeys: com.aliyun.oss.OSSException: The specified key does not exist.
  17. 互联网35岁会被清退,这可能是2022年最大的谎言
  18. Python实现12306自动抢票小程序
  19. 操作系统之进程的同步机制
  20. java excel 电话号码_java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来...

热门文章

  1. PMPBOK6之项目管理的33个文件
  2. 使用MyQR制作二维码
  3. java oval_Java开源可扩展数据验证框架之OVAL
  4. 从“上云”到“云管理”,中国首个多云管理平台评估标准有何妙处?
  5. 【头部姿态】头部姿态检测(一)
  6. 苹果手机怎样用计算机打开快手,快手手机电脑怎么连接
  7. 深度学习之Bottleneck Layer or Bottleneck Features
  8. mysql workbench 6.3 ce 中文版_Mysql workbench
  9. python手机壁纸超清_python爬虫学习之爬取5K分辨率超清唯美壁纸
  10. matlab 一元方程程序,用牛顿方法解一元非线性方程的根(Matlab实现)