# 算法分析 算法 *(algorithm)* 是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。对于一个问题,一旦某种算法给定并且(以某种方式)被确定是正确的,那么重要的一步就是确定该算法将需要多少诸如时间或空间等资源量的问题。如果一个简单问题的求解算法竟然需要长达一年时间,那么这种算法就很难能有什么用处。同样,一个需要若干个GB *(gigabyte)* 的内存的算法在当前的大多数机器上也是无法使用的。 ## 数学基础 将有以下定义: 1. 如果存在正常数 $c$ 和 {math}`n_0` 使得当 {math}`N \geqslant n_0` 时 {math}`T(N) \leqslant cf(N)` ,则记为 $T(N) = O(f(N))$ 。 【 $T(N)$ 增长率小于等于 $f(N)$ 】 2. 如果存在正常数 $c$ 和 $n_0$ 使得当 $N \geqslant n_0$ 时 $T(N) \geqslant cg(N)$ ,则记为 $T(N) = \Omega(f(N))$ 。 【 $T(N)$ 增长率大于等于 $f(N)$ 】 3. $T(N) = \Theta(h(N))$ 当且仅当 $T(N) = O(h(N))$ 和 $T(N) = \Omega(h(N))$ 。 【 $T(N)$ 增长率等于 $f(N)$ 】 4. 如果对每一正常数 $c$ 都存在常数 $n_0$ 使得当 $N > n_0$ 时 $T(N) < cp(N)$ ,则 $T(N)=o(p(N))$ 。有时也可以说,如果 $T(N) = O(p(N))$ 且 $T(N) \neq \Theta(p(N))$ ,则 $T(N) = o(p(N))$ 。 【 $T(N)$ 增长率小于 $f(N)$ 】 这些定义的目的是要在函数间建立一种相对的级别。给定两个函数,通常存在一些点,在这些点上一个函数的值小于另一个函数的值,因此,一般地宣称,比如说 $f(N)