Skip to content

渐进符号

算法分析离不开渐进符号,它能帮助我们去除常量、低阶量对分析的影响,同时在大规模输入时帮助分析比较两种算法的优劣。

这些记号并不是计算机科学家发明的,而是在二十世纪初用于数论领域。高德纳(Donald E. Knuth)提议将其用于算法分析。

下面先介绍最常见的大 记号,然后介绍大 、大 和小 记号。

记号

记号(Big-O Notation

等价于存在常量 使得对所有 都有

注意,这里的 是不依赖于 的常量。

定义了上界,“小于等于”的语义。

记号

记号(Big-Omega Notation

等价于存在常量 使得对所有 都有

定义了下界,“大于等于”的语义。

记号

记号(Big-Theta Notation

等价于存在常量 使得对所有 都有

同时定义了上下界,“等于”的语义。

记号

记号(Little-O Notation

等价于对所有常量 ,都存在 使得对所有 都有

与大 记号不同,这里要求对所有 都要成立,而不是找到一个即可。如果大 记号表示“小于等于”的语义,那么小 表示的就是“严格小于”的语义。

示例

多项式

下面给出一个具体的例子,说明次数至多为 的多项式 ,而 不是 。前者也说明大 记号会忽略低阶项。

其中 是整数, 是实数,那么 证明:根据定义,关键在于找到 使得 。这里选择 的每一项取绝对值,得到 由于 ,有 ,其中 ,因此 证毕。

如果 是整数,且 ,那么 不是 。 证明:使用反证法。假设 ,那么存在 ,使得对所有 都有 两边同时除以 ,得到 这表明常数 大于等于任意大的整数,矛盾。证毕。

指数上加一个常量

如果 其中 是常量,那么 证明: 因此,取 ,有

指数上乘一个常量

如果 ,且 那么 不是 。 证明:仍使用反证法。假设 ,那么存在 ,使得对所有 都有 那么 趋于无穷大时,左侧趋于无穷大,不可能始终不大于常量 ,矛盾。

最大值

是从正整数到非负实数的函数。对 ,令 那么 证明:我们需要找到 使得 由于 非负, 变换得到 因此,根据定义可取