带你了解建堆的时间复杂度

news2024/9/25 3:25:30

目录

用向上调整建堆的时间复杂度

1.向上调整建堆的时间复杂度O(N*logN)

2.数学论证

 3.相关代码

用向下调整建堆的时间复杂度

1.建堆的时间复杂度为O(N)

2.数学论证

3.相关代码

完结撒花✿✿ヽ(°▽°)ノ✿✿


博主建议:面试的时候可能会被面试官问到建堆时间复杂度的证明过程,最好背下来,到时候能回答出你就是最靓的仔!!!

     注:堆是完全二叉树,但以满二叉树来分析的原因:

  1. 方便进行数学论证
  2. 满二叉树是特殊的完全二叉树
  3. 满二叉树挂的节点最多,与时间复杂度的计算一般是求是求算法的最坏运行情况相符
  4. 时间复杂度本来看的就是近似值,多几个节点不影响最终结果

用向上调整建堆的时间复杂度

注:一般采用的都是向下调整的方式建堆的,用向上调整建堆比较少

1.向上调整建堆的时间复杂度O(N*logN)

2.数学论证

 3.相关代码

   //向上调整来建堆,时间复杂度为 O(n*logN)
   Queue<Integer> minHeap = new PriorityQueue<>();
   for (int i : arr) {
       minHeap.offer(i);
   }
    //向上调整
    private void shiftUp(int child) {
        int parent = (child - 1) / 2;
        while (child > 0) {
            if (elem[child] > elem[parent]) {
                int tmp = elem[child];
                elem[child] = elem[parent];
                elem[parent] = tmp;
                child=parent;
                parent = (child - 1) / 2;
            } else {
                break;
            }
        }
    }

用向下调整建堆的时间复杂度

1.建堆的时间复杂度为O(N)

2.数学论证

3.相关代码

    /*
     * 创建大根堆的时间复杂度:O(N)
     * 以满二叉树(挂的节点最多,是特殊的完全二叉树)来分析
     * */
    public void createHeap() {
        for (int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--) {
            shiftDown(parent, usedSize);
        }
    }
    /*
     * 父亲下标
     * 每棵树的结束下标
     * */
    private void shiftDown(int parent, int len) {//向下调整
        int child = parent * 2 + 1;
        //最起码 要有左孩子
        while (child < len) {
            //一定是有右孩子的情况下
            if (child + 1 < len && elem[child] < elem[child + 1]) {
                child++;
            }//点评:这代码写得有意思!!!
            //child下标一定是左右孩子 最大值的下标
            if (elem[child] > elem[parent]) {
                int tmp = elem[child];
                elem[child] = elem[parent];
                elem[parent] = tmp;
                parent = child;
                child = 2 * parent + 1;
            } else {
                break;
            }
        }
    }

完结撒花✿✿ヽ(°▽°)ノ✿✿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/900139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓手机的充电原理

安卓手机的充电原理是通过充电器将交流电转换为直流电&#xff0c;然后通过USB接口传输到手机电池中。手机电池的充电过程分为三个阶段&#xff1a;涓流充电、恒流充电和恒压充电。 充电动画 涓流充电是用来先对完全放电的电池单元进行预充&#xff08;恢复性充电&#xff09…

pdf 转 word

pdf 转 word 一、思路 直接调用LibreOffice 命令进行文档转换的命令行工具 使用的前系统中必须已经安装了 libreofficelibreoffice已翻译的用户界面语言包: 中文 (简体)libreoffice离线帮助文档: 中文 (简体)上传字体 重点&#xff1a;重点&#xff1a;重点&#xff1a; 亲…

蓝光眼镜有效吗?科研团队:无法证明防蓝光镜片可以减少视力伤害

8 月 19 日消息&#xff0c;本次由墨尔本大学、莫纳什大学和伦敦城市大学联合进行的科研团队&#xff0c;对来自 6个国家和地区的 17 项已发表的研究进行了深入研究。他们的研究发现&#xff0c;无法证明防蓝光镜片能够减少眼睛的视力伤害或改善佩戴者的睡眠质量等功效。 这项研…

【网络教程】如何获取阿里云盘的refresh_token

文章目录 获取阿里云盘的refresh_token 获取阿里云盘的refresh_token 这里在Edge浏览器上进行演示首先我们需要登入我们的阿里云盘然后按F12进入开发者模式&#xff0c;在菜单栏选择应用程序&#xff0c;然后在左边菜单找到 本地存储 下的 https://www.aliyundrive.com 这个域…

深入理解【二叉树】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

开发过程中自己遇到的异常(四)

mysql 报错&#xff1a;‘Lost connection to MySQL server during query 出现这种情况大多是因为&#xff0c;两个事物抢一个表的使用权造成的。 show processlist; 观察Command 列&#xff0c;有明显的update&#xff0c;insert, delete 时间比较久的&#xff0c;直接kill掉…

unity 之Transform组件(汇总)

文章目录 理论指导结合例子 理论指导 当在Unity中处理3D场景中的游戏对象时&#xff0c;Transform 组件是至关重要的组件之一。它管理了游戏对象的位置、旋转和缩放&#xff0c;并提供了许多方法来操纵和操作这些属性。以下是关于Transform 组件的详细介绍&#xff1a; 位置&a…

微服务系列文章之 SpringBoot 最佳实践

Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。 以下是一些最佳实践和一些技巧&#xff0c;我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。 Spring Boot 的四大核心 1、自动配置 针对很多Spring应用程序和常见的应用功能&#xff0c;Spring Boo…

Linux 线程的概念与实现方式

一、线程的概念 线程是进程内部的一条执行序列或执行路径&#xff0c;一个进程可以包含多条线程。 一个进程中有两条或多条执行路径的时候&#xff0c;它们是可以同时执行的&#xff0c;也就是说&#xff0c;一个进程中的多个线程是可以同时执行的。当我们需要一个程序同时执行…

【LeetCode-简单题】49. 字母异位词分组

题目 题解一:排序哈希表 思路:由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符串分别进行排序之后得到的字符串一定是相同的&#xff0c;故可以将排序之后的字符串作为哈希表的键。 核心api: //将字符串转换为字符数组char[] ch str.toCharArray();…

飞机打方块(二)游戏界面制作

一、背景 1.新建bg节点 二、飞机节点功能实现 1.移动 1.新建plane节点 2.新建脚本GameController.ts,并绑定Canvas GameControll.ts const { ccclass, property } cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Node)canvas:…

详解strcmp函数

strcmp函数是用来比较两个字符串的&#xff0c;按理来说&#xff0c;比较结果只有两种&#xff1a;相同或不同。但是&#xff0c;事实上&#xff0c;strcmp函数在设计时会有三种情况&#xff0c;下面详细介绍&#xff1a; 这个函数的输入为两个字符串的首元素地址&#xff08;即…

Hlang--用Python写个编程语言-逻辑运算

文章目录 前言关键词解析token解析器解释器语法表示前言 在上一篇文章里面,实现了基本的变量,并且详细地阐述了基本原理,所以的话,这里要实现的就是这个判断,由于架子基本上打好了,后面的操作无法就是确定这个AST的一个执行顺序,也就是我们希望解释器执行的一个情况。 …

OpenCV基础知识(5)— 几何变换

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。OpenCV中的几何变换是指改变图像的几何结构&#xff0c;例如大小、角度和形状等&#xff0c;让图像呈现出缩放、翻转、旋转和透视效果。这些几何变换操作都涉及复杂、精密的计算。OpenCV将这些计算过程都封装成了非常灵活的…

8. 实现业务功能--用户注册

目录 1. 顺序图 2. 参数要求 3. 接口规范 4. 创建扩展 Mapper.xml 5. 修改 DAO 6. 创建 Service 接口 7. 实现接口 8. 测试接口 9. 实现 Controller 9.1 密码加密处理 10. 实现前端界面 业务实现过程中主要的包和目录及主要功能&#xff1a; model 包&#xff1a;实体对象 d…

一文带你了解G1收集器:全功能的垃圾收集器

&#xff08;笔记参考书籍&#xff1a;《JVM高级特性与最佳实践》&#xff09; 一、介绍 Garbage First&#xff08;简称G1&#xff09;收集器是垃圾收集器技术发展历史上的里程碑式的成果&#xff0c;它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。 G1…

【Lua】(一)VSCode 搭建 Lua 开发环境

前言 最近在找工作&#xff0c;基本所有的岗位都会问到 Lua&#xff08;甚至拼 UI 的都要求会 Lua&#xff09;&#xff0c;咱能怎么办呢&#xff0c;咱也只能学啊…… 工欲善其事&#xff0c;必先利其器。第一步&#xff0c;先来把环境配置好吧&#xff01; 当前适用版本&a…

【玩转Linux操作】crond的基本操作

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;概述&#x1f354;命令⭐常用选项 &#x1f354;练…

如何解决由于找不到msvcp120.dll无法继续执行代码的问题

在使用电脑的过程中&#xff0c;突然遭遇到了一个让我犯愁的问题——缺少了msvcp120.dll文件。这个文件是系统中的一个重要组件&#xff0c;它的丢失导致了一些应用程序无法正常运行。面对这个困扰&#xff0c;我决定展开一场寻找和修复的心旅程。起初&#xff0c;我并不知道ms…

ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署

ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署 如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版&#xff1f;https://blog.csdn.net/m0_68274698/article/details/132069372?ops_request_misc&request_id&biz_id102&utm_termonlyoffice%20%E5%8D%8F%E4…