堆的基本概念

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

相关文章

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

【Rocketmq入门-基本概念】

Rocketmq入门-基本概念 名词解释名称服务器(NameServer)消息队列(Message Queue)主题(Topic)标签(Tag)生产者(Producer)消费者(Consumer)拉取模式(Pull)推送模式(Push)消息模型(Message Model) 关键组件Broker消息存储工作流程 名词解释 名称服务器(NameServer) 定义: 名称服务器

数据结构的基本概念和术语的一些介绍

数据:是客观事物的符号表示,包括两种:                  数值型(整数,实数)和非数值型(文字,图形,声音 数据元素:是数据的基本单位,通常作为一个整体进行表示。                  与数据的关系:是数据集合的个体 数据项:组成数据元素的不可分割的最小单位。 以上三者的关系:数据>数据元素>数据项                  例如:学生表>个人记录>

【DL--05】深度学习基本概念—函数式模型

函数式模型 函数式模型算是本文档比较原创的词汇了,所以这里要说一下 在Keras 0.x中,模型其实有两种,一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,跨层连接统统没有。这种模型编译速度快,操作上也比较简单。第二种模型称为Graph,即图模型,这个模型支持多输入多输出,层与层之间想怎么连怎么连,但是编译速度慢。可以看到,Sequentia

【DL--04】深度学习基本概念—data_format

data_format 这是一个无可奈何的问题,在如何表示一组彩色图片的问题上,Theano和TensorFlow发生了分歧,’th’模式,也即Theano模式会把100张RGB三通道的16×32(高为16宽为32)彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种方式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数。后面两个就是高和宽了。这种t

【DL--03】深度学习基本概念—张量

张量 TensorFlow中的中心数据单位是张量。张量由一组成形为任意数量的数组的原始值组成。张量的等级是其维数。以下是张量的一些例子: 3 # a rank 0 tensor; this is a scalar with shape [][1. ,2., 3.] # a rank 1 tensor; this is a vector with shape [3][[1., 2., 3.]

【DL--02】深度学习基本概念--符号计算

符号计算 Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都是一个“符号式”的库。 因此,这也使得Keras的编程与传统的Python代码有所差别。笼统的说,符号主义的计算首先定义各种变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。建立好的计算图需要编译以确定其内部细节,然而,此时的计算图还

数据结构 基本概念和述语

数据结构 基本概念和述语数据(data)数据元素(data element)数据项(data item)数据对象(data object)数据结构(data structure)逻辑结构与物理结构逻辑结构物理结构 抽象数据类型(Abstract Data Type, ADT):数据类型:抽象数据类型三元组的定义:抽象数据类型的表示与实现抽象数据类型Triplet的表示和实现: 算法和算法分析

分布式系统的一些基本概念

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ 分布式 来自csdn,作者:陆小凤 进阶篇来自:bangerlee 作者对部分地方做了订正 目前这系列文章是网络上分布式