说明:该系列博客整理自《算法导论(原书第二版)》,但更偏重于实用,所以晦涩偏理论的内容未整理,请见谅。另外本人能力有限,如有问题,恳请指正!
1、渐近符号
当输入规模大到使运行时间只和增长的量级有关时,就是在研究算法的 渐近 效率。就是说,从极限角度看,我们只关心算法运行时间如何随着输入规模的无限增长而增长。通常,对不是很小的输入规模而言,从渐近意义上说更有效的算法是最佳的选择。
表示算法的渐近运行时间的记号是用定义域为自然数集 N = {0, 1, 2, …} 的函数来定义的。这些记号便于用来表示最坏情况运行时间 T ( n )。这些记号的定义域可以很容易地扩充至实数域或缩小到自然数的某个受限子集上,但要注意搞清楚这些表示法的准确含义,方能做到越规使用而不误用。
1.1、Θ 记号:表示渐近值,即真实值在渐近值的基础上波动
对一个给定的函数 g ( n ),用 Θ ( g ( n ))来表示函数集合:
对任何一个函数 f ( n ),若存在正常数 c1 , c2 ,使当 n 充分大时, f ( n )能被夹在 c1 g ( n )和 c2 g ( n )之间,则 f ( n )属于集合 Θ ( g ( n ))。可以写成“ f ( n ) ∈ Θ ( g ( n ))”表示 f ( n )是 Θ ( g ( n ))的元素。不过,通常写成“ f ( n ) = Θ ( g ( n ))”来表示相同的意思。
上图给出了函数 f ( n )和 g ( n )的直观图示,其中 f ( n ) = Θ ( g ( n ))。对所有位于 n0 右边的 n 值, f ( n )的值落在 c1 g ( n )和 c2 g ( n )之间。换句话说,对所有的 n >= n0 , f ( n )在一个常数因子范围内与 g ( n )相等。我们说 g ( n )是 f ( n )的一个 渐近确界 。
Θ ( g ( n ))的定义要求每个成员 f ( n ) ∈ Θ ( g ( n ))都是 渐近非负 ,就是说当 n 足够大时 f ( n )是非负值。这就要求函数 g ( n )本身也是渐近非负的,否则集合 Θ ( g ( n ))就是空集。
Θ 记号表示渐近值,效果相当于舍弃了低阶项和忽略了最高阶项的系数,即真实值在渐近值的基础上波动。
1.2、O 符号:表示上界
Θ 记号表示渐近值。当只有 渐近 上界时,使用 O 记号。对一个函数 g ( n ),用 O ( g ( n ))表示一个函数集合:
上图说明了 O 记号的直观意义。对所有位于 n0 右边的 n 值,函数 f ( n )的值在 g ( n )下。
1.3、Ω 记号:表示下界
Ω 记号给出了函数的渐近下界。给定一个函数 g ( n ),用 Ω ( g ( n ))表示一个函数集合:
上图说明了 Ω 记号的直观意义。对所有在 n0 右边的 n 值,函数 f ( n )的数值等于或大于 c g ( n )。
定理
对任意两个函数 f ( n )和 g ( n ), f ( n ) = Θ ( g ( n ))当且仅当 f ( n ) = O ( g(n))和 f ( n ) = Ω ( g ( n ))。
1.4、o 记号
O 记号提供的渐近上界可能是也可能不是渐近紧确的。这里用 o 记号表示非渐近紧确的上界。 o ( g ( n ))的形式定义为集合:
O 记号与 o 记号的主要区别在于对 f ( n ) = O ( g ( n )),界0 <= f ( n ) <= c g ( n )对某个常数 c > 0成立;但对 f ( n ) = o ( g ( n )),界0 <= f ( n ) <= c g ( n )对所有常数 c > 0都成立。即
1.5、ω 记号
我们用 ω 记号来表示非渐近紧确的下界。 ω ( g ( n ))的形式定义为集合:
关系 f ( n ) = ω ( g ( n ))意味着
如果这个极限存在。也就是说当 n 趋于无穷时, f ( n )相对 g ( n )来说变得任意大了。
2、算法中常见函数介绍
暂未整理
3、参考文档