TAOCP Vol1 1.1 何谓算法?

来源:互联网 发布:java多态的好处 编辑:程序博客网 时间:2024/05/16 07:11

算法举例:欧几里得最大公约数算法 (Euclid 's algorithm) (求正整数m和n的最大公约数)

E1: r <- m%n

E2: if r=0, 算法结束,n就是所求最大公约数

E3: m<-n, n<-r; 调回到E1;


——————————————————————————————————————————————————————————————

高德纳认为算法应该满足以下条件:

1. 有限性:

 算法应该满足有限次运算步骤后能结束。 如果一个过程满足除了有限性之外的其他所有条件,那么这个过程可以称之为运算方法(computational method)。 一个响应程序(如响应鼠标动作或者响应连接建立的程序)就可能是一个运算方法, 他被用来不断和外界环境交互。

     可以看到Euclid‘ s algorithm是满足有限性的。如果m>n m值会减少成n而n会减少成一个比n小的数。如果m<n那么经过E1,E2,E3后m和n的值会互换,然后变成第一种情况。 如果n=m那么算法直接结束。 所以没两次循环后要么n,m的值都减小,要么算法结束。而m或n其中一个降为1或0算法一定会结束, 故算法在有限次内一定会结束。

2. 严密性:

 即算法应该被精确的定义,不能有二义性。 用自然语言定义算法往往出现算法失去严密性的问题, 同样一句话在不同人的心里意义不一定完全一致,而算法的定义应该严密到能被计算机准确的理解。 计算机程序设计语言或是机器语言是用来解决此问题得完美方案。

如果对于除法和求余运算没有什么异议的话,Euclid ’s Algorithm算法是严密滴。

3. 输入

   一个算法应该至少有0个输入。 显然Euclid ’s Algorithm有输入。

4. 输出

      一个算法至少应该有一个输出(当然输出的形式是广泛的)。显然Euclid ’s Algorithm有输出,并且输出一定是我们所求(关于这点的证明可以百度辗转相除法求最大公约数“)。

5. 可行性。

关于可行性高纳德是这么解释的: 算法中的每一步要足够基础,简单到常人可以只用纸和笔在有限的时间就能准确的完成。Euclid' s Algorithm的每一步运算显然都符合这个条件。 但是像 "4是否是方程x^n + y^n + z^n = w^n有解的最大n值" 运算步骤就并不满足可行性。


————————————————————————————————————————————————————————

到目前为止,我们对于算法定义的讨论和语言描述是模糊的。 如果不能用将其转换为数学语言来定义算法, 那是不足以支撑起一个”算法理论“的。 下面我们用集合论的方法来定义"算法”。

定义集合Q, I ,O和函数f构成的四元组(Q,I,O,f)。 其中I和O是Q的子集, f是从Q到Q的函数映射, 且对于O中的任意元素q 有f(q)=q。 可以认为Q代表着计算的状态, I代表输入,O代表输出,f代表算法规则。 I中每一输入x经过映射f(x)可以转换为一个计算序列x, x1, x2. x3 ........。 这个序列中首个属于O的元素Xn(即满足f(Xn) == Xn) 即为输出,并且我们知道该计算序列终结于Xn(因为显然Xn+1 == Xn) 。 只有对于I中每个元素产生的计算序列都会终结, 我们才能将该计算方法称之为--算法。

现在我们用这种方法来描述Euclid 's Algorithm。 

Q定义为所有单元素(n), 所有有序二元数对(m, n)和所有有序四元组(m, n , r, 1) , (m, n , r, 2)和(m, n ,q,3)的集合。 其中m、n、q为正整数, q为非负整数。

I 为所有有序二元数对(m, n)

O 为所有单元素(n)

函数f 定义如下:

f((n)) = (n)

f((m,n)) = (m,n,0,1)

f((m,n,r,1)) = (m,n, m%n, 2)

f((m,n,r,2)) =  (n)if r=0; (m,n,r,3) otherwise

f((m,n,p,3) = f((n, p,p,1);


以输入为(8, 12)为例, 起计算序列为(8,12), (8,12,0,1),  (8, 12, 8, 2),  (8, 12, 8, 3) ,  (12, 8, 8, 1),  (12, 8, 4, 2), (12, 8, 4, 3),  (8,4, 4, 1), (8, 4, 0, 2), (4)


————————————————————————————————————————————————————————

以上数学定义满足了算法的四个要求:有限性, 严密性, 输入和输出。 但缺乏对可执行性的描述, 所以我们还需要一种能同时表达算法五个要求

的数学表达。(未完待续)



ps: 关于TAOCP这一章的笔记, 图灵论坛上有一篇文章比我写的更生动和深刻,连接为http://www.ituring.com.cn/article/832


原创粉丝点击