对于每一个设计出来的算法都需要从两个方面来分析:时间复杂度和空间复杂度
计算如下算法的时间复杂度和空间复杂度
题目一
int a = 0, b =0;
for (i = 0; i < n; i ++){
a = a + round();
}
for(j =0; j < n/2; j++){
b = b + round();
}
时间复杂度 O(N)
空间复杂度 O(1)
赋值了两个常数a和b,分配了两个单位的内存空间,与N无关,所以空间复杂度为O(1) constant space complexity(常数空间复杂度)
题目二
int a = 0;
for (i =0; i< N; i ++){
for (j =N; j>i; j++){
a = a + i + j;
}
}
时间复杂度计算如下:
i = 0 j = N...1 需要N次操作
i = 1 j = N...2 需要N-1次操作
i = 2 j = N ...3 需要N-2次操作
i = N-1 j = N需要1次操作
(1+N)*N/2
时间复杂度 O(N^2)
空间复杂度 O(1)
题目三
int i, j, k = 0;
for (i = n/2; i <=n; i ++) {
for(j = 2; j<= n; j=j*2){
k = k + n/2
}
}
时间复杂度 O(NlogN)
空间复杂度 O(1)
题目四
int a = 0, i =N;
while (i > 0){
a += i;
i/= 2;
}
时间复杂度 O(logN)
空间复杂度 O(1)
我们每当说算法x的效率要高于算法y指的是?
答:指的是时间复杂度,例如x(logn) > y(n) ;x(nlogn)> y(n^2)
x实际的效率(秒)> y实际的效率(秒)不一定!!!
n足够大
定理:if x的时间复杂度要优于y的时间复杂度,那么,假设存在一个足够大的数M,当n>M时,我们可以保证x的实际效率大于y的实际效率
C*O(n) = O(n) if only if C跟n没有相关性
O(logn) :从tree、heap中寻找一个element, binary search二分查找
O(nlogn): quicksort mergesort heapsort