最大堆/最小堆
来源:互联网 发布:西北师大知行学院地址 编辑:程序博客网 时间:2024/05/21 23:00
堆有最大堆和最小堆之分。它们在表现形式上都是一棵完全二叉树,在存储时按层次遍历的方式存储。
最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。
最小堆便是每个节点的值都<=其左右孩子值的完全二叉树。
设有n个元素的序列{k1,k2,...,kn},当且仅当满足下列关系时,称之为堆。
堆的三种基本操作(以下以最大堆为例):
⑴最大堆的插入
由于需要维持完全二叉树的形态,需要先将要插入的结点x放在最底层的最右边,插入后满 足完全二叉树的特点;
然后把x依次向上调整到合适位置满足堆的性质,例如下图中插入80,先将80放在最后,然后两次上浮到合适位置.
时间:O(logn)。 “结点上浮”
⑵删除
操作原理是:当删除节点的数值时,原来的位置就会出现一个孔,填充这个孔的方法就是,
把最后的叶子的值赋给该孔并下调到合适位置,最后把该叶子删除。
如图中要删除72,先用堆中最后一个元素来35替换72,再将35下沉到合适位置,最后将叶子节点删除。
“结点下沉”
⑶初始化
方法1:插入法:
从空堆开始,依次插入每一个结点,直到所有的结点全部插入到堆为止。
时间:O(n*log(n))
方法2:调整法:
序列对应一个完全二叉树;从最后一个分支结点(n div 2)开始,到根(1)为止,依次对每个分支结点进行调整(下沉),
以便形成以每个分支结点为根的堆,当最后对树根结点进行调整后,整个树就变成了一个堆。
时间:O(n)
对如图的序列,要使其成为堆,我们从最后一个分支结点(10/2),其值为72开始,依次对每个分支节点53,18,36 45进行调整(下沉).
1,8,6,2,5,4,7,3调整为小根堆的过程:
- 最大堆/最小堆
- 最小堆。最大堆。
- 最大堆/最小堆
- 最大堆/最小堆
- 最大堆/最小堆
- 最大堆、最小堆
- 最大堆/最小堆
- 最大堆/最小堆
- 最大堆/最小堆
- 最小堆与最大堆
- 最大堆和最小堆
- 最大堆和最小堆
- 最大堆和最小堆
- 最大堆和最小堆
- 最小堆与最大堆
- 最大堆、最小堆、堆排序
- 最大堆、最小堆、堆排序
- 堆排序:最大堆与最小堆
- IOS的同步处理机制
- wine
- CDialog::OnInitDialog调用过程
- 给安卓初学者的建议
- HLG校赛个人赛 E题 ( 并查集+二维BIT+deque+BFS )
- 最大堆/最小堆
- 中央银行会计核算数据集中系统(ACS系统)
- NT API 注册表键介绍ZW相关函数
- UML建模工具Visio 、Rational Rose、PowerDesign的比较
- c++ 详解链接过程
- 为什么我做的降序排列程序输入321却输出312?
- 第四周作业——图的表示
- oracle数据库导入导出(本地数据库、远程数据库)
- win7更改计算机名称-登录显示当前用户为admin