我们先来看一个简单的Java例子,来感受下时间复杂度的计算
public class Java11Test {
public static void main(String[] args) {
int[] array={3,7,9,1,4,6,2,8,5,0};
System.out.println(arraySearch(array, 10, 6)); // 5
System.out.println(arraySearch(array, 10, 66)); // -1
}
// 查找成功返回该元素的index, 失败返回-1
public static int arraySearch(int[] array, int valueNumber, int value) {
for(int i = 0; i < valueNumber; i++) { // 1次 n+1次 n次
if(array[i] == value) { // n次
return i; // 1次
}
}
return -1;
}
}
则arraySearch
函数的时间复杂度T(n) = O(f(n)) = O(1 + (n + 1) + n + n + 1) = O(3n + 3) = O(n)
程序示例:
int i = 1;
while (i < n) {
i = i * 2;
}
在while循环里面,每次都将i乘以 2,乘完之后,i 距离n就越来越近了。假设循环x次之后,i就大于n了,此时这个循环就退出了,也就是说2的x次方等于n,那么x = l o g 2 n log_2n log2n。因此这个代码的时间复杂度为: O ( l o g 2 n ) O(log_2n) O(log2n)。 当代码中i = i * 3 ,则时间复杂度是 O ( l o g 3 n ) O(log_3n) O(log3n)
程序示例:
for(int m = 1; m < n; m++) {
int i = 1;
while (i < n) {
i = i * 2;
}
}
将时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)的代码循环n遍的话,那么它的时间复杂度就是 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
O(1) < O(log n) < O(n) < O(n logn) < O( n 2 n^2 n2) < O( n 3 n^3 n3) < O( 2 n 2^n 2n) < O(n!)
其中 l o g k n log_kn logkn渐进为logn
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元
在大多数应用场景,一个好的算法更看重时间复杂度,而空间复杂度只要合理即可