数据结构中的堆与栈

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

1.栈的简介

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

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

2.堆简介

2.1堆的性质

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

堆的存储一般都用数组来存储堆,iii节点的父节点下标就为(i–1)/2( i – 1 )/2(i–1)/2 。它的左右子节点下标分别为2∗i+12*i+12∗i+1和2∗i+22*i+22∗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] 一文读懂堆与栈的区别

堆与栈的区别(数据结构角度)相关推荐

  1. 堆和栈的区别 之 数据结构和内存

    版权归作者所有,仅供学习. 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈. 堆和栈都是一种数据项按序排列的数据结构. 栈就像装数据的桶或箱子 我 ...

  2. (笔记)堆和栈的区别-两种不同的数据结构

    堆栈其实是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 要点:堆:顺序随意. 栈:后进先出(Last-In/First-Out) 堆和栈 ...

  3. 堆和栈的区别(内存和数据结构)

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念.堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识 ...

  4. java中堆和栈的区别!!!!

    Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回 ...

  5. 堆和栈的区别(面试经验总结)

    C++中,内存分为5个区:堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区.通常存放局部变量.函数参数等. 堆:是由new分配的内存块, ...

  6. 堆和栈的区别 (转贴)

    非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动 ...

  7. 语言堆栈入门——堆和栈的区别

    原文:http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 格式和部分内容稍作修改 ...

  8. 堆 和 栈的 区别(经典)

    堆和栈的区别 一.预备知识-程序的内存分配  一个由C/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其  操作方式 ...

  9. 内存中“堆”和“栈”的区别

    内存中"堆"和"栈"的区别: 程序中用来存放数据的内存分为四块,分别是: 1.全局区(静态区)(static):全局变量和静态变量都存储在这块区域,与其他变量的 ...

最新文章

  1. 大话设计模式(八 用“策略模式”是一种好策略)
  2. 优化MySQL数据类型——《深究MySQL》
  3. Linux操作系统总结
  4. USTC 2011 homework list [现代软件工程 作业]
  5. 反素数(高合成数?)
  6. SQL Server远程连接操作
  7. [Curator] Barrier 的使用与分析
  8. Python:计算器(代码全+解析+实现结果)
  9. 云课堂智慧职教网页版登录入口_云课堂智慧职教网页版登录入口-云课堂智慧职教app官网版下载-XP软件园...
  10. 数据库操作:更新数据update
  11. java发布帖子_第一篇发在javaeye的帖子
  12. Python基础教程--【2022暑假全新总结】
  13. 一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。
  14. 银河帝国----基地与帝国
  15. 系列之 H5+js 游戏 遍历象棋(待更新)
  16. Django路由写法
  17. 项目管理PMP好考吗,没有经验?
  18. getContextPath方法
  19. 计算机的最新发展趋势
  20. 图像处理——单通道图像与多通道图像

热门文章

  1. 阿武老师百搭傲娇句式1
  2. revit二次开发调整三维视图的视角方向
  3. yolov5结果解析
  4. 洛谷P3723 [AH2017/HNOI2017]礼物
  5. vue项目使用IE浏览器运行报错
  6. 分享一首诗,不敲代码的时候,也要将生活过的有诗意
  7. 新中大、金蝶、用友产品技术比较
  8. Q:C#命名空间不能直接包含字段或方法之类的成员
  9. Mysql数据库中时间与当前时间判断
  10. embARC 机器学习库的使用