时间复杂度与空间复杂度
时间复杂度
时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。常用大O表述。
常见的时间复杂度
- 常数阶 O(1)
- 对数阶 O( l o g N logN logN )
- 线性阶 O(n)
- 线性对数阶 O( n l o g N nlogN nlogN)
- 平方阶 O( n 2 n^2 n2)
- 立方阶 O( n 3 n^3 n3)
- K次方阶 O( n k n^k nk)
- 指数阶 O( 2 n 2^n 2n)
- …
其复杂度由小到大:
O(1) < O(
l
o
g
N
logN
logN ) < O(n) < O(
n
l
o
g
N
nlogN
nlogN) < O(
n
2
n^2
n2) < O(
n
3
n^3
n3) < O(
n
k
n^k
nk) < O(
2
n
2^n
2n) < O(n!) < O(n^n)
常数阶 O(1)
Tips:只要没有循环等复杂结构,那么其代码的时间复杂度就是O(1),如:
int i = 1;
int j = 2;
i++;
j--;
上述代码执行时,其消耗不随某个变量的增长而增长,那么无论代码多长,如几万十几万,都可以用O(1)表示其时间复杂度。
线性阶 O(n)
for(int i = 1; i < n; i++){
int j = i;
j++;
}
for循环中的代码会执行n遍,因此其运行时间随n的变化而变化,所以时间复杂度为O(n)。
对数阶 O( l o g N logN logN )
int i = 1;
while(i < n){
i = i * 2;
}
可以从上述代码看到,循环体中每次将i乘以2,当第X次时,i的值为 2 x 2^x 2x,当其大于n时就退出循环,即 2 x ≥ n 2^x ≥ n 2x≥n,x =logxn 。因此时间复杂度为 O( l o g N logN logN ) 。
线性对数阶 O( n l o g N nlogN nlogN)
将对数阶和线性阶代码结合调整:
for(int i = 1; i < n; i++){
int j = i;
while(j < n){
i = i * 2;
}
}
如上, 线性对数阶的时间复杂度相当于把复杂度为O( l o g N logN logN )的代码循环n遍,就是O( n l o g N nlogN nlogN)了。
平方阶 O( n 2 n^2 n2)
平方阶就是将O(n)的代码嵌套再循环一遍:
for(int i = 1; i < n; i++){
for(int j = 1; j < n; j++){
int x = j;
x++;
}
}
若将两层循环中的一层改为m:
for(int i = 1; i < n; i++){
for(int j = 1; j < m; j++){
int x = j;
x++;
}
}
那么时间复杂度就变成了O( n ∗ m n*m n∗m)。
立方阶 O( n 3 n^3 n3)和K次方阶 O( n k n^k nk)
立方阶以及K次方阶原理与平方阶类似,不在赘述。
空间复杂度
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
一个算法在计算机存储器上所占用的存储空间,包括程序代码所占用的空间,输入数据所占用的空间和辅助变量占用的空间这三个方面。
注:
一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。
常数阶 O(1)
类似于时间复杂度 O(1),当算法的存储空间大小固定,和输入规模没有直接的关系时,空间复杂度记作O(1)。
int m = 2;
线性阶 O(n)
当算法分配的空间是一个线性的集合(如数组),并且集合大小和输入规模 n 成正比时,空间复杂度记作 O(n)。
int[] array = new int[n]
平方阶 O( n 2 n^2 n2)
当算法分配的空间是一个二维数组集合,并且集合的长度和宽度都与输入规模 n 成正比时,空间复杂度记作 O( n 2 n^2 n2)
int[][] matrix = new int[n][n];
最后列出参考的几篇文章
时间复杂度:
https://blog.csdn.net/m1195900241/article/details/118443745
https://wenku.baidu.com/view/f3347db3de88d0d233d4b14e852458fb760b3857.html
https://www.csdn.net/tags/OtTaYgxsMDI1MTctYmxvZwO0O0OO0O0O.html
空间复杂度:
https://blog.csdn.net/qq_42194657/article/details/100727054
https://mindartisan.blog.csdn.net/article/details/113058696