【跟我学Java就对了!!!】时间、空间复杂度


这块理解怎么算就行了。

1.时间复杂度

(1)概念

讲到时间复杂度,可能很多人都会觉得是计时,其实不是的,因为时间不好控制。

所以时间复杂度是按照基本操作的执行次数来记录的。

举个例子:

N是指问题规模,下面的代码可以吧N看作数字。
在这里插入图片描述
在这里插入图片描述
最坏情况就是最多执行次数。

平均情况就是任意规模的期望次数。

最好情况是最少运行次数。

(2)练习

①斐波那契数列的时间复杂度?

什么是斐波那契数列呢?
在这里插入图片描述
也就是0 1 1 2 3 5……这样的数列,也就是第三项是前两项之和。
在这里插入图片描述
看出来了吗?

所以,我们先来写一个斐波那契函数

class Fib{
    int ret =0;
    public int sfib(int x){
        if(x==0){
            ret = 0;
        }else if(x<3){
            ret = 1;
        }else if(x>2){
            ret = sfib(x-1)+sfib(x-2);
        }
        return ret;
    }
}
public class dd {
    public static void main(String[] args) {
        int x = 6;
        Fib fib = new Fib();
        int ret = fib.sfib(x);
        System.out.println(ret);
    }
}

那我们来分析一下啊:
在这里插入图片描述
这看起来像不像硕果累累的大树?

我们再来分析:

以上的数是一个实际的样子,但我们来抽象化一下:
在这里插入图片描述
所以它的时间复杂度,也就是执行次数 是这些的和,具体方法参考等比数列求和。

还要注意,其实斐波那契不是完全按照上面的抽象图的,实际会少一些递归次数。

看我画的树就知道了。

2.空间复杂度

(1)概念

临时需要额外占用的空间大小。
就比如我们拿数组来存储斐波那契数列,就会导致额外空间的占用。为什么呢?因为我们知识想求第20(假设)个斐波那契额数列,但我们需要知道前19个斐波那契额数列,所以我们需要临时存储前十多个斐波那契额数列。

现在的存储空间代价比较低,硬盘稍微便宜一些了,所以我们一般会拿更多的空间来换取时间,时间就是金钱,哈哈。

相关