简单了解时间复杂度

 //有一天老板找我要我帮他女儿做一个题目,(他女儿在澳大利亚Emory(埃默里大学)读书),我太难了,她让我计算一下一段代码的时间复杂度和空间复杂度,这我咋知道啊,我一个大专毕业,问人吧。然后我问了一圈回来发现没一个人了解过的自己学吧,谁叫我牛逼已经吹出去了呢

简单了解时间复杂度_第1张图片

然后我就用了整整10个小时搞懂了一点点,后来我把答案给她的时候她也没回我,我也不清楚对不对。

今天做一个简单的总结吧

package com.cyc.collection.timecomplexity;
//  @Author cyc
//  @version : 1.0
//  @DateTime 2020/1/3 13:41
//  @Software: IDEA

public class time1 {
    public static void main(String[] args) {

        //写一个关于时间复杂度的实例
        //时间复杂度可以分为以下9个度数
        //O(1) -> O(logn) -> O(n) -> O(nlogn) -> O(n^2)     //这5种为正常算法复杂度了.....…    ^ 表示平方
        //O(n^3) -> O(2 ^ n) -> O(n!) -> O(n^n)             //这行开始的复杂度就非常大了,没必要了解,如果运行达到此类复杂就需要考虑优化了

        //下面我提一个问题,然后使用代码实现,并说明这个代码的时间复杂度是多少
        //问题:搞死先生小学老师的一道题目,计算从1-100数的总和

        int n = 100;

        //top 1     O(1)            //这个非常经典哦,只用了一行算法代码计算出结果
        int sum1 = (n + 1) * n / 2;   //运行一次,时间复杂度为 O(1),这也是搞死先生小年时期最经典的算法
        System.out.println("sum1:" + sum1);//结果:5050


        //top 2     O(logn) //这里再说明一下 log 表示一半或更少 , 下方代码i += 2让n执行的次数减半了,但结果是没变的
        int sum2 = 0;   //运行1次
        for (int i = 1; i < n + 1; i += 2) {    //运行n/2次
            sum2 += (i + n + 1 - i);            //运行n/2次
        }
        System.out.println("sum2:" + sum2);//结果:5050
        //这里小编和大家计算一下这个数,可能大家会有一点疑惑
        //1 + (n/2) + (n/2)  == O(logn)     //这个计算说到底还是n的一半不是吗


        //top 3     O(n)        //这个结果相信是大多数人计算的结果了把,使用最简单的+1方法
        int sum3 = 0;    //运行1次
        for (int i = 0; i < n + 1; i++) {           //运行n次
            sum3 += i;                          //运行n次
        }
        System.out.println("sum3:" + sum3);//结果:5050
        //(1 + n + n ) == (1 + 100 + 100) = (201) == (n)//201还是可以用n表示不是吗,只是更大了
//O(n)其实可以表示很多形态,只要不是多重循环或迭代情况,在多行代码中都可以使用O(n)表示



        //top 4     O(nlogn)    //这个其实可以结合上面大家推理一下就可以了
        //我们把问题加大,计算100个1-100的和//问题很白痴,但是是为了理解O(nlogn)的意思
        int sum4_1 = 0;         //运行1次
        for (int i = 0; i < n; i++) {   //运行 n 次
            int sum4_2 = 0;             //运行 n 次
            for (int j = 1; j < n + 1; j += 2) {    //运行 n*n / 2 次
                sum4_2 += (j + n + 1 - j);          //运行 n*n / 2 次
            }
            sum4_1 += sum4_2;                       //运行 n 次
        }
        System.out.println("sum4_1:" + sum4_1);//结果505000
        //这里我们要看的就是这两个循环,外层循环循环n次,内层循环循环外层循环的一半,顾名思义就是nlogn了


        //top 5     O(n ^ 2)    //这个就是n的平方
        //问题还是top 4 的问题
        int sum5_1 = 0;         //运行1次
        for (int i = 0; i < n; i++) {   //运行 n 次
            int sum5_2 = 0;             //运行 n 次
            for (int j = 0; j < n + 1; j++) {       //运行 n 次
                sum5_2 += j;                        //运行 n 次
            }
            sum5_1 += sum5_2;                       //运行 n 次
        }
        System.out.println("sum5_1:" + sum5_1);//结果505000
        //不想解释了,就是n的平方

    }
}

好了,学识才浅,小编看的bilibili小甲鱼之数据结构和算法系列视频了解的,小编整理了一个文章在有道云中,可以更详细的了解关于时间复杂度和空间复杂度的计算和理解。

文档:数据结构与算法- 图片.note
链接:http://note.youdao.com/noteshare?id=621e67a9c6e2555c73eb7efaeb6f36d4&sub=WEB56895daddfbc4de5a33393450f202cff

文档:数据结构与算法-文字.note
链接:http://note.youdao.com/noteshare?id=baba6b7d452a9db12ebbfae3d5088f6a&sub=WEB25d7949485761e41e67a6018cdc637ad

 

 

你可能感兴趣的:(数据结构与算法)