计算机算法.docx

上传人:b****5 文档编号:11804022 上传时间:2023-04-02 格式:DOCX 页数:38 大小:206.42KB
下载 相关 举报
计算机算法.docx_第1页
第1页 / 共38页
计算机算法.docx_第2页
第2页 / 共38页
计算机算法.docx_第3页
第3页 / 共38页
计算机算法.docx_第4页
第4页 / 共38页
计算机算法.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

计算机算法.docx

《计算机算法.docx》由会员分享,可在线阅读,更多相关《计算机算法.docx(38页珍藏版)》请在冰豆网上搜索。

计算机算法.docx

计算机算法

第一章绪论

算法(Algorithm)理论处于计算机科学的核心地位,它与计算机应用的许多实际问题有着直接的联系。

§1算法的基本概念

1算法的地位

①算法(Algorithm)理论处于计算机科学的核心地位。

想要使用计算机解决问题,就要设计该问题的算法,要给出解决该问题所需的一系列解题步骤。

②算法与程序

计算机软件的重要内容之一是程序,程序是计算机指令的序列,计算机一步一步地执行这个指令序列,就完成了希望它所做的事情。

程序设计就是按照一定的要求编排一个合理的指令序列。

程序设计主要包含两个方面,行为特性设计和结构特性设计。

结构特性设计是指确定合适的数据结构,将程序处理的数据在计算机内部表示和存放。

行为特性设计是确定要解决的实际问题的具体步骤,把全部解题过程完整地描述出来,这一过程就是算法设计。

算法设计是程序设计的基础。

美国《计算机科学基础》一书指出,“算法代表了对问题的解”,“程序是算法在计算机上的特定实现”。

N.Wirth指出“程序就是在数据的某些特定的表示方法和结构的基础上对抽象算法的具体表述。

”通俗地讲,程序是用计算机语言表述的算法。

数据结构是程序设计的另一基础。

程序的目的是加工数据,具体的数据加工步骤为算法,程序是算法和数据结构的统一。

著名计算机科学家N.Wirth于1976年提出了“程序=算法+数据结构”的概念。

这个公式表明,算法与数据结构是密切相关的,算法的设计要与数据结构相适应。

算法不等于程序,它不需考虑具体的机器,算法也不等于计算方法,它比计算方法更具体。

算法知识位于程序设计的高层(算法,方法学,语言和工具),具有相对稳定性。

很多经典算法产生于20世纪50、60年代,如hash算法,快速排序算法,至今仍在使用。

2算法的定义

下面我们先看两个例子:

例1求一个数a的平方根。

利用迭代公式:

xn+1=(xn+a/xn)/2,算法如下:

1对x赋初值x0

2如果|x2-a|<ε则转④

3x=(x+a/x)/2,转②

4输出x

例2求m,n的最大公约数

利用辗转除法可得求自然数m,n的最大公约数的算法如下:

1r=mmodn

2循环直到r=0

m=n

n=r

r=mmodn

③输出n

可以看出,算法是解题方案的准确而完整的描述,它是由一些步骤组成的一个过程,这些步骤连在一起给出一类问题的解。

著名的Webster词典在Algorithm词条下指出:

算法是在有限步骤内解决一个数学问题的过程,步骤中常常包括某一个操作的重复。

更广义的说,一个算法就是为了解决一个问题或实现某一目标的逐步过程。

著名计算机科学家D.E.Knuth对算法给出了另一种说明:

一个算法是一个有穷规则的集合,其中之规则规定了一个解决某一类特定问题的运算序列。

3算法的特征

著名计算机科学家Knuth把算法的特征归纳以下5点:

1)有穷性(finiteness)

一个算法必须在有限个步骤之后结束。

换句话说,一个算法必须在有限时间内完成,否则,该算法就失去了实际价值。

因此,在算法中不能出现无限循环。

数学中的无穷级数在计算时只能取有限项。

2)确定性(definiteness)

算法中的每一个步骤都必须有明确的定义,不允许存在多义性和摸棱两可的解释。

如“将X,Y两个数进行加减运算”,是做加法运算还是做减法运算,没有说清;再如“给变量X增加一个值”,增加一个值,具体是多少,没有说清。

在算法中,这样含糊不清的步骤不允许出现。

3)能行性(effectiveness)

算法中的每一个步骤都是可以实现的,或可以分解为可执行的基本操作。

例如在算法中不能出现零做除数、在实数范围内对一个负数求平方根等情况。

4)输入(input)

算法允许有零个或多个输入量。

5)输出(output)

算法必须有一个或多个输出。

根据以上讨论,我们对算法有了进一步的认识:

算法是精确定义的一系列规则,这些规则指定了一系列的操作,经过有限步骤产生所求问题的解。

4算法解决问题的类型

计算机科学领域的问题大致可分为以下三种类型:

1)判定性问题:

这类问题给出的是与否的判别。

例如连通性问题,回路问题,查找与排序问题,字符匹配问题等。

2)最优化问题:

这类问题是在所有可能的解中求出最优解。

例如求函数的极值,最短路径问题,最小生成树问题等。

3)函数计算问题:

这类问题是在一定约束条件下求数值解,例如方程求根,矩阵运算,函数求值等。

5算法学科研究内容

算法学科研究内容研究内容大致分为以下三个方面:

1)算法设计:

算法设计是要设计出能够正确解决问题的算法。

由于计算机资源有限,算法设计还要使算法能够占用较少的存储空间,运行速度较快。

另外,从软件开发的角度,还要设计出容易理解、容易编程和容易调试的算法。

2)算法分析:

算法分析的任务是估计算法的运行时间和占用的空间,分析和比较各种算法的优劣。

3)可计算理论:

在早期的算法研究中,人们的研究重点集中在可计算理论上。

我们说一个问题在算法上是可解的是说可以编写一个计算机程序,在运行时间足够长和存储空间足够大的条件下它对任何允许的输入都可得出正确的答案。

§2算法设计

1算法设计方法

算法设计是针对某一问题,设计出解决该问题的一系列解题步骤。

由于问题的多样性,设计方法也是各种各样。

研究算法的中心任务就是获得有效的算法。

有许多问题,只要对数据对象进行仔细分析,建立了数学模型,处理的方法就有了。

有些问题则不然,还必须花费力量进行算法设计。

进行算法设计时,要针对计算工具的特点,要考虑所用计算工具的操作功能、精度范围和计算工具具有的优势。

对同样一个问题,所用工具不同,其算法一般也不相同,计算机算法和人工处理算法往往就不相同。

解决一个问题的算法也不是唯一的,同一个问题可能有许多算法,这些算法各有特点。

人们在算法设计的实践中,研究和总结了多种算法设计方法。

算法设计一般常用方法有:

蛮力法(bruteforcemethod)、分治法(divideandconquer)、贪心法(greedymethod)、动态规划法(dynamicprogramming)、回溯法(backtracking)、分枝限界法(branchandboundmethod)、概率算法(probabilisticalgorithm)、近似算法(approximatealgorithm)、线性规划法等.

2算法设计的一般过程

1)理解问题

准确而完整的描述问题是解决问题的第一步。

人们需要对问题做深入的了解,如,提供了哪些信息,要得到什么结果,输入输出各是什么。

此外还要仔细检查对问题的描述是否有遗漏,是否有二义性。

例如,货郎担问题,设货郎在一天内要到n个村庄去推销货物,已知从一个村庄到其他各村庄的费用,求总费用最小的路线。

为了求最小费用路线,有一些问题尚须进一步了解。

如,一天之内是否可以多次经过某个村庄;其他村庄中是否有必须优先访问的村庄等。

2)建立模型

用计算机解决问题必须有合适的数学模型。

首先有两个基本问题:

⑴最适合于问题的数学结构是什么?

⑵是否有已解决了的类似问题可借鉴?

建立模型后,还要考察模型是否表达了问题的重要信息,能否正确反映输入、输出关系,用计算机处理模型是否有困难。

并在多个模型选择最有效的一个。

例如货郎担问题,可用图论的知识建立模型如图1示,可建立图的邻接矩阵和费用矩阵。

 

图1货郎担问题村庄连接图

3)设计算法

算法设计是针对某一问题,设计出解决该问题的一系列解题步骤。

例如货郎担问题,可以设计一种列举法,即将所有可能的方案都罗列出来,计算出每一种方案的费用,从中选择出费用最小的方案。

算法设计应考虑以下问题:

1预测所有可能的输入

2在精确解和近似解中做出选择

3确定适当的数据结构

4选择适当的设计技术

4)分析算法

对于一个问题,可有多种解法,因此也就有多种不同的算法。

对算法的效率进行分析。

对算法所需的内存空间和运行时间做出估计,以衡量算法的优劣。

5)实现算法

根据算法编制计算机程序。

涉及到变量、数组、数据结构、选用语言等一系列问题。

6)验证算法正确性

必须要设计出能够得到正确结果的算法。

算法的正确性依赖于所用理论的正确性,但是,理论正确的算法未必能得到正确结果。

我们看两个例子。

例1已知:

A=1012,B=-1012,C=1,计算A+B+C的值。

假设所用计算工具具有7位有效数字,下面两种算法会得出不同的结果。

1)A+B+C=1012+(-1012)+1=1

2)A+C+B=1012+1+(-1012)=0

显然,第二个方法没有得到正确的结果。

例2求方程X2-(1015+1)X+1015=0的两个实根。

1)直接使用求根公式

A=1

B=-(1015+1)

C=1015

D=SQRT(B*B-4*A*C)

X1=(-B+D)/(2*A)

X2=(-B-D)/(2*A)

结果为:

X1=1015,X2=0

2)使用韦达定理

A=1

B=-(1015+1)

C=1015

D=SQRT(B*B-4*A*C)

X1=(-B+D)/(2*A)

X2=C/(A*X1)

结果为:

X1=1015,X2=1

显然,第一个方法没有得到正确的结果。

这是因为计算机计算精度是有限的,设计算法时必须要考虑计算机精度的影响,避免误差的影响过大。

关于算法的正确性,目前是通过验证表达该算法的程序的正确性来实现。

虽然这两者不完全一致,但因目前要证明算法的正确性仍然有困难,所以上述方法仍然是主要方法。

验证程序的正确性采用程序测试的方法。

经测试验证是正确的程序,在很大程度上可以相信它的正确性。

1979年,美国的Boyer(博耶)和Moore(默尔)提出用新的数学归纳法证明程序的正确性。

这种方法将数学归纳法与递归函数论和定理机器证明结合起来,研制了程序证明系统。

但用该系统证明程序的正确性并非一个简单的问题。

§3算法复杂性分析

设计算法还要考虑复杂性(时间复杂性和空间复杂性),执行算法所需的时间要短,占用计算机的内存要少。

如果一个算法的执行时间很长,比如几百年甚至上千万年,该算法也就失去了实用价值。

例如,克莱姆(Cramer)规则是求解线性代数方程组的一个数学方法,但是,根据此规则设计的求解线性代数方程组的算法,在执行过程中所需的时间实际上是不能接受的。

因此,在考虑算法的有穷性时,还应考虑其合理的执行时间。

算法分析对算法的效率进行分析。

对算法所需的内存空间和运行时间做出估计,以衡量算法的优劣。

1算法的复杂度

算法的复杂度主要是指时间复杂度(Timecomplexity)和空间复杂度(Spacecomplexity)。

算法的时间复杂度是指算法的计算工作量,即算法的时间代价。

算法的时间复杂度是指算法需要占用的存储空间的大小。

下面主要讨论算法的时间复杂度。

为了能比较客观地反映一个算法的效率,在度量一个算法工作量时,不仅应该与使用的计算机程序设计语言无关,而且还应与算法实现过程中的许多细节无关。

为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的计算工作量。

通常一个算法包括多种运算,选择基本运算应遵循两个原则:

算法执行运算的总次数与基本运算的次数大体上应成比例;基本运算以外的其他运算量可以忽略。

例如,在一维数组中查找值为x的元素,可以选择“x与数组的比较”作为基本运算,总的比较次数作为查找算法的计算工作量。

再如,在两个实矩阵相乘的算法中,可以选择“两个实数的乘法”作为基本运算。

算法所执行的基本运算的次数不仅与算法本身有关,还与问题的规模有关。

为了比较算法的优劣,要对同等规模的问题进行分析。

例如,两个实矩阵相乘,基本运算次数与矩阵的阶数有很大关系。

图论问题常以边数的多少度量规模,矩阵乘法用阶数的大小度量规模,线性表常用长度度量规模。

综上所述,算法的计算工作量采用算法执行基本运算的总次数来度量,执行基本运算的总次数是问题规模n的函数,即,算法的时间复杂度为f(n)。

对于特定的算法和一定规模的问题,算法每一次执行的基本运算次数又与特定的输入有关。

例如,“在长度为n的一维数组中查找值为x的元素”,若采用顺序搜索法,如果输入的x值与第一个元素相同,则只进行一次比较,若输入的x值与第n个元素相同,则需进行n次比较。

由此可见,同一算法、同一问题规模,其基本运算次数在不同输入的情况下差异还是很大的。

我们不可能把每一种输入情况都列出来,因此常常采用以下方法来分析算法的计算工作量。

1)平均性态分析(AverageBehavior)

用各种特定输入下的基本运算次数的带权平均值来度量算法的计算工作量。

A(n)=∑p(x)·T(x)

x∈Dn

其中:

P(x):

x出现的概率。

T(x):

输入为x情况的基本运算次数。

Dn:

所有可能输入的集合。

A(n):

算法基本运算的平均次数。

n:

问题的规模。

2)最坏情况复杂性(Worst-casecomplexity)

W(n)=Max{T(x)}

x∈Dn

其中:

Dn:

所有可能输入的集合。

T(x):

输入为x情况的基本运算次数。

W(n):

最坏情况复杂性。

n:

问题的规模。

一般来说,W(n)的计算较之A(n)的计算方便,W(n)实际上给出了算法的计算工作量的上界,它比A(n)更有使用价值。

例:

线性表的顺序搜索(SequentialSearch)

输入一维数组L(n),查找数据元素x,输出第一次使得L(j)=x的j,若x不在L(n)中,则输出j=0。

算法如下:

j=1

while(j<=n)and(L(j)≠x)doj=j+1

if(j>n)thenj=0

outputj

下面对该算法做平均性态分析:

取两个元素的比较作为基本运算,则有:

设x在L(n)中的概率为q,x等于各L(k)为等概率,则有:

 

于是有:

若q=1,有

即平均要检查数组中一半的元素。

若q=0.5,有

即平均要检查数组中3/4的元素。

下面对该算法做最坏情况分析:

最坏情况分析一般取决于算法,而不是问题本身。

2算法复杂性的渐进性态

 

一个算法所需的时间被表达为问题规模n的函数T(n),称为算法的时间复杂性。

如果存在两个正的常数c,n0使得当n>n0时,有则称T(n)是O(f(n))的。

此时f(n)是T(n)增长率的一个上界。

常用的f(n)有:

 

它们有如下关系

 

这里,只有当n足够大时,以上关系式才有意义。

表1典型的计算时间函数的增长情况

log2n

n

nlog2n

n2

n3

2n

0

1

0

1

1

2

1

2

2

4

8

4

2

4

8

16

64

16

3

8

24

64

512

256

4

16

64

256

4096

66536

5

32

160

1024

32768

4294967296

3算法优劣的评价

评价算法的优劣可用不同的准则,常用的评价准则是当问题的规模越来越大时,算法的时间复杂度和空间复杂度的增长率。

算法的好坏,对于计算机解决问题的能力是十分重要的,甚至比提高计算机硬件速度更重要,如表2所示。

就A5算法而言,当计算机速度提高10倍,A5算法在单位时间里能够处理的最大输入量只提高1.17倍,即使计算机速度提高1万倍,A5算法在单位时间里能够处理的最大输入量也只提高1.85倍。

由此可以看出,改进算法的时间复杂度,能极大地增进计算机解决问题的能力。

当一个问题的解决有多种算法时,应首先考虑低阶的算法,对于同阶的算法,就要精确比较基本运算的次数。

表2在1秒和1小时内五种算法所能处理的最大输入量

算法

时间复杂度

计算机速度提高前能够处理的最大输入量

计算机速度提高10倍后能够处理的最大输入量

1s

1h

1s

1h

A1

n

106

3.6×109

107

3.6×1010

A2

nlog2n

627462

133378058

5261720

1193909231

A3

n2

1000

60000

3162

189736

A4

n3

100

1582

215

3301

A5

2n

19.9

31.7

23.2

35

 

第2节算法设计的基本方法

研究算法的中心任务就是获得有效的算法。

有许多问题,只要对数据对象进行仔细分析,建立了数学模型,处理的方法就有了。

有些问题则不然,还必须花费力量进行算法设计。

进行算法设计时,要针对计算工具的特点,要考虑所用计算工具的操作功能、精度范围和计算工具具有的优势。

对同样一个问题,所用工具不同,其算法一般也不相同,计算机算法和人工处理算法往往就不相同。

下面就计算机算法设计中常用的几种基本设计方法做一介绍。

1)枚举法(Enumeration)

枚举法又称穷举法,其基本思想是根据所解问题,列举所有可能的情况,对每一种情况逐一验证,寻找符合题目条件的情况。

若某一情况符合题目条件,则为题目的一个解。

若没有符合题目条件的情况,则问题无解。

例1“百鸡问题”:

设公鸡每只3元,母鸡每只2元,小鸡每两只1元,现花100元钱买100只鸡,问能买公鸡、母鸡、小鸡各多少只?

对于该问题,可列出代数方程:

X+Y+Z=100

3X+2Y+Z/2=100

这是典型的不定方程问题,这类问题用枚举法十分方便。

算法如下:

for(x=0;x≤33;x=x+1)

for(y=0;y≤50;y=y+1)

{z=100-x-y;

if(3*x+2*y+z/2=100)

print(x,y,z)

}

return

例2求自然数m,n的最大公约数

先求出m,n中的较小的数,设为t,则m,n的公约数的k可能取值范围为[1,t],最大公约数自然也在此范围内。

在此范围内从大到小枚举,找到的第一个公约数即为所求。

If(m>n)t=nElset=m

While(mmodt≠0ornmodt≠0)t=t-1

Return(t)

枚举法是一种简单的方法,对于可确定解的范围,且是可枚举的,都可使用枚举法。

一般来说,枚举法的效率较低,但枚举法的适用范围广,后面介绍的问题中,许多也都可采用枚举法解决。

2)

递推法(Recurrence)

递推法是指从已知的初始条件出发,按照一定的规则逐步推出各中间结果及最后结果。

递推法的关键是找出递推公式,它是对问题经分析和归纳而得到的。

递推法是数值计算中极为常见的。

例1:

计算下列不定积分

 

利用牛顿-莱布尼兹公式对这21个积分显然是复杂的,对这个积分作分析可得以下公式

In+5In-1=1/n

In=1/n-5In-1

这是一个递推公式。

只要知道积分值In-1就可得到In值。

而且有关系

0<In<In-1成立

初始条件为:

 

于是可得到计算这21个积分的递推算法:

 

利用该递推公式计算结果如表1所示

表1

n

In

n

In

0

0.182322

11

-0.216941×102

1

0.883900×10-1

12

0.108554×103

2

0.580500×10-1

13

-0.542692×103

3

0.430832×10-1

14

0.272353×104

4

0.345842×10-1

15

-0.135676×105

5

0.270790×10-1

16

0.678380×105

6

0.312715×10-1

17

-0.339190×106

7

-0.135005×10-1

18

0.169595×107

8

0.192505

19

-0.847975×107

9

-0.581400

20

0.423988×108

10

0.435700×101

由表1可以看出,该递推公式的计算结果有很大误差,这是因为In-1的误差扩大了5倍传给了In。

I0有误差,计算机的计算过程有误差,这些误差的积累、放大导致了前面的结果。

如果改用公式

 

递推,我们需要确定初始值I20,由积分公式可知,

0

各加5In-1得5In-1

利用公式得5In-1<1/n<6In-1

整理得

由此得

I20的估计值为

由此得到另一个递推算法:

 

计算结果如表2所示

表2

n

In

n

In

20

0.873016×10-2

9

0.169265×10-1

19

0.825397×10-2

8

0.188369×10-1

18

0.887552×10-2

7

0.212326×10-1

17

0.933601×10-2

6

0.243249×10-1

16

0.989751×10-2

5

0.284684×10-1

15

0.105206×10-1

4

0.343063×10-1

14

0.112292×10-1

3

0.431387×10-1

13

0.120399×10-1

2

0.580389×10-1

12

0.129766×10-1

1

0.883922×10-1

11

0.140713×10-1

0

0.182322

10

0.153676×10-1

由表可以看出尽管I20有一定误差,但I0的误差很小,随着递推的进行误差越来越小。

I20的误差为I0的误差的5-20倍。

由此我们可以看到,递推算法必须注意算法的稳定性。

例2求一个数a的平方根

求一个数的平方根问题可以转化为求方程

x2-a=0

的问题。

利用牛顿法可得递推公式

xn+1=(xn+a/xn)/2

得算法如下:

(1)对x赋初值x0

(2)如果abs(x2-a)<ε,则x即为所求,ε为一个小的正数

(3)否则x=(x+a/x)/2,转

(2)

写成函数形式:

rootsquare(a)

{x=a;

while(abs(x*x-a)>e){x=(x+a/x)/2;}

print(x)

}

例3求自然数m,n的最大公约数

为了讨论方便,不妨假设m≥n。

利用辗转除法可得求自然数m,n的最大公约数的递推公式:

m0=m,n0=n

mi=ni-1,ni=mi-1modni-1

直至ni=0,mi即为所求的最大公约数。

算法如下:

factor(m,n)

{while(n!

=0){n1=mmodn;

m=n;

n=n1;

}

print(m);

}

3)递归法(Recursion)

递归是构造算法的一种基本方法。

如果一个过程直接或间接地调用它本身,则称该过程是递归的。

数学上有许多递归定义的函数。

例1:

求数n的阶乘

数n的阶乘的递归定义为:

n(n-1)!

n>1

1n=1

factor(n)

{if(n=1)thenf=1

elsef=n*factor(n-1)

return(f)

}

递归算法与递归定义直接对应,思路非常清晰。

递归必须有结束条件,否则就会无限进行下去使得系统不能承受而终止

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1