观察一个算法的时间复杂度,有效的思考方式是:看问题的规模随算法的推进不断递减的程度。
下面以一个求2的n次方的简单程序为例:
long long power2(int n)
long long poe =1;
while(0< n --)
pow <<= 1;
return pow;
}//O(n)
问题的规模,每次减少1,要执行n次,时间复杂度为O(n)。
优化后:
long long sqr(long long a) {return a*a}
long long power2(int n){
if (n==0) return 1;
return (n & 1) ? sqr(power2(n >> 1)) <<1 : sqr(power2(n >>1));
}
每执行一次递归,n就要除以2,所以时间复杂度为O(logn)