一、时间复杂度与空间复杂度的作用
我们在编写程序时会涉及到各种算法,时间复杂度和空间复杂度的作用就是衡量一个算法的好坏,
其中,时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间(如遍历一个数组,数组元素所占空间为基本空间,不计入空间复杂度)。
=========================================================================
二、时间复杂度
2.1.时间复杂度的概念
算法中基本操作的执行次数,称为时间复杂度。
=========================================================================
2.2.大O的渐进表示法
我们可以计算一下下面的func1基本执行了多少次
void func1(int N){
int count = 0;
for (int i = 0; i < N ; i++) {
for (int j = 0; j < N ; j++) {
count++;
}
}
for (int k = 0; k < 2 * N ; k++) {
count++;
}
int M = 10;
while ((M--) > 0) {
count++;
}
System.out.println(count);
}
对于第一个for循环,其中又包含了一个for循环,因此执行次数为N^2,对于第二个for循环,执行了2N次,对于第三个while循环,执行了10次。
故基本操作的执行次数为F(N)=N^2+2N+10;
!实际上我们在计算时间复杂度时,不需要计算出准确的执行次数,只需要大概的执行次数即可,因此我们使用了大O的渐进表示法。
=========================================================================
2.3.推导大O阶方法
!!!注意:有时候同一个程序中算法地执行次数可能不相同,例如在数组中遍历查找一个元素时,有可能循环一次就找到了,也有可能到最后才到,那这个时候算法地时间复杂度怎么算呢?实际上,我们所说的时间复杂度指的是最坏地运行情况下得出的,即遍历数组时的时间复杂度为O(N)。
=========================================================================
三、空间复杂度
空间复杂度的计算与时间复杂度相似,也是使用大O的渐进表示法,但是时间复杂度算的是算法中变量的个数(即内存开辟的次数);
空间复杂度计算例题
1.
void bubbleSort(int[] array) {
for (int end = array.length; end > 0; end--) {
boolean sorted = true;
for (int i = 1; i < end; i++) {
if (array[i - 1] > array[i]) {
Swap(array, i - 1, i);
sorted = false;
}
}
if (sorted == true) {
break;
}
}
}
代码中一共有三个变量(end、sorted、i),因此空间复杂度为O(1)。
2.
void bubbleSort(int[] array) {
int[] fibonacci(int n) {
long[] fibArray = new long[n + 1];
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i <= n ; i++) {
fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
}
return fibArray;
}
由于在该方法中,有创建了一个数组用来存放原来的数组,因此这里开辟了n+1个空间,还有一个变量i,因此开辟了n+2个空间,故空间复杂度为O(n)。
3.
long factorial(int N) {
return N < 2 ? N : factorial(N-1)*N;
}
该方法一共递归了N次,因此空间复杂度为O(N)。