小根堆 总结

本文详细介绍了小根堆的概念,包括其定义、创建过程、插入操作及删除操作等关键步骤。通过对小根堆的理解,读者可以更好地掌握堆排序及优先队列等相关算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小根堆


如果有一个关键字的集合K={k0,k1,k2, ..., kn-1}, 把所有元素按完全二叉树的顺序存储
方式存放在一个一维数组中,并且满足
ki <= k2i+1 且 ki <= k2i+2  (i = 0, 1, ..., (n-2)/2 向上取整)
则称这个集合为小根堆。

小根堆的创建:
1. 复制堆数组
2. 找到最初的调整位置,即最后一个分支结点
3.1自底向上逐步扩大形成堆
3.2 向前换一个分支结点

小根堆的插入:
1. 将待插入元素插入已建成堆的最后面
2. 沿着出入位置所在的分支逐步向上调整

小根堆的删除:
1. 将顶元素删除

2. 将数组中最后一个元素放到堆顶

3. 自顶向下调整







### 大根堆与小根堆的概念 大根堆是一种特殊的完全二叉树,在这种结构中,对于每一个非叶子节点 \(i\) 来说,都有如下特性:父节点的键值大于或等于它的任何孩子节点的键值[^1]。这意味着在整个堆中最大的元素始终位于根位置。 相反地,小根堆也是一种基于完全二叉树的数据结构形式,不过它遵循的是最小堆属性——即每个内部节点的关键字不大于其子节点关键字;换句话说,根部保存着整个集合里最小的那个数值[^3]。 ### 实现方法概述 #### 构建方式 无论是构建大根堆还是小根堆,通常都是采用数组作为底层存储介质,并利用特定索引关系映射父子之间的联系。给定一个节点的位置 `index` ,则左孩子的索引为 `2 * index + 1` ,右孩子的索引则是 `2 * index + 2` 。当向堆中添加新成员或者移除现有成员之后, 需要执行相应的调整操作以保持原有的堆序性质不变. #### 插入操作 - **大根堆**: 当插入一个新的元素到大根堆时,先将其放置在最后一个位置(最底部),随后通过不断与其父节点比较并交换直至满足大根堆条件为止。 - **小根堆**: 对于小根堆来说,同样是从末端加入新的项,接着沿路径向上移动直到找到合适的地方使得所有祖先节点均不超过当前节点。 #### 删除操作 (通常是删除根节点) - **大根堆**: 移走顶部的最大值后,取最后一位填补空缺处,再自顶向下逐层修复堆形至底端。 - **小根堆**: 类似地处理,只是方向变为寻找更小者来替换被删去的小根堆顶端元素。 ```cpp // C++ code snippet demonstrating heapify down process for max heap. void MaxHeap::heapifyDown(int i){ int largest = i; int l = left(i); // 获取左子节点索引 int r = right(i);// 获取右子节点索引 if(l < size && array[l] > array[largest]) largest = l; if(r < size && array[r] > array[largest]) largest = r; if(largest != i){ swap(array[i],array[largest]); heapifyDown(largest); } } ``` ### 主要区别总结 | 特征 | 大根堆 | 小根堆 | | --- | ------ | -------| | 根节点特征 | 存储最大值 | 存储最小值 | | 父子间的关系 | 父 >= 左右孩子 | 父 <= 左右孩子 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值