算法分析
算法(algorithm)是为求解一个问题需要遵循的、被清楚地指定的简单指令的集合。
数学基础
定义: 如果存在正常数 c c c和 n 0 n_0 n0使得当 N ≥ n 0 N\geq n_0 N≥n0时 T ( N ) ≤ c f ( N ) T(N)\leq cf(N) T(N)≤cf(N),则记为 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))。
定义: 如果存在正常数 c c c和 n 0 n_0 n0使得当 N ≥ n 0 N\geq n_0 N≥n0时 T ( N ) ≥ c g ( N ) T(N)\geq cg(N) T(N)≥cg(N),则记为 T ( N ) = Ω ( f ( N ) ) T(N)=\Omega(f(N)) T(N)=Ω(f(N))。
定义: T ( N ) = Θ ( h ( N ) ) T(N)=\Theta(h(N)) T(N)=Θ(h(N))当且仅当 T ( N ) = O ( h ( N ) ) T(N)=O(h(N)) T(N)=O(h(N))且 T ( N ) = Ω ( h ( N ) ) T(N)=\Omega(h(N)) T(N)=Ω(h(N))。
定义: 如果 T ( N ) = O ( p ( N ) ) T(N)=O(p(N)) T(N)=O(p(N))且 T ( N ) ≠ Θ ( p ( N ) ) T(N)\neq\Theta(p(N)) T(N)=Θ(p(N)),则 T ( N ) = o ( p ( N ) ) T(N)=o(p(N)) T(N)=o(p(N))。
这些定义的目的是要在函数之间建立一种相对的级别。给定两个函数,通常存在一些点,在这些点上一个函数的值小于另一个函数的值,因此,像 f ( N ) < g ( N ) f(N)<g(N) f(N)<g(N)这样的声明是没有什么意义的。于是,我们比较它们的相对增长率(relative rate of growth)。
如果用传统的不等式来计算增长率,那么第一个定义是说 T ( N ) T(N) T(N)的正常率小于等于 f ( N ) f(N) f(N)的增长率。第二个定义 T ( N ) = Ω ( g ( N ) ) T(N)=\Omega(g(N)) T(N)=Ω(g(N))(念成“Omega”)是说 T ( N ) T(N) T(N)的增长率大于等于 g ( N ) g(N) g(N)的增长率。第三个定义 T ) N = Θ ( h ( N ) ) T)N=\Theta(h(N)) T)N=Θ(h(N))(念成“Theta”)是说 T ( N ) T(N) T(N)的增长率等于 h ( N ) h(N) h(N)增长率。最后一个定义 T ( N ) = o ( p ( N ) ) T(N)=o(p(N)) T(N)=o(p(N))(念成“小o”)说的则是 T ( N ) T(N) T(N)的增长率小于 p ( N ) p(N) p(N)的增长率。它不同于大O,因为大O包含增长率相同这种可能性。
当我们说 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))时,我们是在保证函数 T ( N ) T(N) T(N)是在不快于 f ( N ) f(N) f(N)的速度增长;因此 f ( N ) f(N) f(N)是 T ( N ) T(N) T(N)的一个上界(upper bound)。与此同时, f ( N ) = Ω ( T ( N ) ) f(N)=\Omega(T(N)) f(N)=Ω(T(N))意味着 T ( N ) T(N) T(N)是 f ( N ) f(N) f(N)的一个下界(lower bound)。
作为一个例子, N 3 N^3 N3的增长比 N 2 N^2 N2快,因此我们说 N 2 = O ( N 3 ) N^2=O(N^3) N2=O(N3)或 N 3 = Ω ( N 2 ) N^3=\Omega(N^2) N3=Ω(N2)。 f ( N ) = N 2 f(N)=N^2 f(N)=N2和 g ( N ) = 2 N 2 g(N)=2N^2 g(N)=2N2以相同的速率增长时,从而 f ( N ) = O ( g ( N ) ) f(N)=O(g(N)) f(N)=O(g(N))和 f ( N ) = Ω ( g ( N ) ) f(N)=\Omega(g(N)) f(N)=Ω(g(N))都是正确的。直观地说,如果 g ( N ) = 2 N 2 g(N)=2N^2 g(N)=2N2,那么 g ( N ) = O ( N 4 ) , g ( N ) = O ( N 3 ) , g ( N ) = O ( N 2 ) g(N)=O(N^4),g(N)=O(N^3),g(N)=O(N^2) g(N)=O(N4),g(N)=O(N3),g(N)=O(N2)从技术上都是成立的,但最后一个选择是最好的答案。
法则1
如果 T 1 ( N ) = O ( f ( N ) T_1(N)=O(f(N) T1(N)=O(f(N)且 T 2 ( N ) = O ( g ( N ) ) T_2(N)=O(g(N)) T2(N)=O(g(N)),那么
- T 1 ( N ) + T 2 ( N ) = max ( O ( f ( N ) , O ( g ( N ) ) T_1(N)+T_2(N)=\max(O(f(N),O(g(N)) T