渐进符号
算法分析离不开渐进符号,它能帮助我们去除常量、低阶量对分析的影响,同时在大规模输入时帮助分析比较两种算法的优劣。
这些记号并不是计算机科学家发明的,而是在二十世纪初用于数论领域。高德纳(Donald E. Knuth)提议将其用于算法分析。
下面先介绍最常见的大 记号,然后介绍大 、大 和小 记号。
大 记号
大 记号(Big-O Notation)
等价于存在常量 使得对所有 都有
注意,这里的 是不依赖于 的常量。
大 定义了上界,“小于等于”的语义。
大 记号
大 记号(Big-Omega Notation)
等价于存在常量 使得对所有 都有
大 定义了下界,“大于等于”的语义。
大 记号
大 记号(Big-Theta Notation)
等价于存在常量 使得对所有 都有
大 同时定义了上下界,“等于”的语义。
小 记号
小 记号(Little-O Notation)
等价于对所有常量 ,都存在 使得对所有 都有
与大 记号不同,这里要求对所有 都要成立,而不是找到一个即可。如果大 记号表示“小于等于”的语义,那么小 表示的就是“严格小于”的语义。
示例
多项式
下面给出一个具体的例子,说明次数至多为 的多项式 是 ,而 不是 。前者也说明大 记号会忽略低阶项。
令 其中 是整数, 是实数,那么 证明:根据定义,关键在于找到 使得 。这里选择 对 的每一项取绝对值,得到 由于 且 ,有 ,其中 ,因此 证毕。
如果 是整数,且 ,那么 不是 。 证明:使用反证法。假设 ,那么存在 ,使得对所有 都有 两边同时除以 ,得到 这表明常数 大于等于任意大的整数,矛盾。证毕。
指数上加一个常量
如果 其中 是常量,那么 证明: 因此,取 ,有 。
指数上乘一个常量
如果 ,且 那么 不是 。 证明:仍使用反证法。假设 ,那么存在 ,使得对所有 都有 那么 当 趋于无穷大时,左侧趋于无穷大,不可能始终不大于常量 ,矛盾。
最大值
令 是从正整数到非负实数的函数。对 ,令 那么 证明:我们需要找到 使得 由于 和 非负, 变换得到 因此,根据定义可取 。