| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构 - 堆 -> 正文阅读 |
|
[数据结构与算法]数据结构 - 堆 |
目录 堆 (一种二叉树(完全二叉树))使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。 二叉树相关的知识见 二叉树需要掌握的基本知识_TangguTae的博客-CSDN博客https://blog.csdn.net/weixin_43164548/article/details/123141346?spm=1001.2014.3001.5501堆的物理结构是一个数组,逻辑结构是一个完全二叉树。 堆的分类1、大根堆堆中所有父亲节点的数值大于等于孩子节点的数值。 ?上述例子是一个有序的情况,把50和40交换位置也是一个大根堆。 2、小根堆堆的实现先给出一个结论: 假设父亲节点的下标为parent 则左孩子的下标LeftChild = parent*2 + 1;右孩子的下标RightChild = parent*2 + 2。 所以可以得到parent = (child - 1)/2,child既可以是左孩子,也可以是右孩子。 在建堆之前首先得知道向下调整法来调整堆。 1、向下调整法假设存在前提:根节点的左子树和右子树都是堆。 步骤:(小堆)
若要想得到大堆,改变判断条件即可。 复杂度分析:因为只需要比较二叉树的高度次,所以复杂度为
如果前提不满足怎么办? 此时我们考虑从下往上,逐步调整,利用向下调整的方法,采用从倒数第一个非叶子结点开始向下调整。 ?
测试一下代码
最终把一个不是堆的数组变成了堆 ?这个过程就叫做建堆 复杂度分析: 不失一般性,采用满二叉树代替完全二叉树,假设高度为h,总的节点数为n 从第h-1层的节点开始向下调整,这一层的每一个节点只需要一次运算,复杂度为𝟐^(𝒉?𝟐)*1 第h-2层的节点向下调整,这一层每一个节点需要两次运算,复杂度为𝟐^(𝒉?𝟑)*2 第h-3层的节点向下调整,这一层每一个节点需要三次运算,复杂度为𝟐^(𝒉?𝟒)*3 以此类推 总的计算量,𝒏𝒊为第i层的节点数量 ? 展开得到𝐭(𝐧)=𝟏?(𝐡?𝟏)+𝟐?(𝐡?𝟐)+𝟐^𝟐?(𝐡?𝟑)+…+𝟐^(𝒉?𝟐)?𝟏 ????????𝟐?𝐭(𝐧)=????????????????????𝟐?(𝐡?𝟏)+?𝟐^2?(𝐡?𝟐)+…+𝟐^(𝒉?𝟐)?𝟐+𝟐^(𝒉?𝟏)?𝟏 错位相减得到𝐭(𝐧)=𝟐^𝒉?𝟏?𝒉=𝒏?𝐥𝐨𝐠𝟐(𝒏) 所以复杂度就为O(N) 2、向上调整法如果在原来堆的基础上从末尾增加一个元素,如何将新的二叉树变成堆? 首先并不采用重新建堆的方法,具有一定的复杂度。此时引入一个方法叫做向上调整法 只需要新的节点与父亲节点比较,逐步向上走,就可以更新堆。
3、从堆中删除一个数据由于堆的物理结构是数组,如果删除数组中任意位置的元素,还需要对数组进行挪动,复杂度为O(N),然后在新的数组基础上重新建堆,又需要O(N)的复杂度。所以这种做法是非常复杂的。 所以从堆中删除一个数据可以这样做:每次把要删除的元素与堆中最后一个元素进行交换位置,每次只删除最后的一个元素,然后对要删除元素的位置进行一次向下调整,将其重新调整为堆。 ?代码实现起来很简单
堆排序以升序的方式排序
复杂度分析:Nlog(N)
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 16:54:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |