《数据结构和算法》中时间复杂度和空间复杂度都是衡量程序效率的一种方式。
一、时间复杂度: 衡量的是程序运行的快慢。
- 衡量时间复杂度的时候,需要先确定基本操作(执行次数最多的典型操作)是啥,可能是++,可能是赋值,也可能是读取,还有可能是打印等。其次利用大O的渐进表示法粗略的描述问题发展的趋势。(执行次数和复杂度成正比,不是精确)
- 大O的渐进表示法:计算基本操作执行的次数,保留最高阶项,同时去掉系数,得到了一个用来衡量复杂杜的“近似值”,用O()表示。
例:
void func(int N){
int count=0;
for (int i=0;i<N;i++){
for (int j=0;j<N;j++){
count++;//执行N^2次
}
}
for (int k=0;k<2*N;k++){
count++;//执行2N次
}
int M=10;
while((M--)>0){
count++;//执行10次
}
System.out.println(count);
}
执行次数最多的典型操作是count++
总共执行 N^2+2*N+10 次;
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行的次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。func的时间复杂度为:
O(N^2)
ps:
O(1)不一定比O(N)要快。(只是粗略的描述问题发展的趋势)
二、空间复杂度: 衡量的是程序占用内存/外存的大小。
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。
利用冒泡排序举例空间复杂度:
void bubbleSort(int[] array){
for (int end=array.length;end>0;end--){//end是一份额外空间
boolean sorted=true;
for (int i=1;i<end;i++){//i是一份额外空间
if(array[i-1]>array[i]){
Swap(array,i-1,i);//Swap是一份额外空间(Swap是交换元素位置的方法)
sorted=false;
}
}
if (sorted=true){
break;
}
}
}
bubbleSort的空间复杂度为:
O(1)
总结:铁打的营盘(内存),流水的兵(数据)。