首页 > 其他分享 >原地堆化技巧

原地堆化技巧

时间:2023-12-23 11:22:24浏览次数:30  
标签:遍历 技巧 堆化 int 交换 原地 递归 二叉树 节点

将数组以 \(O(n)\) 的时间复杂度和 \(O(1)\) 的空间复杂度构造为堆的 trick。

想象我们把数组随意地填充进一棵完全二叉树(尚不满足堆的性质),然后通过交换节点等操作把二叉树变成堆。因为完全二叉树的节点个数性质,我们直接从 \(\dfrac{n}{2}\) 到 \(1\) 倒序遍历(相当于从下到上遍历非叶子节点),对每一个节点做下沉操作(递归地与子树节点交换使满足堆的性质)。

代码如下:

void heapify(int[] h) { // 倒序遍历——从下往上遍历非叶子节点
    for (int i = h.length / 2 - 1; i >= 0; i--)  sink(h, i);
}
void sink(int[] h, int i) {
    int n = h.length;
    while (2 * i + 1 < n) {
        int j = 2 * i + 1; // 左儿子(因为起始下标为0所以+1)
        if (j + 1 < n && h[j + 1] > h[j]) j++; // 跟左右儿子中较大的交换
        if (h[i] >= h[j])  break; // 无法交换,递归结束
        swap(h, i, j), i = j; // 交换后继续向下递归
    }
}

THE END

标签:遍历,技巧,堆化,int,交换,原地,递归,二叉树,节点
From: https://www.cnblogs.com/th19/p/17922805.html

相关文章

  • 【收藏】法律人办案必备检索网站最新汇总!附检索技巧
    为什么要进行法律检索?无论你擅长的是做诉讼还是非诉讼业务,法律检索都是必备技能之一。只有做好法律检索才能制定出更加完备的策略报告,才能提供更加充实、可行、准确的方案。一、数据库检索1、alpha数据库https://www.icourt.cc 已经用了3年的大数据库,听说最近降价了。有相当多......
  • java后端开发小技巧-集合初始化
    阅读说明:1.如果有排版格式问题,请移步https://www.yuque.com/mrhuang-ire4d/oufb8x/lu346eokyvgfao0b?singleDoc#《java后端开发小技巧-集合初始化》,选择宽屏模式效果更佳。2.本文为原创文章,转发请注明出处。后端开发中集合是经常会用到的类型。java原生的集合方法难以满足......
  • class083 动态规划中用观察优化枚举的技巧-下【算法】
    class083动态规划中用观察优化枚举的技巧-下【算法】算法讲解083【必备】动态规划中用观察优化枚举的技巧-下code11235.规划兼职工作//规划兼职工作//你打算利用空闲时间来做兼职工作赚些零花钱,这里有n份兼职工作//每份工作预计从startTime[i]开始、endTime[i]结束,报酬为pr......
  • 关于在doker中部署superset后远程登录时原地跳转的问题
    排除密码错误后实时log查看报错:dockerlogs-fsuperset发现问题为flask_wtf.csrf:TheCSRFsessiontokenismissing.原因是Superset使用Flask和Flask-Login进行用户会话管理。以及TALISMAN_ENABLED这个对跨站点登陆有限制,需要关闭解决方案->**注意镜像内可能无法......
  • javascript技巧
    1、过滤掉数组中的重复值。constarr=["a","b","c","d","d","c","e"]constuniqueArray=Array.from(newSet(arr));console.log(uniqueArray);//['a','b','c',&#......
  • 22个实用的CSS技巧,让你的网站脱颖而出
    想要让你的网站在激烈的竞争中脱颖而出吗?使用CSS的强大功能可以帮助你实现这一目标。本文将分享22个实用的CSS技巧,帮助你提升网站的外观和用户体验。无论你是一个新手还是有经验的开发者,这些技巧都将为你的网站注入新鲜的设计元素和动感效果。自定义字体:通过使用@font-face规则,你可......
  • 3个自动发送邮件的方法有哪些?邮件营销技巧
    在当今数字化的商业环境中,自动发送邮件已经成为一种高效的沟通和营销工具。通过巧妙地利用自动发送邮件的方法,企业可以更好地与客户互动,提高品牌曝光度,并增加销售机会。本文将介绍三种常见的自动发送邮件方法,并探讨邮件营销的一些关键技巧。1.基于触发的自动发送邮件基于触发的自......
  • 3个自动发送邮件的方法有哪些?邮件营销技巧
    在当今数字化的商业环境中,自动发送邮件已经成为一种高效的沟通和营销工具。通过巧妙地利用自动发送邮件的方法,企业可以更好地与客户互动,提高品牌曝光度,并增加销售机会。本文将介绍三种常见的自动发送邮件方法,并探讨邮件营销的一些关键技巧。1.基于触发的自动发送邮件基于触发的自......
  • SharedFlow vs StateFlow,一篇看懂选择和使用技巧
    引言在Android应用开发中,数据流是一个至关重要的概念。而在Jetpack库中,SharedFlow和StateFlow是两个处理数据流的利器,它们基于协程,提供了一种响应式的编程方式。本文将深入探讨这两个类的原理,以及在实际开发中的使用技巧。原理分析SharedFlow和StateFlow基于协程构建,它们利用......
  • 一些有趣和实用的Java开发技巧和编码技巧
    当涉及到Java开发技巧和编码技巧时,有一些有趣和实用的技巧可以帮你提高效率和代码质量。以下是一些示例:1.使用Lambda表达式List<Integer>numbers=Arrays.asList(1,2,3,4,5);//使用Lambda表达式计算偶数的总和intsum=numbers.stream().(n->n%20......