如此简单的时间复杂度计算方法:大O渐进法,你确定不进来康康

news2024/11/19 15:35:18

对于时间复杂度,空间复杂度,想必这个是大家在学习数据结构的初级阶段就会第一步认识的吧!!但是,对于复杂度的计算,涉及到了大O渐进法,这个方法是一个笼统的概念,所求得的结果,只是一个大概!并不准确!!希望大家能够了解!!

对于一个算法,我们怎能判断 这个算法是好??还是坏??是让我们能看懂??还是追求什么??因此下面便引用了复杂度(时间复杂度,空间复杂度)

. 算法效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作 空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间, 在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

1.时间复杂度

大O渐进法计算规则

  1. 用常数1取代运行时间中的所有加法常数!
  2. 在修改后的运行次数函数中,只保留最高项
  3. 如果最高项存在且不是1,则去除与这个项相乘的常数,所得到的结果就是大O阶!

下面笔者用代码加解析的方式,来带领大家走进大O渐进法!!

     //计算func1基本操作了多少次??
    void func1(int N) {
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                count++;
            }
        }

        for (int k = 0; k < 2*N; k++) {
            count++;
        }
        
        int M = 10;
        while ((M--) > 0) {
            count++;
        }
    }

对于上述的代码,一共分为三部分!!

  1. 第一部分:双重for循环控制的count++;
  2. 第二部分:  单层for循环控制的count++;
  3. 第三部分:  while循环控制的count++;

 对于上述画图的解析,想必大家都能清楚吧!! 因此上述代码一共循环:N*N + 2*N + 10次

但是,当随着N的增大……循环的次数也不断增大!!但是,增大的幅度不一样!!

当N = 10 时候:F(N) = 130 

当N = 100 时候: F(N) = 10210

当N = 1000 时候: F(N) = 1002010

因此,随着N的逐渐增大,此时的时间复杂度逐渐趋近于:N*N

因此,上述代码的时间复杂度用大O渐进法来表示就为:O(N^2)

小小练习一下,瞬间开心!!

计算func2的时间复杂度:

    //计算func2的时间复杂度
    void func2(int N) {
        int count = 0;
        for (int k = 0; k < 2*N; k++) {
            count++;
        }
        
        int M =10;
        while ((M--) > 0) {
            count++;
        }
    }

将上述代码进行解析为:

对于上述代码循环进行的总次数为:2*N + 10

因此,用大O渐进法来表示就为:O(N)

为什么将前面的2进行省略,请看笔者开头部分的大O渐进法计算规则:如果最高项存在且不是1,则去除与这个项相乘的常数

计算func3的时间复杂度:

    //计算func3的时间复杂度:
    void func3 (int N , int M ) {
        int count =0;
        for (int k = 0; k < M; k++) {
            count++;
        }
        for (int k = 0; k < N; k++) {
            count++;
        }
        System.out.println(count);
    }

对于上述的代码,

笔者在刚刚开始用大O渐进法来求时间复杂度的时候,一度以为这个答案会是:O(N)或者O(M)来着,这样想的原因是:当N/M趋近于无穷的时候,那么,复杂度就可以这样想了!!但是,那么疑问又来了:当N/M趋近于无穷的时候,会有栈溢出的现象,从而导致程序崩溃!!所以,这个用大O渐进法来表示时间复杂度为:O(M+N)  请大家好好想一下!!两个未知量M和N,不能省略掉任何一个!!

计算func4的时间复杂度?

   //计算func4的时间复杂度:
    void func4(int N) {
        int count=0;
        for (int i = 0; i < 100; i++) {
            count++;
        }
        System.out.println(count);
    }

对于这个时间复杂度的计算,咋一看代码,还以为是O(N)来着,但是,后来想了想,代码中并没有涉及到N的运算!!虽然,代码执行了100次,但是,仍然是一个常数,既然是一个常数,那么就可以用1来代替!所以,这个代码的时间复杂度为O(1)

 计算bubbleSort的时间复杂度?

  //计算bubbleSort的时间复杂度?
    void bubbleSort(int[] array) {
        for (int end = array.length; end > 0; end--) {
            boolean sorted =true ;
            for (int i = 1; i < end; i++) {
                if (array[i-1] > array[i]) {
                    Swap(array , i-1 , i); //交换数组两个元素,具体代码不再进行书写!
                    sorted = false;
                }
            }
            if (sorted == true) {
                break; //当没有进行交换的时候,说明已经排好序了!
            }
        }
    }

对于上述的代码,涉及到了嵌套的for循环,所以显得有点思维含量了!!

因此上述代码用大O渐进法来求时间复杂度为O(N^2)

计算下列代码的时间复杂度?

    //计算下列代码的时间复杂度?
    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            boolean flg = false;
            for (int j = 0; j < array.length-1-i; j++) {
                if (array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] =tmp;
                }
            }
            if (flg == false) {
                return ;
            }
        }
    }

其实这个代码的时间复杂度的分析思路跟上面那个代码的分析思路是一样的,在此,笔者便不再做过多的讲解!!

计算binarySearch(二分查找)的时间复杂度??

    //计算binarySearch的时间复杂度??
    int binarySearch(int[] array ,int value) {
        int begin =0;
        int end =array.length-1;
        while (begin <= end) {
            int mid = begin + ((end-begin)/2);
            if (array[mid] < value) {
                begin = mid+1;
            }else if (array[mid]  > value) {
                end =mid-1;
            }else {
                return mid;
            }
            return -1;
        }
    }

上述代码是一个典型的二分查找的代码!!不信的读者可以自行测试!!在此笔者就不再进行过多的讲解如何进行书写的了!!

对于这个二分查找的代码,其实时间复杂度为:O(logN)在Java当中,习惯将以2为底的log去掉2!!

上述代码的简单解析便在上图!!其实,对于二分查找的时间复杂度不在于记住!!而在于学会了这个方法!!简单建议!学会方法!!在笔者学习的时候,很多老铁都是事后记住了 最后的结果,但是,对于推到的过程确实……忘了!!

难度上升一下:

计算阶乘递归factorial的时间复杂度??

  //计算阶乘递归factorial的时间复杂度??
    long factorial(int N) {
        return N < 2 ? N :factorial(N-1)*N;
    }

对于上述代码,这个是我们在学习递归思想的一个简单列题,不知道大家是否还能记得??

对于递归的时间复杂度的计算方法跟上面的不太一样!!

递归的时间复杂度的计算方法为:

                                             递归的次数 * 每次递归后代码执行的次数!!

其实对于这个 公式,笔者到目前为止,运用还不是很清晰!!只能大概的讲述一下!!

在上述代码中,每次递归过来之后,代码都会执行一次三目运算符,则,每次递归后,代码的执行次数为1,但是,对于上述的代码,一共执行N次,所以,时间复杂度为:O(N)

计算斐波那契数递归的时间复杂度??

  //计算斐波那契数递归的时间复杂度??
    long fibonacci(int N) {
        return N < 2 ? N :fibonacci(N-1) + factorial(N-2);
    }

对于这个代码,显得有点儿难度上升了!!

在上述代码中,每次递归过来之后,代码都会执行一次三目运算符,则,每次递归后,代码的执行次数为1。

下面笔者画图来带领大家分析一下,简单的思路!!

上面便是时间复杂度的简单计算方法!!这些都是 笔者在学习的时候所接触过的列子!!

对于空间复杂度……在现实生活中,其实所要求的并不是很多,毕竟现在内存很大了!不再追求空间的效率了!但是,更多的时在于追求时间效率!!所以,笔者对于空间复杂度便不再做过多的讲解了!!若有其他的不同想法,请及时私聊笔者哟!!

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

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

相关文章

大一作业HTML个人网页作业(宠物狗)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

超算对我们的生活有着什么样的影响?

为什么各国都去抢超算的世界第一&#xff1f;因为它对人们的生活有着很大的影响。 一、核武器的成功研发离不开超算 对美国而言&#xff0c;超算的作用首先在研制核武器领域。加利福尼亚的利弗莫尔国家实验室、新墨西哥州的洛斯阿拉莫斯国家实验室、圣地亚国家实验室、橡树岭…

【分立元件】案例:一小批量生产就发现蜂鸣器一致性差?

在文章&#xff1a; 【分立元件】有源蜂鸣器和无源蜂鸣器有什么区别&#xff1f;_阳光宅男李光熠的博客-CSDN博客_有源和无源蜂鸣器 我们讲到有源蜂鸣器内部带震荡源&#xff0c;发声频率固定。无源内部不带震荡源&#xff0c;通过方波去驱动&#xff0c;发音频率可改变。一般…

(Java)SpringMVC学习笔记(一)

前言 今天开始学习SpringMVC&#xff0c;还是跟着尚硅谷视频自学&#xff0c;从两方面把握学习效果&#xff0c;一是知识点理解程度&#xff0c;一是实践程度&#xff0c;而我会将实践具体实现写以成文&#xff0c;用以回顾与分享 JavaWeb知识点简单回顾 JavaBean技术 为了…

订单服务------技术点及亮点

大技术 线程池来实现异步任务&#xff08;亮点1&#xff09; /*** 去结算确认页时封装订单确认页返回需要用的数据* return* throws ExecutionException* throws InterruptedException*/Overridepublic OrderConfirmVo confirmOrder() throws ExecutionException, Interrupted…

小红书推广笔记怎么合作?这里都给大家梳理好啦

截止 2021 年 11 月&#xff0c;小红书月活已达到 2 亿。其中72% 是 90 后群体&#xff0c;50% 的用户在一二线城市。 这些用户流量有着高消费、爱时尚、爱分享、追求品质生活的特点&#xff0c;所以小红书逐渐成为众多品牌方种草推广的必争之地。 小红书推广笔记怎么合作的呢…

FPGA学习笔记(十)IP核之PLL锁相环的学习总结

系列文章目录 一、FPGA学习笔记&#xff08;一&#xff09;入门背景、软件及时钟约束 二、FPGA学习笔记&#xff08;二&#xff09;Verilog语法初步学习(语法篇1) 三、FPGA学习笔记&#xff08;三&#xff09; 流水灯入门FPGA设计流程 四、FPGA学习笔记&#xff08;四&…

pytest自动化测试框架详解+mark标记+fixture夹具

介绍 pytest是python的一种单元测试框架&#xff0c;同自带unittest框架类似&#xff0c;功能&#xff0c;效率更强大 特点&#xff1a; 1. 非常容易上手&#xff0c;入门简单&#xff0c;丰富的文档 2. 支持参数化 3. 执行测试用例的过程中&#xff0c;跳过某些用例&#x…

Python环境搭建

将向大家介绍如何在本地搭建Python开发环境。 Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。) W…

Dev-C++ 的下载、安装和配置

Dev-C 的下载、安装和配置 Dev-C 下载 我们直接打开 https://sourceforge.net/projects/orwelldevcpp/ 点击 Download 进行下载即可&#xff0c;如下图所示&#xff1a; 下载速度也不错&#xff0c;很快就可以下载完成了。 不像某些博主&#xff0c;为了引流量&#xff0c;…

Cadence Allegro PCB设计88问解析(二十二) 之 Allegro中放入元器件

一个学习信号完整性仿真的layout工程师 在之前的文章和大家介绍过Allegro中导入网表&#xff0c;那么导入网表成功之后&#xff0c;还在Allegro在进行一步就是放入导入成功的器件。下面和大家简单介绍具体的操作过程&#xff1a; 第一步&#xff1a;添加版外形outline 我们在…

DAX:SUMMARIZE的秘密

作为一个查询函数&#xff0c;SUMMARIZE 执行三个操作&#xff1a; 它可以按表本身或相关表的任何列对表进行分组&#xff1b;它可以创建新列&#xff0c;在行上下文和过滤上下文中计算表达式&#xff1b;它可以产生不同级别的小计(subtotal)。 在 SUMMARIZE 的三个主要操作中&…

PHP代码审计系列(三)

PHP代码审计系列&#xff08;三&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 sql闭合绕过 源码如下 <?phpif($_POST[user] && $_POST[pass]) {$conn mysql_connect("*******…

关于操作PPL进程引发的一些问题

背景 之前发布过一篇关于procexp的利用&#xff0c;但是最近有brother说&#xff0c;最新的版本不能利用了&#xff0c;然后就去下载了最新版本的。 发现判断了是不是受保护进程&#xff0c;不是就拒绝。 这里简单看一下这个函数&#xff0c;发现对比的是_PS_PROTECTION,其实就…

windows cmd指令记录、监听进程是否存在、exe注册到服务中开机后台运行

cmd指令记录 mstsc&#xff1a;远程桌面 regedit&#xff1a;打开注册表 control userpasswords2&#xff1a;去掉开机登录界面 shell:startup&#xff1a;进入登录界面后自启程序 services.msc&#xff1a;启动、终止并设置服务管理界面 shutdown -r -t 0&#xff1a;-r…

一步一步学Iceberg-对比Flink+Kafka和Flink+Iceberg的差异

一 FlinkKafka做实时数仓的弊端 我们以前&#xff08;包括现在&#xff09;还有用FlinkKafka做实时数仓&#xff0c;以及日志传输。Kafka本身的存储成本很高&#xff0c;并且数据保留时间有时效性&#xff0c;一旦消费积压&#xff0c;数据达到过期事件后&#xff0c;就会导致…

[附源码]JAVA毕业设计文件发布系统(系统+LW)

[附源码]JAVA毕业设计文件发布系统&#xff08;系统LW&#xff09; 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; …

Talk预告 | 剑桥大学在读博士生苏熠暄:对比搜索(Contrastive Search)—当前最优的文本生成算法

本期为TechBeat人工智能社区第461期线上Talk&#xff01; 北京时间12月8日(周四)20:00&#xff0c;剑桥大学在读博士生——苏熠暄的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “对比搜索&#xff08;Contrastive Search&#xff09;—当前最优的…

【Keras计算机视觉】Faster R-CNN神经网络实现目标检测实战(附源码和数据集 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、目标检测的概念 目标检测是计算机视觉和数字图像处理的一个热门方向&#xff0c;广泛应用于机器人导航、智能视频监控、工业检测、航空航天等诸多领域&#xff0c;通过计算机视觉减少对人力资本的消耗&#xff0c;具有重要的现…

抗疫专题网页设计 致敬最美逆行者网页制作 疫情感动人物静态HTML网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…