【通用】复杂度分析

序言

我们如何判断一个算法的好坏?

我们如何对比不同算法?


一、时间复杂度

「大O表示法」算法的渐进时间复杂度

        T(n)=O(f(n))

例题1:

for(int i = 1;i <=n ;i++){
    x++;
}

在因为时间复杂度的计算是认为n接近于无限大的情况下,所以

         O(1+3n)=O(n) 

例题2:

for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++){
        x++;
    }
}

两层循环

O(n^{2})

拓展:

如果把例题1和例题2的程序同时运行呢?

for(int i = 1;i <=n ;i++){
    x++;
}
for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++){
        x++;
    }
}

        O(n+n^{2}) 

在n趋于无限大的情况下,用大O表示法,最终可得:

        O(n+n^{2})=O(n^{2})

例题3:

int i = 1;
while(i<n){
    i=i*2;
}

i每次执行循环都会变为之前的2倍,所以 2^k = n => k = logN,所以:

        O(logN) 

例题4:

for(int i=0;i<=n;i++){
    int i = 1;
    while(i<n){
        i=i*2;
    }
}

可以看出,这个就是在例题3外面套上一个例题1的for循环,所以可得:

        O(nlogN) 


二、常用复杂度量级分析

1.常数阶 O(1)

2.对数阶 O(log N)

3.线性阶 O(n)

4.线性对数阶 O(nlogN)        

5.平方阶 O(n^2)

6.立方阶 O(n^3)

7.K次方阶 O(n^k)

8.指数阶 O(2^n)

9.阶乘 O(n!)


三、空间复杂度

内存空间增长的趋势

常用的空间复杂度:O(1)O(n)O(n^2)

例题5:

int x = 0;
int y = 0;
x++;
y++;

创建了常数量个变量,所以,空间复杂度为常数阶:  

      O(1)

例题6: 

int[] newArray = new int[n];
for(int i=0;i<n;i++){
    newArray[i] = i;
}

创建了一个数组,数组中要放n个项,所以空间复杂度为n阶:   

     O(n)


四、总结

「时间空间复杂度」= 时间和空间增长的趋势 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值