白话时间复杂度与空间复杂度

时间复杂度

用于表示,算法解决规模为n的问题所消耗的时间。
理解:用同一代码块段执行的次数衡量

sum = n*(n+1)/2; //顺序执行时,此代码块只会运行一次因此时间复杂度为 O(1)
for(int i = 0; i < n; i++){
    printf("%d ",i);     //根据上面的理解它的时间复杂度O(n)
}                       

有些时候为了表示方便也会取近似值如:

for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
        printf("%d ",i);       //准确的时间复杂度为O(n^2)
    }
}               

for(int i = 0; i < n; i++){
    for(int j = i; j < n; j++){
        printf("%d ",i);//此代码块运行次数为 (1+n)*n/2 
//由高数中的极限可推n无限大时,(1+n)*n/2极限为n^2,因此时间复杂度O(n^2)
    }
}   

那 log2n是怎么出现的

int i = 1, n = 100;
while(i < n){
    i = i * 2;   //设执行次数为x。 2^x = n 即x = log_2 n,时间复杂度O(log2n)
//当循环步数不为1跳跃时,便会产生多种答案
}

参考 时间复杂度和空间复杂度

空间复杂度

用于表示,算法解决规模为n的问题所消耗的空间。
理解:生成额外空间的数量(临时变量在内)

    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b =temp;
    }

一个简单交换的完成,借助了一个临时变量temp才得以完成,所以空间复杂度为O(1)

    public static void swap(int a, int b) {
        a = a+b;
        b = a-b;
        a = a-b;
    }

而使用加减法交换就不会产生临时变量因此空间复杂度为O(0)

猜你喜欢

转载自blog.csdn.net/s1991721/article/details/79915726