1、1.3 渐近符号设 是算法 A 的复杂性函数。一般说来,当 单调增加趋于 时,)(nT n也将单调增加趋于 。如果存在函数 ,使得当 时有)(T,则称 是 当 时的渐近性态,或称0)(/)()(n是算法 A 当 的渐近复杂性。因为在数学上, 是 当nTn )(nT时的渐近表达式, 是 中略去低阶项所留下的主项,所以它无疑)(T比 来得简单。)(进一步分析可知,要比较两个算法的渐近复杂性的阶不相同时,只要确定出各自的阶,就可以知道哪一个算法的效率高。换句话说,渐近复杂性分析只要关心 的阶就够了,不必关心包含在 中的常数因子。所以,我们常常)(nT)(nT有对 的分析进一步简化,即假设算法中用到的
2、所有不同的运算(基本)各执行一次所需要的时间都是一个单位时间。综上分析,我们已经给出了简化算法复杂性分析的方法和步骤,即只考虑当问题的规模充分大时,算法复杂性在渐近意义下的阶。为此引入渐近符号,首先给出常用的渐近函数。常 用 的 渐 进 函 数在下面的讨论中,用 f(n)表示一个程序的时间或空间复杂性,它是实例特征 n(一般是输入规模)的函数。由于一个程序的时间或空间需求是一个非负的实数,我们假定函数 f(n)对于 n 的所有取值均为非负实数,而且还可假定函数 名称 函数 名称1 常数 n2 平方log n 对数 n3 立方n 线性 2n 指数n log n n 倍 log n n! 阶乘n=
3、0。渐近符号 O 的定义:f(n)=O(g(n)当且仅当存在正的常数 c 和n0,使得对于所有的 n=n0,有 f(n)c-100 就有 n2+100n+6cn。同理,3n2+42n=O(n2)是错误的界限。3 f(n)=O(g(n)不能写成 g(n)=O(f(n),因为两者并不等价。实际上,这里的等号并不是通常相等的含义。按照定义,用集合符号更准确些:O(g(n)=f(n)|f(n)满足:存在正的常数 c 和 n0,使得当 n=n0时,f(n)=cg(n)所以,人们常常把 f(n)=O(g(n)读作:“f(n)是 g(n)的一个大 O 成员” 。大 O 比率定理:对于函数 和 ,如果极限 存
4、在,则)(nfg)(/limngfn当且仅当存在正的常数 c,使得 .)()(ngf cf/)(li证明:略。例子 因为 ,所以 ;32limn )(2nO因为 ,所以 ;10410li2nn )(2422n因为 ,所以 ;6*6linn )(*2nn因为 ,所以 ,023lim16nn )(3216nO但是这不是一个好的上界估计,问题出在极限值不是正的常数。下述不等式对于复杂性阶的估非常有帮助:定理 2.3.1. 对于任意一个正实数 和 ,有下面的不等式:x1) 存在某个 使得对于任何 ,有 。0n0nxxn)(log)(l2) 存在某个 使得对于任何 ,有 。3) 存在某个 使得对于任何 ,有 。00x4) 存在某个 使得对于任何 ,有 。nnn25) 对任意实数 ,存在某个 使得对于任何 ,有y00。xx)(log例子 根据定理 1,我们很容易得出: ;)(log323nOn; 。)(l4205.4nOn )(log/2log25534nn