网站建设的域名是什么wordpress 乱码
网站建设的域名是什么,wordpress 乱码,wordpress ajax 提交表单,潮安区住房和城乡建设局网站文章目录 前言堆的概念和特征堆的构成过程插入操作删除操作总结 前言 若执于空#xff0c;空亦为障。 --彼得马西森《雪豹》 堆结构是一种非常重要的基础数据结构#xff0c;也是算法的重要内容#xff0c;很多题目甚至只能通过用堆来进行#xff0c;所以我们必须明确什么类… 文章目录 前言堆的概念和特征堆的构成过程插入操作删除操作总结 前言 若执于空空亦为障。 --彼得·马西森《雪豹》 堆结构是一种非常重要的基础数据结构也是算法的重要内容很多题目甚至只能通过用堆来进行所以我们必须明确什么类型的题目可以使用堆以及如何使用堆来解决。由于堆的结构和维护的过程很复杂因此一般面试不需要手写堆的实现但是在Java、python、C已经提供了一些工具因此需要知道思路就可以了。 这里主要简介堆的使用如何进行增删改查不用管代码怎么写后面我们会继续介绍怎么使用堆解决问题的。 堆的概念和特征
堆是将一组数据按照完全二叉树的存储顺序推荐⭐⭐⭐ 算法通过村第六关-树青铜笔记|中序后序_师晓峰的博客-CSDN博客将数据存储在一个一维数组中的结构。堆有两种结构一种称为大顶堆一种称为小顶堆如图下
小顶堆任意节点的值均小于它的左右孩子并且最小值位于堆顶即根节点处。大顶堆任意节点的值均大于它的左右孩子并且最大值位于堆顶即根节点处。
当然有些地方叫大根堆小根堆或者最大堆、最小堆都是一个意思。大小的特征都是类似的只是比较的时候按照大的来点定还是按照小的来定。我们这里介绍先按照最大堆来进行后面的题目我们根据条件来定。
小顶堆 大顶堆 既然是将一组数据按照树的结构存储在一堆数组中而且还是完全二叉树那么父子之间的关系的建立就很重要了。
有个概念需要注意一下我们在做题的时候经常会看到有地方叫做堆有些地方叫优先队列两者是什么关系呢
优先队列说到底还是一种队列他的工作就是poll()/peek()出队列中的最大或者最小的那个元素所以叫做带有优先级别的队列。能够实现这样的功能的策略不一定是堆。例如二项堆、平衡树、线段树、C里面还用二进制分组vector来实现一个优先队列。
堆是一个很大的概念它并不一点是完全二叉树。我们之前用完全二叉树是因为这个容易呗数组存储但是除了这种二叉堆之外还有二项堆、斐波那契堆。这种堆就不属于二叉树了。
所以说优先队列和堆不是一个同level的概念但是Java中PriorityQueue就是采用堆实现的因此在Java的领域中我们可以认为堆就是优先队列优先队列也就是堆换个场景的话就不太行了。
堆的构成过程
使用数组构建堆时就是按照层次将所有元素依次放入二叉树中使其成为二叉树然后再不断的调整最终使其符合堆的结构。
这里我们先假设一个节点下标为 i
当 i 0 时 为根节点。当 i 1 时 父节点为 (i - 1) / 2;
size 就是元素的个数从 1 开始计数。
下面就看一下怎么建立一个大顶堆
将元素依次排到完全二叉树节点上如左图所示
int i (size - 2) / 2 4 (思考这里为什么使用 size - 2 而不是size - 1)。 找到数组下标 4 号65 大于取其孩子满足大顶堆的性质不用交换。如下图 然后 i i- 1然后用 2 和其他孩子比较 2 和 204 交换。交换之后 204 所在的子树满足大顶堆如下图所示 54 和其他孩子比较54 和 92 交换此时92 所在子树满足大顶堆如下图 继续23 和其他孩子比较23 和 204 交换交换完之后23 的子树却不满足了需要再调整如下图 12 和 204 交换然出现不平衡的情况依次类推知道根节点也满足要求就完毕了。 这样我们就建好了一个大顶堆从图中可以看到根元素是整个树中值最大的那个二第二大和第三大就是其左右子树具体那个更大是未知数需要比较一下才知道。
另外对于同一组数据如果输入的序列不一样最终的构造的树是否也会不一样呢非常有可能那么这样的树有什么意义呢我们再往后面看看你这里你已经理解怎么构建了对吧。
插入操作
从上面可以看到根节点和其左右节点是堆的老大老二老三其他节点则是没有太明显的规律那么如果要插入一个新的元素呢该怎么办直接说规则了
将元素插入到保持其完全二叉树的最后一个位置然后顺着这支一直向上调整每前进一层就要保证其他子树都满足堆的要求否则去调整子树直到全部满足要求。
看一个例子如下图要插入 300 我们将其插入到 31的右孩子位置然后不断向上爬 31 300 ,所以两者需要交换再向上 300 比 65 大所以两者也要交换。最后 300 比根元素 204 大两者也要交换最后得到了新的堆。完整的过程如下 删除操作
堆本身比较特殊一般对堆中的数据进行操作都是针对堆顶的元素即每次都从堆中获取得到最大或者最小值其他得不关心所以我们删除得时候也删除堆顶元素。如果直接删掉堆顶整个结果被破坏群龙无首。所以实际策略是先将堆中最后一个元素假如为A和堆顶元素进行替换然后再删除堆中最后一个元素之后再从跟开始逐步与之左右比较谁得更大谁上位。然后A再继续与子树比较如果有更大得继续交换直到自己所在得子树也满足大顶堆得要求。
上面得过程可以理解为皇帝突然驾崩了然后先找个顾命大臣维持局面大臣先看看那个皇子更强大谁就是老大。然后大臣就逐步隐退找到属于自己得位置 最后调整一下位置满足堆得性质 说了这么多你觉得他得价值再哪里呢价值在于大顶堆得根节点是整个树最大得那个增加时会根据根得大小来决定要不要加而删除操作只删除根元素。这个特征可以再很多场景下有巧妙得应用后面得算法题目大多都是基于此得。
这里可能有很多人有疑问感觉不管时插入还是删除堆得操作都不简单那么为什么还说堆得效率比较高呢
这是因为堆元素得数量时有限制得一般不用将所有得元素都放入堆里。后面题目中可以看到这些在序列中找K大则堆得大小就是k。如果K个链表合并那么堆就是K。原理后面再展开详细展开。
说了这么多堆得性质了我们来看看堆是怎么解决问题得。关于堆得问题记住这里我有秘法传于世间
查找找大用小大的进找小用大小的进。
排序升序用小降序用大。查找的方法就是找 k 大 则用小顶堆后序的数据只有比根元素更大时才允许进入堆。如果找 k 小则反过来。这我们后面接着分析。留个疑惑。 总结
提示堆结构堆的特性堆的构造堆的插入操作堆的删除操作 如果有帮助到你请给题解点个赞和收藏让更多的人看到 ~ (▔□▔)/
如有不理解的地方欢迎你在评论区给我留言我都会逐一回复 ~
也欢迎你 关注我 喜欢交朋友喜欢一起探讨问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86207.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!