数据结构:复杂度分析

复杂度分析

对于算法的复杂度分析只要包含两个方面:

  • [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)

图示

典型层次

posted @ 2018-01-03 11:05  GoMountains  阅读(223)  评论(0编辑  收藏  举报