渐近记号与主定理
渐近记号与主定理
渐近记号用来描述函数的运行时间,刻画运行时间的上界、确界、下界。使用递归定义的函数通常使用主定理分析时间复杂度。
一、渐近记号
本节定义一些基本函数,用于描述时间复杂度。
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))$。
二、使用主方法求解递归式
对于类似
的递归式,通常使用主定理求解其渐近界。
2.1 $\quad$ 主定理
定理(主定理) $\quad$ 令 $a\ge 1$ 和 $b\ge 1$ 是常数,$f(n)$ 是一个函数,$T(n)$ 是定义在非负整数上的递归式:
我们将其中的 $n/b$ 解释为 $\lceil n/b \rceil$ 或者 $\lfloor n/b \rfloor$,那么 $T(n)$ 有如下渐近界:
- 若对某个常数 $\epsilon >0$ 有 $f(n)=O(n^{\log_b a-\epsilon})$,则有 $T(n)=\Theta(n^{\log_ba})$。
- 若 $f(n)=\Theta(n^{\log_b a})$,则 $T(n)=\Theta(n^{\log_b a}\lg n)$。
- 若对某个常数 $\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$ 对于下面的递归式,求解其渐近界。
对于这个递归式,我们有 $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$ 对于下面的递归式,求解其渐近界。
其中,$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$ 对于下面的递归式,求解其渐近界。
其中,$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)$ 比较,就可以求出递归式的渐近界。