渐近记号与主定理

渐近记号用来描述函数的运行时间,刻画运行时间的上界、确界、下界。使用递归定义的函数通常使用主定理分析时间复杂度。

一、渐近记号

本节定义一些基本函数,用于描述时间复杂度。

1.1 \(\quad\) 渐进记号、函数与运行时间

1.1.1 \(\quad\) \(\Theta\) 记号

我们使用 \(\Theta\) 记号描述函数的渐近紧确界

形式化地, \(\Theta (g(n))=\{f(n):\exists c_1,c_2,n_0:\forall n\ge n_0,0\le c_1g(n)\le f(n)\le c_2g(n) \}\)

其中,冒号意为“使得”。

也就是说,存在常量 \(c_1,c_2,n_0\),可以将 \(f(n)\) 夹入 \(c_1g(n)\)\(c_2(n)\) 中。\(\Theta(g(n))\) 要求每个成员 \(f(n)\in \Theta(g(n))\) 渐近非负

我们通常使用 \(\Theta(1)\) 表示常量或某个变量的常量函数。

1.1.2 \(\quad\) \(O\) 记号

当函数只有一个渐近上界时,使用 \(O\) 记号。

形式化地, \(O (g(n))=\{f(n):\exists c,n_0:\forall n\ge n_0,0\le f(n)\le cg(n) \}\)

使用 \(O\) 记号描述上界,我们常常可以检查算法的总体结构来描述算法运行的时间,如循环嵌套等,这里不再展开。

1.1.3 \(\quad\) \(\Omega\) 记号

\(\Omega\) 记号提供了函数的渐近下界

形式化地,\(\Omega (g(n))=\{f(n):\exists c,n_0:\forall n\ge n_0,0\le cg(n)\le f(n)\}\)

我们不难有如下定理:

定理 \(\quad\) 对于任意两个函数 \(f(n),g(n)\),我们有 \(f(n)=\Theta(g(n))\),当且仅当 \(f(n)=O(g(n))\)\(f(n)=\Omega(g(n))\)

1.1.4 \(\quad\) \(o\) 记号

前面的 \(O\) 记号描述的渐近上界,我们使用 \(o\) 记号来描述一个非渐近紧确的上界,如 \(2n=o(n^2)\)\(2n^2\not=o(n^2)\)

形式化地,\(o (g(n))=\{f(n):\forall c>0,\exists n_0>0:\forall n\ge n_0, 0\le f(n) < cg(n) \}\)

直观上,在 \(o\) 记号中,当 \(n\rightarrow + \infty\),函数\(f(n)\) 相对于 \(g(n)\) 来说变得微不足道了。

1.1.5 \(\quad\) \(\omega\) 记号

我们使用 \(\omega\) 记号描述一个非渐近紧确的下界

形式化地,\(\omega (g(n))=\{f(n):\forall c>0,\exists n_0>0:\forall n\ge n_0, 0\le cg(n) < f(n) \}\)

1.2 \(\quad\) 渐近函数的性质

我们令 \(f(n),g(n)\) 渐近为正。

渐近函数具有传递性,即 \(f(n)=\Theta (g(n)),g(n)=\Theta h(n)\Rightarrow f(n)=\Theta(h(n))\)。其他记号同理。

渐近函数具有自反性,即 \(f(n)=\Theta f(n)\),对于 \(O,\Omega\) 记号同理。

\(\Theta\) 函数具有对称性,即 \(f(n)=\Theta(g(n))\) 当且仅当 \(g(n)=\Theta (f(n))\)

渐近函数具有转置对称性,即 \(f(n)=O(g(n))\) 当且仅当 \(g(n)=\Omega f(n)\)\(f(n)=o(g(n))\) 当且仅当 \(g(n)=\omega (f(n))\)

二、使用主方法求解递归式

对于类似 \[ T(n)=aT(n/b)+f(n) \] 的递归式,通常使用主定理求解其渐近界。

2.1 \(\quad\) 主定理

定理(主定理) \(\quad\)\(a\ge 1\)\(b\ge 1\) 是常数,\(f(n)\) 是一个函数,\(T(n)\) 是定义在非负整数上的递归式: \[ T(n)=aT(n/b)+f(n) \] 我们将其中的 \(n/b\) 解释为 \(\lceil n/b \rceil\) 或者 \(\lfloor n/b \rfloor\),那么 \(T(n)\) 有如下渐近界:

  1. 若对某个常数 \(\epsilon >0\)\(f(n)=O(n^{\log_b a-\epsilon})\),则有 \(T(n)=\Theta(n^{\log_ba})\)
  2. \(f(n)=\Theta(n^{\log_b a})\),则 \(T(n)=\Theta(n^{\log_b a}\lg n)\)
  3. 若对某个常数 \(\epsilon>0\)\(f(n)=\Omega(n^{\log_b a+\epsilon})\),且对某个常数 \(c<1\) 和所有足够大的 \(n\)\(af(n/b)\le cf(n)\),则 \(T(n)=\Theta(f(n))\)

上面就是主定理。注意这三种情况并未覆盖 \(f(n)\) 的所有可能性,下面将说明如何正确地使用主定理。

2.2 \(\quad\) 使用主方法

我们把使用主定理求解递归式的方法称为主方法。我们只需要确定一个递归式对于主定理的哪种情况成立,即可得到解。

例子 \(\quad\) 对于下面的递归式,求解其渐近界。 \[ T(n)=9T(n/3)+n \]

对于这个递归式,我们有 \(a=9,b=3,f(n)=n\),因此 \(n^{\log b a}=b^{\log_3 9}=\Theta(n^2)\)。由于 \(f(n)=O(n^{\log_39-\epsilon})\),其中 \(\epsilon=1\),因此可以应用于情况1,得到 \(T(n)=\Theta(n^2)\)

例子 \(\quad\) 对于下面的递归式,求解其渐近界。 \[ T(n)=T(2n/3)+1 \]

其中,\(a=1,b=\frac{2}{3},f(n)=1\),因此 \(n^{\log_b a}=n^0=1\)。由于 \(f(n)=\Theta(n^{\log _b a})=\Theta(1)\),应用于情况2,得到 \(T(n)=\Theta(\lg n)\)

例子 \(\quad\) 对于下面的递归式,求解其渐近界。 \[ T(n)=3T(n/4)+n\lg n \]

其中,\(a=3,b=4,f(n)=n\lg n\),因此 \(n^{\log_b a}=O(n^{0.793})\)。由于 \(f(n)=\Omega(b^{\log_4 3-\epsilon})\),其中 \(\epsilon\approx 0.2\),因此,如果可以证明正则条件成立,可应用于情况3。当 \(n\) 足够大时,有 \(af(n/b)\le cf(n)\),得到 \(T(n)=\Theta(n\lg n)\)

上面给出了三种例子,只要算出 \(n^{\log_b a}\) 的渐近界,与 \(f(n)\) 比较,就可以求出递归式的渐近界。