算法分析——数学基础与模型

算法是为求解一个问题需要遵循的,被清楚指定的简单指令的集合。当一个求解某一问题的算法给定并指定是正确的,那么对该算法的运行时间或所占空间等资源量的确定是重要的一步。

一般来说估计算法资源消耗所需的分析是一个理论问题,因此需要一套正式的系统架构。

数学基础

为了在函数中建立一些相对的级别( 简单的比较函数值大小没有什么实际意义,于是我们比较它们的相对增长率 ),一般给出四条定义:

①如果存在正常数 c 和 n,使得当N ≥ n时T(N) ≤ c f ( N ),则记为 T(N) = O(f ( N ))。

②如果存在正常数 c 和 n,使得当N ≥ n时T(N) ≥ c g ( N ),则记为 T(N) = Ω(g ( N ))。

③T(N)= Θ(f (N)), 当且仅当T(N) = O(f ( N ))和T(N) = Ω(f ( N ))。

④如果对每一正常数 c 都存在常数n,使得当N > n时 T(N)< c f(N),则T(N)= o(f(N))。有时也可以说,如果T(N)= O(f(N))且T(N)≠ Θ(f(N)),则T(N)= o(f(N))。

上述四条定义简单的给出了比较函数相对增长率的定义,为了说明定义,这里给出一个简单的例子,我们知道在N比较小的时候,500N 要大于N² 但N²以较快的增长率增长,所以N²最终的值大于500N,在这个例子中第一个定义是说,最后总会存在一个n值在它以后c * f ( N )总是至少与T(N)一样大,从而忽视常数因子,则f ( N )至少与T(N)一样大,可以说500N = O(N²)这是大O标记法。可以类推并总结,第一个定义T(N) = O(f ( N ))是指T(N)增长率大于或等于f(N)增长率,第二个定义T(N) = Ω(g ( N ))是指T(N)增长率大于g(N)增长率,第三个定义T(N)= Θ(f (N))是指T(N)增长率大于f(N)增长率,第四个定义T(N) = o(g ( N ))是指T(N)增长率大于g(N)增长率。

给出一些典型的增长率排序(从低到高):c(常数),logN(对数),logⁿN(对数的n次方),N(线型的),NlogN, N²(二次的), N³(三次的), 2ⁿ(指数的)。

当T(N) = O(f ( N ))时 f (N)= Ω(T(N)),我们说T(N)是f(N)的一个下界,f(N)是T(N)的一个上界。

事实上N = O(N),N = O(N²),N = O(N³)都是成立的,但第一个是最佳选择。写法N = Θ(N)不仅表示N = O(N)而且表示结果尽可能的严密。当将相对增长率应用到算法分析时是重要的度量。

还有几个重要的法则需要掌握:

法则一:

如果T₁(N) = O(f(N))且T₂(N) = O(g(N)),那么

(a)T₁(N)+T₂(N)= O(f(N)+ g(N))(也可以写为T₁(N)+T₂(N)= max(O(f(N),O( g(N))))。

(b)T₁(N)*T₂(N)= O(f(N)* g(N))。

法则二:

如果T(N)是一个n多项式,则T(N)=Θ(Nⁿ)(即可以忽略Θ中的常数和低阶项,事实上在大O中也一样,将常数和低阶项写入大O中是不好的习惯,在大O中任何简化都是可能发生的)

法则三:

对任意常数n,logⁿN =O(N)。

在计算两个函数的相对增长率时我们总能够通过极限lim f(N)/g(N)(N → ∞)来计算,有时可用到洛必达法则。

❶极限是0:这意味着f(N)= o(g(N))。

❷极限是c ≠ 0:这意味着f(N)= Θ(g(N))。

❸极限是∞,这意味着g(N)= o(f(N))。

模型

我们需要一个计算模型从而在构架中分析算法,计算模型基本上是一台标准的计算机,顺序执行指令。

该模型有一个标准的简单指令系统,如加法,乘法,比较和赋值等。模型不同于实际计算机的有:1,我们假设模型机做任何简单的工作都花费一个单位时间(简单工作不包括如矩阵求逆或排序等明显无法用一个单位时间完成的想象的操作,同时我们需要明白现实生活中不是所有的运算都恰好花费同样的时间)。2,假设模型内存无限(显然这也是一个缺陷,无限的内存意味着不用考虑内存这个现实中可能存在的问题)

原文地址:https://www.cnblogs.com/asiastic-wormwood/p/8442489.html