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

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

通常来讲估计算法资源消耗所需的分析是一个理论问题,所以须要一套正式的系统架构。架构

数学基础函数

为了在函数中创建一些相对的级别( 简单的比较函数值大小没有什么实际意义,因而咱们比较它们的相对增加率 ),通常给出四条定义:spa

①若是存在正常数 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,假设模型内存无限(显然这也是一个缺陷,无限的内存意味着不用考虑内存这个现实中可能存在的问题)

相关文章
相关标签/搜索