数据结构与算法分析(第二章 算法分析)

第二章 算法分析

  • 一、引言
  • 二、数学基础
  • 三、模型
  • 四、需要分析的问题
  • 五、运行时间的计算
  • 六、总结

一、引言

算法是为求解一个问题需要遵循的、被清楚地指定的简单指令的集合。

二、数学基础

全书将使用下列四个定义:

定义1:如果存在正常数 c c c n 0 n_{0} n0,使得当 N ⩾ n 0 N\geqslant n_{0} Nn0时, 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} Nn0时, 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 nlimf(N)= lim ⁡ n → ∞ g ( N ) = ∞ \lim\limits_{n\rightarrow \infty}g\left ( N \right )=\infty nlimg(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 ) nlimf(N)/g(N)=nlimf(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,...,AN1,后者已经预先排序并在内存中,求使得 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 - 1while( 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;
}

六、总结

本章对如何分析程序的复杂性给出一些提示。但遗憾的是,它并不是完善的分析指南。


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210423145343905.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI1MzUxNzk1,size_16,color_FFFFFF,t_70)

你可能感兴趣的:(数据结构与算法分析,数据结构,c语言)