【数据结构与算法】时间复杂度和空间复杂度

一、阶数比较

时间复杂度判断理论:O(1) <= O(log2(n)) <= O(n) <= O(n*log2(n)) <= O(n^2) <=...<=O(n^k) <= O(2^n)

二、计算方法

用常数1代替运行时间中的所有加法常数

修改后的运行次数中只保留最高阶项

去除最高阶项的系数

三、常见的求时间复杂度例子

1、常数阶

int a=1;
int b=a+2;

这种只执行常数规模的情况时间复杂度是O(1)

2、对数阶(O(log2n))

1 int n=100;
2 int i=1;
3 while(i<=n){
4 i=i*1;
5 }

在while循环里每次都将i乘以2,i距离n越来越近,如果循环x次之后i大于n此时这个循环退出也就是说2的x次方等于n那么x=log2n也就是说当循环log2n次以后,这个代码就结束了,此时这个短发的时间复杂度是O(log2n),o(LOG2n)的这个n是随着代码变化的,如果里面不是2倍递增则将发生相应变化eg:i=i*3 则时间复杂度为O(log3n)

3、线性阶

1 int j=0;
2 for(int i=1;i<=n;i++){
3 j++;
4 }

这个代码,for循环里面的代码会执行n编,因此它消耗的时间是随着n的变化而变化O(n)

4、线性对数阶O(nlogN)

1 int j=0;
2 for(int i=1;i<=n;i++){
3 j=1;
4 while(j<n){
5 j=j*2;
6 }
7 }

线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

5、平方阶O(n2)

1 int a=0;
2 for(int i=1;i<=n;i++){
3     for(int j=1;j<=n;j++){
4        a=a+1;
5       j++;
6     }
7 }

如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²),这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(nn),即 O(n²) 如果将其中一层循环的n改成m,那它的时间复杂度就变成了 O(mn)

1 for(i=o;i<n;i++){
2 
3         for(j=i;j<n;j++){
4           
5 }       
6 
7  }

 这里分析下,当i=0的时候,J可以循环N次,i=1的时候,J循环N-1次,所以得出:

  n+n-1+n-2+.....+1=(n+1)*n/2=N^2/2+N/2;也是O(n2)

6、k次方阶

同2次方阶

 

 

  

https://www.cnblogs.com/coder-programming/p/11093608.html

转载于:https://www.cnblogs.com/dream-to-pku/p/11471412.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值