【一】简介

  • 最小堆是一棵完全二叉树,非叶子结点的值不大于左孩子和右孩子的值。本文以图解的方式,说明最小堆的构建、插入、删除的过程。搞懂最小堆的相应知识后,最大堆与此类似。
  • 最小堆示例:

【二】最小堆的操作

最小堆的构建:
      初始数组为:9,3,7,6,5,1,10,2

按照完全二叉树,将数字依次填入。

填入完成后,从最后一个非叶子结点(本示例为数字6的节点)开始调整。

根据性质,小的数字往上移动;至此,第1次调整完成。

注意,被调整的节点,还有子节点的情况,需要递归进行调整。

第二次调整,是数字6的节点数组下标小1的节点(比数字6的下标小1的节点是数字7的节点),

以下是本示例的图解:

注意:数字9的节点 将和 数字1的节点 发生对调,对调后,需要递归进行调整,请一定注意。

  • 最小堆的元素插入 【插入到该二叉树的最后一个节点,再调整】

以上个最小堆为例,插入数字0。

数字0的节点首先加入到该二叉树最后的一个节点,依据最小堆的定义,自底向上,递归调整。

以下是插入操作的图解:

  • 最小堆的节点删除【是把根节点删除,最后一个叶子节点放到根节点上,再调整】

对于最小堆和最大堆而言,删除是针对于根节点而言。

对于删除操作,将二叉树的最后一个节点替换到根节点,然后自顶向下,递归调整。

以下是图解:

【三】有一类常见的面试问题:

如何从一个存有10亿个数字的文档中获取到最大的10个数,计算机内存只有1M?

考虑10亿个数据很多,一次性无法装到我们的计算内存中,
采用常用的排序算法,可能也是不好进行操作,数据量很大,
这个地方可以想到可以才用小顶堆来解决这个问题。

1、让计算机去io读取文件
2、把读取出来的数据去构建一个包含10个元素的小顶堆
3、构建完成后,每次从文件中读取出来的一个数字和堆顶的元素进行比较,
如果比堆顶元素小,就直接丢弃或者跳过。如果读取出来的数据比堆顶元素大,
那么就可以用这个元素替代堆顶元素,进行调整小顶堆。这个算法的时间复杂度是O((100亿-1000)log(1000)),即O((N-M)logM),空间复杂度是M

转自:https://blog.csdn.net/wenge1477/article/details/101797674

数据结构 小顶堆建堆过程 构建过程相关推荐

  1. 用Java实现二叉堆、大顶堆和小顶堆

    先了解了解 什么是二叉堆 二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树.在二叉树建树时采取前序建树就是建立的完全二叉树.也就是二叉堆.所以二叉堆的建堆过程理论上讲和前序建树一样. 什么是大顶 ...

  2. 数据结构:堆的实现与建堆时间复杂度分析

    目录 前言 一.堆的介绍 1.堆的本质 2.堆的分类 二.堆的实现(以小根堆为例) 1.关于二叉树的两组重要结论: 2.堆的物理存储结构框架(动态数组的简单构建) 3. 堆元素插入接口(以小根堆为例) ...

  3. C++大顶堆和小顶堆

    C++大顶堆和小顶堆 原理 大顶堆 小顶堆 大顶堆和小顶堆对比图 大顶堆和小顶堆的实现代码 vector和push_heap.pop_heap实现堆 建堆 调整堆 priority_queue实现堆 ...

  4. vue 源码学习(一) 目录结构和构建过程简介

    Flow vue框架使用了Flow作为类型检查,来保证项目的可读性和维护性.vue.js的主目录下有Flow的配置.flowconfig文件,还有flow目录,指定了各种自定义类型. 在学习源码前可以 ...

  5. vue 源码学习(一) 目录结构和构建过程简介 1

    Flow vue框架使用了Flow作为类型检查,来保证项目的可读性和维护性.vue.js的主目录下有Flow的配置.flowconfig文件,还有flow目录,指定了各种自定义类型. 在学习源码前可以 ...

  6. 小顶堆数据结构C/C++代码实现

    相比队列和栈,很多人可能对堆的概念比较陌生,下面个给出堆的本质概念 一.堆也是一种数据结构,从实际应用意义来说,他是一种最优级别数据永远在第一位的队列,本文皆以最小值为例(小顶堆),即它变相是一种会永 ...

  7. [数据结构]Python Heapq库--小顶堆

    一.heapq库简介 heapq 库是Python标准库之一,提供了构建小顶堆的方法和一些对小顶堆的基本操作方法(如入堆,出堆等),可以用于实现堆排序算法. 堆是一种基本的数据结构,堆的结构是一棵完全 ...

  8. python树结构实现小顶堆_数据结构和算法入门之小顶堆和大顶堆Python实现

    首先简单提一下小顶堆和大顶堆,其本质是一颗完全二叉树,不同点在于:除叶子节点外,小顶堆的每个父节点的key都要比其左右两个子节点的key小:大顶堆的每个父节点的key都要比其左右两个子节点的key大. ...

  9. 数据结构之堆——C++实现大顶堆和小顶堆

    大小顶堆的实现 什么是大顶堆和小顶堆 大小顶堆的底层实现 代码实现小顶堆 定义小顶堆类 构造函数 插入 扩大堆数组容量 删除 析构函数 代码实现大顶堆 测试 什么是大顶堆和小顶堆 堆是一种完全二叉树. ...

最新文章

  1. (一)神经网络训练不起来怎么办:局部最小值(local minia)与鞍点(saddle point)
  2. Windows Mobile 5.0 设备的目录变化
  3. 可微分的「OpenCV」:这是基于PyTorch的可微计算机视觉库
  4. 张晓帆:一个决定将47万奖金全部投入科研的博士生
  5. 解析solidity的event log
  6. 网易新闻 时事新闻抓取链接
  7. Jquery 插件集合
  8. flowable 中的互斥网关、并行网关、兼容网关、事件网关
  9. html隔一行的代码,HTML n种方式实现隔行变色的示例代码
  10. nexus下载地址分享
  11. 微信公众平台接口调试工具json格式不对怎么搞_关于测试一个接口的面试题
  12. A very hard mathematic problem(二分)
  13. wamp php不可用_PHPWAMP开启php
  14. G729调用方法及使用wavlib播放出现颤音的解决方法
  15. 一周学好python_学好 Python 的 11 个优秀资源
  16. P5692 手牵手走向明天
  17. python数据库开发 dga_使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...
  18. 一篇文章带你快速了解荧光蛋白
  19. 锐捷睿易:扩大DHCP掩码导致AP不上线问题
  20. java环境安装(java环境安装教程)

热门文章

  1. 搭建docker私有仓库 配置用户名密码
  2. python当中的metaclass使用
  3. 新货 升级版 BlackBerry手机条码扫描器 MS50,和BlackBerry 9900等手机可以完美结合
  4. linux更改设备树,petalinux 修改设备树
  5. debian安装ssh服务
  6. Compare T-Shirt Sizes
  7. Acunetix 简介 为什么需要保护您的 Web 应用程序
  8. 理解Project2007中的视图
  9. Sql declare申明变量
  10. 心理应激微反应刑事侦查应用,社交行为、情绪行为、生物行为,说谎掩饰,单向表达不分析,情绪反应管理机制,惊讶,厌恶,愤怒,恐惧,悲伤,愉悦