【数据结构】什么是堆?

news/2024/5/20 8:17:47 标签: 数据结构, c语言, 开发语言, 算法, 学习,

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


的概念及结构

的定义如下:

n个元素的序列{k1,k2,...,kn}当且仅当满足以下关系时,称之为.

 \left\{\begin{matrix} k_{i}\geqslant k_{2i} \\ k_{i}\geqslant k_{2i+1} & & \end{matrix}\right.    或    \left\{\begin{matrix} k_{i}\leqslant k_{2i} \\ k_{i}\leqslant k_{2i+1} & & \end{matrix}\right.

(i= 1,2,...,\left \lfloor \frac{n}{2} \right \rfloor)

这个序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则的含义表明,完全二叉树中所有双亲结点的值不小于(或不大于)其左,右孩子结点的值.

由此,若序列 {k1,k2,...,kn}是,则顶元素(或完全二叉树的根)必为序列中n个元素的最大值(或最小值).

如下面两个序列为(存储结构),则其对应的完全二叉树(逻辑结构)如下图所示:

综上,我们不难总结出的性质:

  • 中某个结点的值总是不大于或不小于其父亲结点的值.
  • 总是一颗完全二叉树.

的实现

有关结构的完整实现部分我放在下面这篇博客中为大家详细梳理了,并且为每个算法逻辑配备了详细明了的逻辑结构演示图和物理结构演示图,如:

的实现部分的具体逻辑和细节感兴趣的朋友可以点击下方链接直接跳转到相应文章:

数据结构】C语言实现(附完整运行代码)icon-default.png?t=N7T8http://t.csdnimg.cn/v7qVo


的时间复杂度

有两种方式,一种是从顶开始向下建,另一种是从尾开始向上建.乍一听好像两种建方式除了向上调整和向下调整方式不同之外没什么区别,但我们仔细分析一下,其实这两种建方式的时间复杂度差别是很大的.

向上调整建

我们先一起来分析一下向上建的时间复杂度:

首先,按照算法算法最坏时间复杂度分析,我们假设是完全二叉树中的满二叉树,并且假设每个结点的移动次数都是最坏移动次数,则:

使用错位相消法,可得:

化简,可得:

使用大O阶渐近表示法,可得:

T(n) = 2^h*h = O(n*log_{2}n)

因为:

2^h=n

h=log_{2}n

(舍去低次方阶和常数阶后剩下的2^h恰好是高为h的树的结点个数n,同样的h也可化简为以2为底n的对数)


向下调整建

再来看看向下调整建:

我们继续,按照算法最坏时间复杂度分析,假设是完全二叉树中的满二叉树,并且假设每个结点的移动次数都是最坏移动次数,则:

使用错位相消法,可得T(n)为:

化简,可得:

使用大O阶渐近表示法,可得:

T(n) = 2^h = O(n)

(舍去低次方阶和常数阶后剩下的2^h恰好是高为h的树的结点个数n)

综上可知:

  • 向上调整的建方式的时间复杂度为O(n*log_{2}n)
  • 向下调整的建方式的时间复杂度为O(n)
  • 向下调整建优于向上调整建的.

思想的应用

1.排序

排序就是利用(假设利用大)进行排序(假设为升序)的算法.

它的基本思想是:

将待排序的序列构造成一个大.

此时,整个序列的最大值就是顶的根结点.将它移走(其实就是我们前面实现中的出顶操作).

然后将剩余的n-1个序列重新构造成一个,这样就会得到n个元素中的次小值(即顶).

如此反复执行,就可以得到一个有序的序列了.

使用排序的思想排序有以下几点需要注意的:

  • 排升序建大
  • 排降序建小
  • 建好后利用删除的思想进行排序

 如下是一个顺序待排数组:

为了直观的利用排序的思想,我们在逻辑上将其还原为一颗完全二叉树:

我们先将数组视为一个空,开始时中没有元素.

我们先模拟一下向上建的过程:

即数组逐渐向后遍历,模拟向中插入元素:

(ps:此处建也可以使用向下建的思路,时间复杂度会更小,但要注意的是,向下建时,我们对数组的遍历是从最后一个叶子结点的父节点开始向前遍历并向下调整的.假设数组有n个元素,即是从下标为[(n-2)/2]的结点开始向前遍历并向下调整.)

插入'75':

插入'80':

向上调整:

插入'60':

我们先按照入的逻辑,将数组建成一个大:

然后再按照删除的思想,顶元素移动至尾"删除":

再将换到顶的元素向下调整:

调整好后再删除"新的顶元素":

如此循环"删除顶":

最终就会得到一个升序的序列:


2.Top-k问题

Top-k问题:

求数据集合中前k个最大/最小的元素,一般情况下数据量都比较大.

对于Top-k问题,最容易想到的方法是先整体排序,再取前k个,但当数据量非常大时(可能都无法加载到内存上),排序就不是一个很好的解决方法了.

这时的最佳的方案就是来解决,思路如下:

1.先用数据元素中前K个元素来建

  • 前k个最大的元素,则建小
  • 前k个最小的元素,则建大

2.遍历剩余的N-K个元素来比较,遇到符合条件的(如求前k个最大的元素,新元素比顶要大)则用其替换,然后再向下调整,构建为新的大/小.

3.当遍历完剩下N-K个元素时,中剩余的k个元素就是所求的前Top-k个元素.

这个思路有点类似于让一个里最"弱"的元素去守"门",如果新来的元素比最弱的,则让它替换最弱的进,再在中选出新的最弱的去"守门".如果新来的元素比最弱的还弱,那它就完全不是我们要找的元素,可以直接把它pass掉.

利用这种方式选出top-k,当数据量大到可以忽略建以及后续调整部分的操作带来的时间复杂度时,我们可以近似的认为这个算法的时间复杂度为O(n).


结语

希望这篇有关数据结构""的文章能对您有所帮助,欢迎大佬们留言或私信与我交流.学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

数据结构】C语言实现(附完整运行代码)

数据结构】什么是线性表?

数据结构】线性表的链式存储结构

数据结构】什么是栈?

数据结构】用C语言实现顺序栈(附完整运行代码)

数据结构】深入浅出理解链表中二级指针的应用

数据结构】10道经典面试题目带你玩转链表




http://www.niftyadmin.cn/n/5261299.html

相关文章

用友时空 KSOA 多处SQL注入漏洞复现

0x01 产品简介 用友时空 KSOA 是建立在 SOA 理念指导下研发的新一代产品,是根据流通企业前沿的 IT 需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。 0x02 漏洞概述 用友时空 KSOA 系统 PayBill、QueryService、linkadd.jsp等接口处…

【学习笔记】Linux(基础知识)

第1章 Linux概况 1.1 Linux起源 四个重要的支柱: ①Unix操作系统; ②Minix操作系统; ③GNU计划; ④Internet网络。 1. Unix操作系统 UNIX的诞生 1971年,用汇编语言首先开发成功16位UNIX系统 1973年,用C语言重写了UNIX系统 创始人:Ken Thompson & Dennis Ritch…

基于JavaWeb+SSM+Vue助农扶贫微信小程序系统的设计和实现

基于JavaWebSSMVue助农扶贫微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图 源码获取入口 Lun文目录 目 录 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环境与技术 3 2.1 JSP技术 3 2.2 MySQL数据库 3 2.3 Java…

智慧燃气让城市能源系统高效运行

关键词:智慧燃气、燃气数字化、智慧燃气平台、智慧燃气解决方案、智慧燃气系统 随着我国城镇燃气行业的发展,燃气行业管理及服务从简单的手工运作阶段迈入数字燃气阶段,大量采用信息化手段管理燃气业务,智慧燃气应运而生。它既是…

计算机网络知识点合集【王道计算机考研】

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

《opencv实用探索·十三》opencv之canny边缘检测

1、canny边缘检测应用场景 目标检测: Canny边缘检测可以用于检测图像中的目标边缘,从而帮助识别和定位物体。在目标检测的流程中,边缘通常是检测的第一步。 图像分割: Canny边缘检测可用于图像分割,即将图像划分为具有…

k8s debug 浅谈

一 k8s debug 浅谈 说明: 本文只是基于对kubectl debug浅显认识总结的知识点,后续实际使用再补充案例 Kubernetes 官方出品调试工具上手指南(无需安装,开箱即用) debug-application 简化 Pod 故障诊断: kubectl-debug 介绍 1.18 版本之前需要自己…

人工智能中的顺序学习:概念、应用和未来方向

一、介绍 人工智能 (AI) 中的顺序学习是一个关键研究领域,近年来引起了人们的极大兴趣。它指的是人工智能系统从数据序列中学习的能力,其中数据点的顺序至关重要。本文将探讨人工智能中顺序学习的概念、其重要性、应用、方法、挑战…