定义1:如果存在正常数 c c c和 n 0 n_{0} n0,使得当 N ⩾ n 0 N\geqslant n_{0} N⩾n0时, T ( N ) ⩽ c f ( N ) T\left ( N \right )\leqslant cf\left ( N \right ) T(N)⩽cf(N),则记为 T ( N ) = O ( f ( N ) ) T\left ( N \right )= O\left ( f\left ( N \right ) \right ) T(N)=O(f(N))。(大 O O O记法)
定义2:如果存在正常数 c c c和 n 0 n_{0} n0,使得当 N ⩾ n 0 N\geqslant n_{0} N⩾n0时, T ( N ) ⩾ c g ( N ) T\left ( N \right )\geqslant cg\left ( N \right ) T(N)⩾cg(N),则记为 T ( N ) = Ω ( g ( N ) ) T\left ( N \right )=\Omega \left ( g\left ( N \right ) \right ) T(N)=Ω(g(N))。( Ω 读 成 \Omega读成 Ω读成“omega”)
定义3:当且仅当 T ( N ) = O ( h ( N ) ) T\left ( N \right )=O\left ( h\left ( N \right ) \right ) T(N)=O(h(N))且 T ( N ) = Ω ( h ( N ) ) T\left ( N \right )=\Omega \left ( h\left ( N \right ) \right ) T(N)=Ω(h(N)), T ( N ) = Θ ( h ( N ) ) T\left ( N \right )=\Theta \left ( h\left ( N \right ) \right ) T(N)=Θ(h(N))。( Θ \Theta Θ读成"theta")
定义4:如果 T ( N ) = O ( p ( N ) ) T\left ( N \right )=O\left ( p\left ( N \right ) \right ) T(N)=O(p(N))且 T ( N ) ≠ Θ ( p ( N ) ) T\left ( N \right )\neq \Theta \left ( p\left ( N \right ) \right ) T(N)=Θ(p(N)),则 T ( N ) = o ( p ( N ) ) T\left ( N \right )=o\left ( p\left ( N \right ) \right ) T(N)=o(p(N))。(小 o o o记法)
另外,还有几个重要的结论:
法则1:如果 T 1 ( N ) = O ( f ( N ) ) T_{1}\left ( N \right )=O\left ( f\left ( N \right ) \right ) T1(N)=O(f(N))且 T 2 ( N ) = O ( g ( N ) ) T_{2}\left ( N \right )=O\left ( g\left ( N \right ) \right ) T2(N)=O(g(N)),那么
(a) T 1 ( N ) + T 2 ( N ) = m a x ( O ( f ( N ) ) , O ( g ( N ) ) ) T_{1}\left ( N \right )+T_{2}\left ( N \right )=max\left ( O\left ( f\left ( N \right ) \right ), O\left ( g\left ( N \right ) \right )\right ) T1(N)+T2(N)=max(O(f(N)),O(g(N))),
(b) T 1 ( N ) ∗ T 2 ( N ) = O ( f ( N ) ∗ g ( N ) ) T_{1}\left ( N \right )*T_{2}\left ( N \right )=O\left ( f\left ( N \right )*g\left ( N \right ) \right ) T1(N)∗T2(N)=O(f(N)∗g(N))。
法则2:如果 T ( N ) T(N) T(N)是一个 k k k次多项式,则 T ( N ) = Θ ( N k ) T\left ( N \right )=\Theta \left ( N^{k} \right ) T(N)=Θ(Nk)。
法则3:对任意常数 k k k,log^{k}N=O\left ( N \right )。
法则4:也就是洛必达法则。若 lim n → ∞ f ( N ) = ∞ \lim\limits_{n\rightarrow \infty}f\left ( N \right )=\infty n→∞limf(N)=∞且 lim n → ∞ g ( N ) = ∞ \lim\limits_{n\rightarrow \infty}g\left ( N \right )=\infty n→∞limg(N)=∞,则 lim n → ∞ f ( N ) / g ( N ) = lim n → ∞ f ′ ( N ) / g ′ ( N ) \lim\limits_{n\rightarrow \infty}f\left ( N \right )/g\left ( N \right )=\lim\limits_{n\rightarrow \infty}f^{'}\left ( N \right )/g^{'}\left ( N \right ) n→∞limf(N)/g(N)=n→∞limf′(N)/g′(N),而 f ′ ( N ) f^{'}\left ( N \right ) f′(N)和 g ′ ( N ) g^{'}\left ( N \right ) g′(N)分别是 f ( N ) f\left ( N \right ) f(N)和 g ( N ) g\left ( N \right ) g(N)的导数。
该极限可以有四种可能的值:
极限是0:这意味着 f ( N ) = o ( g ( N ) ) f\left ( N \right )=o\left ( g\left ( N \right ) \right ) f(N)=o(g(N))
极限是 c ≠ 0 c\neq 0 c=0:这意味着 f ( N ) = Θ ( g ( N ) ) f\left ( N \right )=\Theta \left ( g\left ( N \right ) \right ) f(N)=Θ(g(N))
极限是 ∞ \infty ∞: g ( N ) = o ( f ( N ) ) g\left ( N \right )=o\left ( f\left ( N \right ) \right ) g(N)=o(f(N))
极限摆动:二者无关
计算模型:一台标准的计算机,在机器中指令被顺序地执行。
要分析的最重要的资源一般说来就是运行时间。
具体介绍一下运行时间中的对数问题。
(1)对分查找
给定一个整数 X X X和整数 A 0 , A 1 , . . . , A N − 1 A_{0}, A_{1}, ..., A_{N-1} A0,A1,...,AN−1,后者已经预先排序并在内存中,求使得 A i = X A_{i}=X Ai=X的下标 i i i,如果 X X X不在数据中,则返回 i = − 1 i=-1 i=−1。
int BinarySearch(const ElementType A[], ElementType x, int N)
{
int Low, Mid, High;
Low = 0; High = N - 1;
while( Low <= High)
{
Mid = ( Low + High) / 2;
if (A[Mid] < x)
Low = Mid + 1;
else if (A[Mid] > x)
High = Mid - 1;
else
return Mid;
}
return -1;
}
(2)欧几里得算法
计算最大公因数,两个整数的最大的公因数( G c d Gcd Gcd)是同时整除二者的最大整数。
unsigned int Gcd(unsigned int M, unsigned int N)
{
unsigned int Rem;
while (N > 0)
{
Rem = M % N;
M = N;
N = Rem;
}
return M;
}
定理: 如果 M > N M > N M>N,则 M m o d N < M / 2 M mod N < M/2 MmodN<M/2 。
(3)幂运算
处理一个整数的幂。
long int Pow(long int X, unsigned int N)
{
if(0 == N)
return 1;
if(1 == N)
return X;
if(IsEven(N))
return Pow(X * X, N / 2);
else
return Pow(X * X, N / 2) * X;
}
本章对如何分析程序的复杂性给出一些提示。但遗憾的是,它并不是完善的分析指南。