堆与栈的区别(数据结构角度)

栈和堆:数据结构的基石与应用 栈和堆作为重要的数据结构,在计算机编程和数据处理领域有着广泛而不可替代的作用。栈以其简单高效的后进先出操作和在函数调用、表达式求值等方面的应用,为程序执行过程中的局部数据管理和特定逻辑处理提供了便利的手段。 阅读详情

数据结构中的堆与栈

数据结构中,堆与栈是两个常见的数据结构,理解二者的定义、用法与区别,能够利用堆与栈解决很多实际问题。

1.栈的简介

栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。把新元素放到栈顶元素的上面,使之成为新的栈顶元素称作进栈、入栈或压栈(Push);把栈顶元素删除,使其相邻的元素成为新的栈顶元素称作出栈或退栈(Pop)。这种受限的运算使栈拥有“先进后出”的特性(First In Last Out),简称 FILO。

栈分顺序栈和链式栈两种。栈是一种线性结构,所以可以使用数组或链表(单向链表、双向链表或循环链表)作为底层数据结构。使用数组实现的栈叫做顺序栈,使用链表实现的栈叫做链式栈,二者的区别是顺序栈中的元素地址连续,链式栈中的元素地址不连续。
栈的结构如下图所示:

2.堆简介

2.1堆的性质

堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆。堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称之为小顶堆(或小根堆),如果根节点最大,称之为大顶堆(或大根堆)。堆的左右孩子没有大小的顺序。下面是一个小顶堆示例:

堆的存储一般都用数组来存储堆, i i i节点的父节点下标就为 ( i – 1 ) / 2 ( i – 1 )/2 (i–1)/2 。它的左右子节点下标分别为 2 ∗ i + 1 2*i+1 2∗i+1和 2 ∗ i + 2 2*i+2 2∗i+2。如第0个节点左右子节点下标分别为1和2。

2.2堆的基本操作

2.2.1建立

以最小堆为例,如果以数组存储元素时,一个数组具有对应的树表示形式,但树并不满足堆的条件,需要重新排列元素,可以建立“堆化”的树。

在这里插入图片描述

2.2.2插入

将一个新元素插入到数组末尾,如果新构成的二叉树不满足堆的性质,需要将新元素在其到堆顶的路径上,找到属于自己的位置,即进行上浮操作。
下图演示了插入 15 时,堆的调整。
在这里插入图片描述

2.2.2删除

删除一个元素总是发生在堆顶,因为堆顶的元素是最小的(小顶堆中)。数组中最后一个元素用来填补空缺位置,然后对顶部元素进行下沉,如果左右孩子有比自己小的,则选择选择最小的那个进行交换。重复进行下沉操作,以满足堆的条件。
在这里插入图片描述

2.2.3 堆的具体应用——堆排序

堆排序(Heapsort)是堆的一个经典应用。由于堆也是用数组来存储的,故对数组进行堆化后,第一次将A[0]与A[n - 1]交换,再对A[0…n-2]重新恢复堆。第二次将A[0]与A[n – 2]交换,再对A[0…n - 3]重新恢复堆,重复这样的操作直到A[0]与A[1]交换。由于每次都是将最小的数据并入到后面的有序区间,故操作完成后整个数组就有序了。有点类似于直接选择排序。
(1)稳定性。堆排序是不稳定排序。
(2)堆排序性能分析。由于每次重新恢复堆的时间复杂度为O(logN),共N-1次堆调整操作,再加上前面建立堆时N/2次向下调整,每次调整时间复杂度也为O(logN)。两次操作时间复杂度相加还是O(NlogN),故堆排序的时间复杂度为O(NlogN)。
最坏情况:如果待排序数组是有序的,仍然需要O(NlogN)复杂度的比较操作,只是少了移动的操作;
最好情况:如果待排序数组是逆序的,不仅需要O(NlogN)复杂度的比较操作,而且需要O(NlogN)复杂度的交换操作,总的时间复杂度还是O(NlogN)。
因此,堆排序和快速排序在效率上是差不多的,但是堆排序一般优于快速排序的重要一点是数据的初始分布情况对堆排序的效率没有大的影响。
参考文献
[1] 一文读懂堆与栈的区别

NBIS单细胞教程:差异基因(五) 此文章是通过学习瑞典国家生物信息学基础设施(NBIS) 所开放的单细胞分析教程加上网上所查找的资料,自身的理解所形成的,可能会有不足之处。该部分是对不同集群之间的差异基因进行分析。参考来源:https://github.com/NBISweden/workshop-scRNAseq/blob/master/labs/seurat/seurat_05_dge.Rmd感兴趣的话可以阅读原文。 阅读详情

相关推荐

从M350 RTK到E-Port:解锁大疆无人机多负载协同与PSDK V3开发新范式

本文深入解析了大疆M350 RTK无人机搭载的E-Port智能接口与全新的PSDK V3开发套件,如何共同实现多负载协同作业的范式转变。E-Port集成了供电与高速数据总线,而PSDK V3通过统一的设备模型与服务机制,大幅降低了第三方负载的开发门槛与集成复杂度,使构建如智能巡检等复杂空中作业系统变得更加高效和标准化。

3c4x5z6v7b的博客 166

嵌入式开发中的堆与栈

关注、星标公众号,直达精彩内容文章内容出处:网路素材整理:李肖遥0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆...

李肖遥的专栏 5628

基于COMSOL电弧动态仿真模型优化:高收敛性可修改吹弧方案解析

在多物理场耦合分析中,电弧动态仿真历来是数值稳定性的难点:温度从室温跃升至数万开尔文,电导率随温度呈数量级跳变,流动、传热与电磁场相互牵制,极易引发求解器不收敛或初始值不一致等问题。如何构建高收敛性的数值模型,成为开关设备灭弧性能优化的重要技术基础。通过合理的几何简化、全耦合求解器配置、辅助扫描初始化策略以及参数化建模手段,可以实现对吹弧方案的灵活调整与批量寻优,从而系统性评估气流速度、喷口形状、触头间距等关键因素对熄弧性能的影响。这类仿真方法广泛应用于断路器、接触器等高压电器产品研发,为灭弧室结构设计提供

weixin_29758911的博客 350

堆和栈的区别

2. 内存分配方式:栈采用的是静态内存分配,系统在编译阶段就确定了分配给栈的内存空间,而且栈内存的释放是由系统自动完成的。5. 内存分配效率:栈的内存分配效率比较高,因为栈是一种内存结构,其内存块相互紧凑,可以直接通过指针操作,而堆的内存分配效率相对低一些,因为需要手动分配和释放内存空间。无论是成员变量,局部变 量,还是类变量,它们指向的对象都存储在堆内存中。4. 访问方式:栈是一种后进先出(LIFO)的数据结构,只有栈顶的元素可以被访问和操作,而堆是一棵树形结构,其存储的元素可以被通过指针或引用访问。

luoluoal的博客 7783

STM32+ST7789屏实战:手把手教你打造物理按键控制的3级菜单GUI(附完整代码)

本文详细介绍了如何使用STM32和ST7789屏构建物理按键控制的3级菜单GUI系统。从硬件架构设计、SPI驱动配置到菜单状态机实现,提供了完整的代码示例和优化技巧,帮助开发者快速掌握嵌入式GUI开发的核心技术。

iii12的专栏 236

COMSOL中的动网格

首先我们先了解几个概念 (1)网格重划分(remesh):就是在某些特定的区域进行网格的重新划分,在Maxwell软件中的直线运动区域,当运动物体运动后,这个区域进行重新划分。 (2)morph:网格不重新划分,小范围的进行网格变形,针对运动物体运动位移较小,对变形区域不进行重划分,能够提高效率。 (3)网格滑移(sliding):针对圆形运动区域,运动与非运动区域进行网格滑移,当然边界上两侧网格不共节点,该方法不需要网格重新划分,大部分软件针对圆形运动区域采用该方法,比如maxwell的band,b

midiio的博客 7869

堆、栈,它们到底是什么?看完这篇文章你就明白了!

特征堆栈定义程序运行时自由存储的内存空间由操作系统自动分配和管理的内存空间管理方式由程序员手动进行分配和释放自动分配和管理内存大小空间较大,动态申请和释放由操作系统指定大小,固定存储方式存储动态分配的对象和复杂数据结构存储基本数据类型和引用类型的地址,用于存储函数调用栈、内存的分配操作、表达式求值的临时变量以及与程序中的控制流相关的数据应用用于动态分配和管理内存,例如创建对象、数组等用于存储函数调用栈、临时变量等优缺点空间较大,但由程序员管理,容易发生内存泄漏或溢出。

青轩桃李能几何,流光欺人忽蹉跎 3万+

Embarcadero Dev-C++ 6.3安装教程【保姆级】

Embarcadero Dev-C++ 6.3安装教程,保姆级教程~

Thebest_jack的博客 1万+

堆和栈的区别(示例代码)

堆和栈是计算机内存管理中两个重要的概念,它们在内存分配和存储方式上有很大的不同

xxiaobaibaibai的博客 3027

点云最小二乘法拟合曲线

文章目录一、引言 一、引言

dayuhaitang1的博客 2735

Android15车载系统开机冷启动流程源码解析

本文主要介绍Android15车机系统开机冷启动的流程,暂不包含bootloader,仅从kernel开始直至Launcher首页展示。

jidapenglin28的专栏 253

【算法与数据结构】堆与栈的联系区别(多角度详解)

- 堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈表示两种`内存管理` (2)数据结构场景下,堆与栈表示两种常用的`数据结构`

南城果宝的满腹经纶 5958

IGCT 测试原理概述

IGCT(Integrated Gate-Commutated Thyristor,集成门极换流晶闸管)是一种高功率半导体器件,基于门极可关断晶闸管(GTO)的原理,但通过集成门极驱动单元和优化结构(如硬驱动技术),实现了更低的导通损耗、更快的开关速度和更高的可靠性。它适用于中高压大功率应用,如高压直流输电(HVDC)、中压变频器和模块化多电平变换器(MMC)。IGCT 的结构为四层 p-n-p-n 器件,门极电流控制导通和关断,阳极电流在关断时快速换流至门极,通常在 1 μs 内完成。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 234

栈、堆区别与概念

一、区别 注:首先堆和栈可以分为两种,一种是数据结构,另一种是和内存的分配有关,这两种虽然都有栈和堆,但是两者关系并不大, 1、栈、堆是数据结构里面的叫法,注意:有时候有人喜欢这样说 “堆栈” 其实说的就是栈而不是堆。 2、堆区、栈区则是内存模型的叫法。 二、内存中的栈区和堆区 我们知道php的底层是C (任何语言其实都可以分为大同小异的几块) 而C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下: 1、栈区:存放函数的参数值、局部变量等,由编译器自动分配和释放,通常在函数

一枚正在长大的程序猿 1981

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

一文搞懂堆和栈的区别

0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式。(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆与栈1.1 栈简介栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。参考如下代码:int b;//栈//栈char *p2;//栈。

arvin_xiong的博客 2670

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

堆和栈的区别,变量存储在哪,函数存储在哪

好基础的问题,居然没答上来 一、程序内存的角度 堆和栈是两种不同的存储结构 1.1 栈简介 栈由操作系统(编译器)自动分配释放释放空间,用于存放函数的参数值、局部变量 int main() { int a; //栈 char s[] = "str"; //栈 char *p2; //栈 } 函数中定义的局部变量按照先后定...

juji_1100的博客 4705

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

堆和栈的解释和区别

堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈表示的是两种内存管理方式; (2)数据结构场景下,堆与栈表示两种常用的数据结构。 1.程序内存分区中的堆与栈 1.1栈简介 栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方...

游戏开发、游戏引擎开发、逆向破解爱好者 625

Java堆和栈的区别

一、栈和堆的概念: 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈...

Snowing1234_5的博客 281

概念区分: 队列Queue -- 栈Stack -- 堆Heap

一. 从数据结构角度来说:栈stack和队列queue Stack的特点,LIFO (Last in first out)。 Queue的特点,FIFO (First in first out)。 二. 从内存区域角度来说:栈stack和堆heap 系统一般在内存中划分出两种不同的内存空间,stack和heap。 1. stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小。 heap是没有结构的,数据可以任意存放。 因此,stack的寻址速度要快于heap。 2. 每个

Stephanie的博客 752

堆和栈的理解和区别,C语言堆和栈完全攻略

堆和栈的理解和区别,C语言堆和栈完全攻略 在计算机领域,堆栈绝对是一个不容忽视的概念,并且在编写 C 语言程序的时候也会频繁用到。但对大多数 C 语言初学者来说,堆栈却是一个很模糊的概念。“堆栈:一种数据结构,一个在程序运行时用于存放的地方”,相信这可能是很多初学者共同的认识,这也是大部分教科书对“堆栈”的解释。 很显然,用这么简单的概括来解释“堆栈”是不合适的。要深刻认识堆和栈的概念与区别,还必须从如下两方面说起。 数据结构的堆和栈 在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)

rksd3的博客 1239

内存堆和栈的区别

内存堆和栈的区别 原文: http://student.youkuaiyun.com/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。 堆栈:一种数据结构、一个在程序运行时用于存

枕上听潮 595

计算机的堆与栈

内存堆和栈的区别 原文:http://student.youkuaiyun.com/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。 堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有.

全粘工程师 893

堆、栈和本地堆

转自:点击打开链接 堆和栈站在数据结构的方面来说与堆栈是一样的,在内存方面来说,它们为内存的不同的区域,它们都是连续的内存空间,在分配和销毁空间时都满足后进先出的特点。 拿一个应用程序来说,堆中保存全局变量,栈中保存局部变量,在一个应用程序开始执行时,堆的空间就定了,栈是在代码段中的,在这段空间中,除去代码占用的空间,其余的空间会分配给栈,说堆时要考虑操作系统,不同的操作系统堆

MessCodes 1412

堆与栈

关于堆栈的一点个人理解

536

大白话入门栈stack

大白话入门栈stack 要聊栈要分三个角度聊,我之前也是写了好几年代码才真的明白这东西,之前都是十分模糊,就是因为很多的文章只写其中一个角度。 哪三个角度? 1. 数据结构的角度 2. 程序运行的角度 3. 内存的角度 我只总结关键的一些内容,其他的自己去我下面分享的文章去看 1数据结构的角度 栈是一种逻辑的数据结构,可以用数组和链表来实现,栈的数据结构就是先入后出(filo),说白了就是你能用一个程序来实现先入后出。 2程序运行的角度 比如我a函数调用了b函数,b又调用了c函数,那我的程序调用的流程应该是

yanchendage的博客 201

一直没搞清楚的堆与栈的总结

栈,是在内存中从高地址向低地址生长,并且是一块连续内存的区域。也就是说,在系统中,栈的栈顶地址,以及栈的大小,是事先就在编译器里设定好了的,这也就是为什么函数存在栈溢出的问题。 堆,是从低地址开始生长,并且是在内存中不连续的内存区域。操作系统采用链表形式来存储空闲内存地址的,也就是说,我们malloc或者callloc出来的内存,就是堆。可见,堆更加灵活。 主调函数调用新函数时,首先进栈的是主调函数

wy的点滴 734
上一篇: 代码随想录算法训练营第十二天,第五章 栈与队列 | 239. 滑动窗口最大值 347.前 K 个高频元素
下一篇: Python数据结构堆(heapq)库使用
CV-ROBOT
博客等级 码龄9年 47粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值