| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 深入理解数据结构原理(4)—堆(heap) -> 正文阅读 |
|
[数据结构与算法]深入理解数据结构原理(4)—堆(heap) |
目录 一、堆的定义堆其实就是满足一定条件的树: 在堆中,他的每个结点的值都大于等于(或者小于等于)子树中的所有结点的值。也可以通俗的说任意一个结点的值都大于等于(或者小于等于)所有所有子节点的值。
堆的分类,根据排序不同可分为:
图中可以看到最大堆头部根结点21比任何一个子结点都要大,左子结点15也比它的任何一个子结点都要大 ;最小堆恰恰相反,头部最小,比如1这个结点,比任何的子结点都要小。 二、堆的用途
在java的JVM(Java Virtual Machine)虚拟机里,堆是在“运行时内存”中开辟的一个最大内存空间java中几乎所有的对象实例和数组存储空间都分配于此。?? 三、堆的储存在学习树(tree)的时候知道,储存结构用完全二叉树的来表示的话便利很多,利用数组存储二叉树即节省空间,又方便索引。假如根结点的序号是从 1 开始,那么对于树中任意节点??i?,其左子节点序号为?? 那么在二叉堆中也可以用完全二叉树的储存结构来进行储存,这样同样具备方便储存和索引 四、堆的操作1、插入元素在插入元素的时候,先从底部开始插入,如果插入的元素值比父结点元素值大,则与父结点交换,一直到到比自己数值大的父结点前。(总的来说就是插入元素?:先将元素放至数组末尾,再自底向上堆化,将末尾元素上浮) (1)插入一个元素,值为 (18),最先排在底部 (2)与父结点(7)比较后比父节点值大,与之交换? ?(3)依次与父结点比较,最终在比自己大的父结值点(21)前停下 2、删除堆顶的元素删除堆定元素,将末尾元素放至堆定,再自定向下堆化,将堆顶元素下沉。也可以自滴下上堆化,只是会产生“气泡”,浪费储存空间。最好的就是采用自定向下堆化的方式。 根据堆的性质可知:
当我们需要多次查找最大元素或者最小元素的时候,可以利用堆来实现。
?2.1、自底向上堆化第一步:先删除堆顶元素,让数组下标是? 1? 的位置空出来。 第二步:比较根结点的左子节点和右子节点,也就是下标为2,3的数组元素(删除结点下的子结点的值比较),将较大的元素填充到根结点(下标为1)的位置。 第三步:如此一来,一直循环比较空出来的位置的左右子结点的值,同样将大值的结点移向空位置直到最低端。? ? 气泡:每次循环都出现一个空出来的位置。?这样一来会导致存储空间的浪费。
2.2、自顶向下堆化
第一步:把石头拿起来,就是把数组最后一个元素放到树顶? 第二步:然后就是开始沉底过程了,就是比较这个结点下的左右子结点值,让值大的子结点和根结点交换。 ?第四步:依次进行第三步比较,直到元素到达最底端。 五、堆的排序
1、建立堆从上面的堆化过程(自底向上堆化、自顶向下堆化)了解到,建堆的过程就是一个对所有非叶节点的自顶向下堆化过程。 …………………… 2、排序…………………… |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:50:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |