算法 时间复杂度概念及案例

算法 时间复杂度概念及案例通过时间复杂度可以判断程序算法过程的优势和劣势,提高运行性能

大家好,又见面了,我是你们的朋友全栈君。

概念

常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。

时间复杂度为一个算法流程中,常数操作数量的指标。常用O(读作big O)来表示。具体来说,在常数操作数量的表达式中,只要高阶项不要低阶项,也不要高阶项的系数,剩下的部分,如果记为f(N),那么时间复杂度为O(f(N))。

算法的时间复杂度,用来度量算法的运行时间,记作: O(f(N))。它表示随着 输入大小N的增大,算法执行需要的时间的增长速度可以用 f(N) 来描述。

上面概念可能比较抽象,下面我们用案例的方式来举例下,一般我们是先拿到f(N),然后来算下他的时间复杂度,一般我们只保留对函数增长速度较大的函数
例如:
1、f(N)=c(c是常数),我们称时间复杂度为O(1)
2、f(N)=a*N+b(a和b是常数),我们称时间复杂度为O(N)
3、f(N)=a*N^2+b*N+c(a,b,c均为常数),我们称时间复杂度为O(N^2)
4、f(N)=a*N^2*logN+b*N+c(a,b,c均为常数),我们称时间复杂度为O(N^2*logN)

案例

    public String test() {
        System.out.println("hello world"); // 需要执行 1 次
        return "你好"; // 需要执行 1 次
    }

上面的代码执行了2次,则f(N)=2;则时间复杂度为O(1);



    public int test() {
        for (int i = 0; i < N; i++) { 
            System.out.println("hello world1"); // 需要执行 N 次
            System.out.println("hello world2"); // 需要执行 N 次
        }
        System.out.println("hello world3"); // 需要执行 1 次
    }

上面的代码执行了2N+1次,则f(N)=2N+1,时间复杂度为O(N)


public int test() {
        for (int i = 0; i < N; i++) { 
            for (int j = 0; j < N; j++) {
                System.out.println("hello world"); // 需要执行 N*N 次
            }
        }
    }

上面的代码执行了N*N次,则f(N)=N^2,时间复杂度为O(N^2)


当出现条件或者顺序执行的语句时,总是取最大的时间复杂度,或者说最差的情况

public int test() {
        //循环1:时间复杂度为O(N^2)
        for (int i = 0; i < N; i++) { 
            for (int j = 0; j < N; j++) {
                System.out.println("hello world"); // 需要执行 N*N 次
            }
        }
        //循环2:时间复杂度为O(N)
        for (int i = 0; i < N; i++) { 
            System.out.println("hello world1"); // 需要执行 N 次
        }
    }

上面代码的时间复杂度为O(N^2+N)=O(N^2)

public int test() {
        if(){
            //循环1:时间复杂度为O(N^2)
            for (int i = 0; i < N; i++) { 
                for (int j = 0; j < N; j++) {
                    System.out.println("hello world"); // 需要执行 N*N 次
                }
            }
        }else{
            //循环2:时间复杂度为O(N)
            for (int i = 0; i < N; i++) { 
                System.out.println("hello world1"); // 需要执行 N 次
            }
        }
    }

上面代码的时间复杂度为O(N^2)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146752.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL 中 concat 函数

    MySQL 中 concat 函数MySQL中concat函数concat函数MySQL中concat函数MySQL中concat_ws函数MySQL中group_concat函数语法:concat(str1,str2,…)注意:返回结果为连接参数产生的字符串,如果有任何一个参数为NULL,则返回值为NULL。selectconcat(“a”,”b”,”c”);输出:abc注:Mysql的concat函数在连接字符串的时候,只要其中一个为NULL则返回值为NULL.sel

    2022年5月6日
    40
  • 6种不同画法画平行线_9.2 平行线和它的画法(练习)-2019-2020学年七年级数学下册同步精品课堂(青岛版)…[通俗易懂]

    6种不同画法画平行线_9.2 平行线和它的画法(练习)-2019-2020学年七年级数学下册同步精品课堂(青岛版)…[通俗易懂]资料简介:第九章平行线9.2平行线和它的画法精选练习答案一.选择题(共4小题)1.(2018春•沧州期中)在同一平面内,不重合的两条直线的位置关系是(  )A.平行B.相交C.平行或相交D.平行、相交或垂直【答案】C【详解】解:在同一平面内,不重合的两条直线只有两种位置关系,是平行或相交,所以在同一平面内,不重合的两条直线的位置关系是:平行或相交.故选:C.2.(2019春•铁西区校级月考)下列…

    2022年9月20日
    3
  • 用 Unity 进行网络游戏开发(一)

    用Unity进行网络游戏开发(一)这是我之前写的了,一直保存在电脑里,现在学习写博客。希望多和大家交流,共同进步,文章中说得不好的地方请指出,谢谢!使用Unity3D进行网络游戏开发一.Unity3d简介   Unity3d是时下比较流行的一款游戏引擎,流行是因为用它做游戏很方便,无论是3d还是2d都会有非常好的效果,即便某些朋友不懂编程,也可以通过U

    2022年4月12日
    728
  • ★ Android基础篇 Android 数据存储与性能

    ★ Android基础篇 Android 数据存储与性能

    2021年3月12日
    161
  • vue报错cannot read property_vue3 ref 数组

    vue报错cannot read property_vue3 ref 数组当函数执行到this.agents.splice()时,我设置了断点。发现传参index是0,但是页面上的列表项对应的第一行数据没有被删除,WTF!!!这是什么鬼!然后我打开VueDevtools,然后刷新了一下,发现那个数组的第一项还是存在的removeOneAgentByIndex:function(index){this.agents.splice(index,1)…

    2022年9月15日
    3
  • RARP_arp协议主要用来

    RARP_arp协议主要用来ARP的工作原理如下:1.首先,每台主机都会在自己的ARP缓冲区(ARPCache)中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。2.当源主机需要将一个数据包要发送到目的主机时

    2022年8月5日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号