一、阶数比较
时间复杂度判断理论: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