Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /www/wwwroot/blog/wp-content/plugins/UEditor-KityFormula-for-wordpress/main.php on line 13
【算法设计与分析】概述(二)— – Machine World

【一条公式引入复杂性】

C=F(N,I,A)

【概述】

目前公认的算法复杂性的理解即算法所需要的计算机资源。我们引入几个复杂性概念:

  • 时间复杂性T(n) :在计算机中执行算法需要的时间资源量

  • 空间复杂性S(n) :在计算机中执行算法需要的空间资源量

  • 问题规模n: 算法的待解空间即:输入的大小

如果分别用N、I和A表示算法要解问题的规模、算法的输入和算法本身, 而且用C表示复杂性,那么, 应该有:

C=F(N,I,A)

而一般把时间复杂性和空间复杂性分开,并分别用TS来表示,则有:

T=T(N,I)

S=S(N,I)

(通常将A隐含在复杂性函数中)

【计算推导】

在算法中,我们假设元运算有k种:

O1,O2,,Ok

执行元运算时间分别为:

t1,t2,,tk

假设用到元运算的次数分别为:

e1,e2,,ek

其中:

ei=ei(N,I)

那么则有:

T(N,I)=i=1ktiei(N,I) 

由于不可能对规模为N的每一种合法输入I都去统计运算次数,只能在某些代表性的合法输入中进行统计。于是我们将T(N,I)S(N,I)进一步简化为T(N)S(N)

【进一步引入复杂性】

上文中我们已经知道T(n)是如何一步步简化的,下面我们从时间复杂度来进一步引入复杂性分析有关内容。

三种情况下的时间复杂性:

  • 最坏情况:指问题规模为N时任何输入中的最长运行时间。其数学表达如下:

Tmax(N)=maxIDNT(N,I)=maxIDNi=1ktiei(N,I)=T(N,I)

  • 最好情况:指问题规模为N时任何输入中的最短运行时间,其数学表达如下:

Tmin(N)=minIDNT(N,I)=minIDni=1ktiei(N,I)=i=1ktiei(N,I~)=T(N,I~)

  • 平均情况:指问题规模为N时任何输入中的平均运行时间,其数学表达如下:

Tavg(N)=IDNP(I)T(N,I)=IDNP(I)i=1ktiei(N,I)

其中:

  • DN是规模为N的合法输入的集合

  • IDN中使得T达到Tmax(N)的合法输入

  • I~DN中使得T达到TminN的合法输入

  • P(I)是算法的应用中输入I出现的频率

其示意图如下图所示:

image.png

补充:

关于最坏情况的时间分析:

  • 它是算法对于任何输入的运行时间的上界; 

  • 对于某些算法, 最坏情况常常发生, 如在DB中搜索一个并不存在的记录; 

  • 平均时间往往和最坏时间相当(常数因子相同). 

关于平均运行时间

  • 常常假定一个给定问题规模的所有输入是等概率的. 实际上这种可能并不一定成立,但可以用随机化算法强迫它成立. 

  • 有时平均时间和最坏时间不是同数量级, 算法选择依据是: 最好、最坏的概率较小时,尽量选择平均时间较小的算法.

【复杂性的进阶分析-渐进性态】

定义如下:

T(N)为算法A的时间复杂性函数,则它是n的单调增函数

如果存在一个函数T~(n)

使得当n时有: 

T(n)T~(n)T(n)0

那么我们称T~(n)T(n)n时的渐进性态或渐进时间复杂性

在数学上 

T(n)T~(n)有相同的最高阶项, 可取T~(n)为略去T(n)的低阶项后剩余的主项. 

当n充分大时我们用T~(n)代替T(n)作为算法复杂性的度量, 从而简化分析. 

例如

T(n)=3n2+4nlogn+7, 则T~(n)可以是3n2

若进一步假定算法中所有不同元运算的单位执行时间相同, 则可不考虑T~(n)所包含的系数或常数因子, 只表征出以影响算法运行时间的主要因素n2.

【渐进分析记号定义】

  • 渐进上界:O

O(g(n))={f(n)|cn0使nn0:0f(n)cg(n)}

  • 渐进下界:Ω

Ω(g(n))={f(n)|cn0使nn0:0cg(n)f(n)}

  • 非紧上界:o

o(g(n))={f(n)|c>0,n0>0使nn00f(n)<cg(n)}

等价于

limn0f(n)g(n)=0

  • 非紧下界:ω

ω(g(n))={f(n)|c>0,n0>0使nn00cg(n)<f(n)

等价于:

limn0f(n)g(n)=

结合上述得出:

f(n)ω(g(n))g(n)o(f(n))

  • 紧渐进界:Θ

Θ(g(n))={f(n)|c1,c2n0使nn0c1g(n)f(n)c2g(n)}

定理:

Θ(g(n))=O(g(n))Ω(g(n))

【渐进分析记号的意义】

  • f(n)=Θ(g(n))的确切意义是: f(n)Θ(g(n))

  • 一般情况下,等式和不等式中的渐进记号Θ(g(n))表示Θ(g(n))中的某个函数。

        如:

        2n2+3n+1=2n2+Θ(n)表示2n2+3n+1=2n2+f(n), 其中f(n)Θ(n)中某个函数.

  • 等式和不等式中渐进记号O,o,Ω,ω的意义类似

【关于O的解释】

O表示法(算法运行的上界):

        若存在正常数c和自然数n0使得当nn0时,有0f(n)cg(n),则称函数f(n)n充分大时有上界,且g(n)是它的一个上界,记为f(n)=O(g(n)), 也称f(n)的阶不高于g(n)的阶。

图像表达如下:

image.png


注意:

当说一个算法具有O(g(n))的计算时间时, 指的是如果此算法用n值不变的同一类数据在某台机器上运行时, 所用的时间总是小于g(n)的一个常数倍. 

所以, 从计算时间来说, f(n)的数量级就是g(n). 当然, 在确定f(n)的数量级时总是希望求出最小的g(n), 使得f(n)=O(g(n)).

例如:

  • 3n=O(n)
  • n+1024=O(n)
  • 2n2+11n10=O(n)

  • n2=O(n3)

  • n3O(n2)

运算法则:

  • O(f(n))+O(g(n))=O(maxf(n),g(n))
  • O(f(n))+O(g(n))=O(f(n)+g(n))
  • O(f(n))×O(g(n))=O(f(n)×g(n))
  • O(cf(n))=O(f(n))
  • g(n)=O(f(n))O(f(n))+O(g(n))=O(f(n))
  • f(n)=O(f(n))

【常见的复杂性函数】

function name
c constant
logN logarithmic
log2N log-square
N linear
NlogN N log N
N2 qiadratic
N3 cubic
2N Exponential

【不同规模数据复杂度对比图】

image.png


小规模数据复杂度示意图

image.png


中等规模数据复杂度示意图


【不同算法输入量上界】

image.png

【提高计算机速度对算法的优化效果】

image.png

【常见的算法时间复杂性函数对比】

image.png

【一些结论】

结论: 算法的渐近复杂性的阶对于算法的效率有着决定性的意义.

多项式复杂度的算法:

如果一算法的最坏情形时间复杂度T(n)=O(nk),则称该算法为多项式复杂度的算法.

计算机科学家普遍认为, 一个多项式复杂度的算法是有效算法, 即: 对于一个有效算法, 哪怕输入量很大, 计算机仍然可以处理得了.

【参考资料】

  • 2019年广西师范大学计算机与信息工程学院算法设计与分析课件[OL].李志欣教授.2019.01.01

作者 WellLee

在 “【算法设计与分析】概述(二)—<复杂性>” 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注