堆的基本概念

2024-06-17 04:44
文章标签 基本概念

本文主要是介绍堆的基本概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 堆是一个完全二叉树
    • 完全二叉树的要求,除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列
  • 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值
    • 堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值
最大堆
  • 结点的键值小于等于其父结点的键值
  • 请添加图片描述
最小堆
  • 结点的键值大于等于其父结点的键值
  • 请添加图片描述
已知父结点
    • 左孩子结点: 2 * 父结点 + 1
    • 右孩子结点: 2 * 父结点 + 2
    • 左孩子结点: 2 * 父结点
    • 右孩子结点: 2 * 父结点 + 1
已知孩子结点
    • 父结点: 孩子结点 - 1 / 2
    • 父结点: 孩子结点 / 2
堆化(heapify)
  • 堆化实际上有两种,从下往上从上往下
    • 从下往上
      • 请添加图片描述

      • 就是顺着节点所在的路径,向上或者向下,对比,然后交换

      • 请添加图片描述

      • 让新插入的节点与父节点对比大小。如果不满足子节点小于等于父节点的大小关系,就互换两个节点

      • 一直重复这个过程,直到父子节点之间满足刚说的哪种大小关系

    • 从上往下
      • 请添加图片描述

      • 把最后一个节点放到堆顶,然后利用同样的父子节点对比的方法

      • 对于不满足父子节点大小关系的,互换两个节点,并且重复进行这个过程,直到父子节点之间满足大小关系为止

    • 时间复杂度
      • 一个包含n个节点的完全二叉树,树的高度不会超过log2n
      • 堆化的过程是顺着节点所在路径比较的,所以堆化的时间复杂度跟树的高度成正比,也就是O(logn)
      • 插入数据和删除堆顶元素的主要逻辑是堆化,所以,往堆中插入一个元素和删除堆顶元素的时间复杂度都是O(logn)
如何基于堆实现排序
  • 时间复杂度: O(nlogn)
  • 建堆
    • 堆排序是原地排序,不借助另一个数组,就在原数组上操作

    • 第一种,在堆中插入一个元素的思路

      • 通过从下往上的插入方式,把n个数据插入数组中,形成堆
    • 第二种,与第一种相反

      • 是从后往前处理数组,并且每个数据都是从上往下堆化

      • 请添加图片描述

      • 请添加图片描述

    • 代码实现

      • 请添加图片描述

      • 这段代码里,从下标 n / 2 开始到1的数据进行堆化

      • 下标 n / 2 +1 到 n 的节点是叶子节点,不需要堆化

      • 从上图代码中,可以看出每个节点的堆化时间复杂度: O(logn)

    • 时间复杂度

      • 每个节点堆化的时间复杂度是O(logn), 那么 n / 2 + 1的总时间复杂度是 O(nlogn)?

      • 请添加图片描述

      • 求和公式

        • 请添加图片描述

        • 求解

          • 把公式左右都乘以2,得S2, 然后 S2 - S1 = S

          • 请添加图片描述

          • 求解等比数列

          • 请添加图片描述

          • 因为 h = log2n ,代入公式S,得到S = O(n)

        • 解答过程

          • 请添加图片描述
      • 所以,建堆时间复杂度为:O(n)

  • 排序
    • 请添加图片描述

    • 时间复杂度

      • 整个堆排序的过程,都只需要极个别临时存储空间,所以堆排序是原地排序算法
      • 堆排序包括建堆和排序两个操作,建堆过程的时间复杂度是 O(n),排序过程的时间复杂度是 O(nlogn),所以,堆排序整体的时间复杂度是 O(nlogn)
      • 堆排序不是稳定的排序算法,因为在排序的过程,存在将堆的最后一个节点跟堆顶节点互换的操作,所以就有可能改变值相同数据的原始相对顺序
为什么快速排序比堆排序性能更好?
  • 堆排序数据访问的方式没有快速访问友好
    • 对于快速排序来说,数据是顺序访问的。而对于堆排序来说,数据是跳着访问的
      • 比如数据的堆化
        • 请添加图片描述

        • 对堆顶节点进行堆化,会依次访问数组下标为1,2,4,8的元素,而不是像快速排序那样,局部顺序访问,所以,这样对CPU缓存是很不友好的

    • 对于同样的数据,在排序过程中,堆排序算法数据交换次数要多于快速排序
      • 在讲排序的时候,提过两个概念,有序度和逆序度
      • 对于基于比较的排序算法来说,整个排序过程就是由两个基本的操作组成的,比较和交换(或移动)
      • 快速排序
        • 快速排序数据交换的次数不会比逆序度多
      • 堆排序
        • 堆排序的第一步是建堆,建堆的过程会打乱数据原有的相对先后顺序,导致原数据有序度降低

        • 请添加图片描述

        • 对于一组已经有序的数据来说,经过建堆之后,数据反而变得更加无序了

这篇关于堆的基本概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068504

相关文章

音视频开发基础知识(1)——图像基本概念

像素 **像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。**在下面这张图中,你可以看到一个个方块,这些方块就是像素。 分辨率 图像(或视频)的分辨率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如说一张1920x1080的图像,前者1920指的是该图像的宽度方向上有1920个像素点,而后者1080指的是图像的高 度方向上有1080个像素点。

CloudStack基本概念-Zone,Pod,Cluster,Host

ZonePodClusterHost Zone Zone(资源域)是CloudStack部署中第二大的组织单元。Zone一般对应一个数据中心,虽然一个数据中心也可以有多个Zone。 把基础设施组织进Zone的一个好处就是可以提供物理隔离和冗余。 例如每个Zone可以有自己的电源供应和网络线路,并且zone之间可以远远地隔离开(虽然不是必须的) 一个zone包括:

HTTP基本概念介绍

HTTP概述 HTTP : 超文本传输协议,HTTP是浏览器端Web通信的基础。 一, 两种架构 B/S架构:Browser/Server,浏览器/服务器架构。 B:  浏览器,比如Firefox 、Google 、Internet; S:  服务器,Apache,nginx; C/S架构:Client/Server,客户端/服务器架构。 B/S架构相对于C/S架构,客户机上无需安装任何软件

python爬虫学习笔记一(基本概念urllib基础)

学习资料:尚硅谷_爬虫 学习环境:  pycharm 一.爬虫基本概念 爬虫定义 > 解释1:通过程序,根据URL进行爬取网页,获取有用信息 > 解释2:使用程序模拟浏览器,向服务器发送请求,获取相应信息 爬虫核心 > 1.爬取整个网页 > 2.解析数据,获取关心的数据 > 3.难点:爬虫VS非爬虫 爬虫设计思路 > 1.确定爬取的url  > 2.模拟浏览器通过http协议访问url

DRM Wayland基本概念

1.linux系统中查看屏幕分辨率(通常是在设备树中进行配置的) #2代设备,实际物理尺寸-1.9英寸$cat /sys/class/graphics/fb0/virtual_size170,320#3代设备,实际物理尺寸-2.97英寸$cat /sys/class/graphics/fb0/virtual_size480,800 2.lcd外设选型参数 (1)物理尺寸(2)硬件

动态规划:基本概念

Dynamic Programming 动态规划(Dynamic Programming, DP) 是一种算法设计技巧,通常用来解决具有重叠子问题和最优子结构性质的问题。它通过将问题分解为更小的子问题,逐步解决这些子问题并将结果存储起来,以避免重复计算,从而提高效率。 1. 特点 1.1 重叠子问题 在许多递归问题中,计算过程中会多次遇到相同的子问题。如果我们每次遇到这些子问题时都重新

搜索引擎推广基本概念与方法分享-华媒舍

销量是每个企业及个人在商业领域中追求的目标之一。而引擎霸屏推广就是一种高效的手段,通过该方法可以助你实现销量的狂揽。本文将为你科普引擎霸屏推广的基本概念与方法,帮助你了解如何运用这一有效的推广策略。 一、引擎霸屏推广 引擎霸屏推广指的是在搜索引擎结果页(SERP)上获得最佳的曝光位置,以吸引更多用户点击访问,从而提高销量。要实现引擎霸屏推广,需要掌握以下要素: 二、SEO优化 搜索引擎

[DTS]设备树基本概念

一、什么是设备树  在Linux3.x之前的内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录。为了解决这个问题而引入设备树。  官方对设备树的描述是,一种描述硬件资源的数据结构。 它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。  设备树的主要优势:对于同一SOC的不同主板,只

javascript学前基本概念

基本概念 什么是javascript? 基于对象的、事件驱动的、与平台无关的、弱类型的脚本语言。 强类型和弱类型? 在声明变量时,必须指定变量的类型,则为强类型的语言。 在声明变量的时候,不需要指定变量的类型,则为弱类型的语言。 javascipt在html页面中的执行顺序? javascript在html页面的任何位置都行,执行顺序为从上

爬虫基本概念

一、爬虫的基本概念         二、聚焦网络爬虫架构      三、搜索引擎工作原理