数据结构:复杂度分析
复杂度分析
对于算法的复杂度分析只要包含两个方面:
- [1] 时间复杂度
- [2] 空间复杂度
复杂度记法
O=>最坏情况
Ω=>最好情况
θ=>介于O与Ω之前的情况
如下图:
通常我们使用Big-O度量算法的复杂度
复杂度层次
典型的复杂度层次包括:
- [1] O(1)
- [2] O(log*n)
- [3] O(log (log n))
- [4] O(log n)
- [5] O(sqrt(n))
- [6] O(n)
- [7] O(n * log *n)
- [8] O(n * log (log n))
- [9] O(n * log n)
- [10] O(n2)
- [11] O(n3)
- [11] O(nc)
- [12] O(2n)
log2n的产生
for(int j = 1; j < n; j<<=1){
//do something
}
首先: j = 1;
接着: j = j * 2,所以后面可以认为是: j = j * 2x;
那么什么时候 j * 2x < n 呢?(因为原始的j = 1,因此此处可以写为 2x < n);
同时对两边取以2为底的对数,可得 x = log2n;
此处的x就是这个循环的次数.
log2(logkn)的产生
for(int k = 2; k < n; k = k * k){
//do something
}
首先: k = 2;
接着: k = k2,所以后面的数可以认为是:
$$
k = k^j ( j = 2^x,x即时我们此处需要的循环次数)
$$
第1次对两边取以k为底的对数可得: 2x = logkn
第2次对两边取以2为底的对数可得: x = logx(logkn)
图示
祝:玩得愉快!