计算机程序设计艺术-卷1-1.1节笔记

248 阅读3分钟

1. 算法定义(algorithm)

关于算法一词的来源,早期的语言学家猜测,它源自algoris[费力的]+arithmos[数字]的组合;另外一些人则反对这种说法,认为这个词是从“King Algor of Castile”派生而来的。最后,数学史研究者发现了"algorithm"一词的真实来源:它来自于一部著名的波斯课本的作者的名字, Abū‘Abd Allāh Muhammad ibn Mūsā al-Khwārizmī(约公元825年),从字面上看,是“Abdullah,Muhammad的父亲,Moses的儿子,-Khwārizm地方的人”。中亚的咸海(Aral Sea)曾叫做花刺子模湖(Lake Khwārizm ),而花刺子模地区位于该海南部的阿姆河(Amu River)流域。Al-Khwārizmī写了著名的Kitāb al-jabr wa’l-muqābala(《还原和相等的规则》),另一个词“代数”(Algebra),是从他的书的标题引出的,该书是对线性和二次方程的系统研究。逐渐地,algorism的形式和意义就变得面目全非了。经历了一些伪词源学的滥用,它同希腊根源的词arithmetic(算术)混淆。考虑到人们已经把这个词原始的派生过程忘记了这一事实,从"algorism"变成为"algorithm"就不难理解了。

2. 算法的特性

1)有限性。一个算法在有限步骤之后必然要终止。

2)确定性。一个算法的每个步骤都必须精确的定义;要执行的动作每一步都必须严格地和无歧义地描述清楚。

3)输入。一个算法有零个或多个输入,此即在算法开始之前最初赋给它的量,或者当算法运行时动态地赋给它的量。

4)输出。一个算法有一个或多个输出:和输入有特定关系的量。

5)可行性。一个算法一般可以认为是可行的(或称有效的),其含义是指它的所有运算必须是充分基本的,原则上人们用笔和纸都可以在有限时间内准确地执行。

3. 其他概念

3.1 算法分析(Analysis of algorithms):

选取一个特定的算法,然后确定它的定量的特性;有时还要研究一个算法在某种意义下是否最优。

3.2 算法理论(The theory of algorithms):

主要研究对于计算特定量是否存在可行算法

4. 计算方法的形式化定义:

计算方法为一个四元组(Q,I,Ω,fQ,Ι,Ω,f),其中QQ是包含子集IΙΩΩ的一个集合,而ff是从QQ到其自身的一个函数。此外,ΩΩff下应保持逐点不动,即,对于ΩΩ中的所有元素qqf(q)f(q)应等于qq。四个量Q,I,Ω,fQ,I,Ω,f分别表示计算的状态,输入,输出以及计算规则。集合II中的每一个输入xx定义一个计算序列x0x1x2...x_0x_1x_2...如下:

x0=x及对于k0,xk+1=f(xk)x_0 = x 及 对于k\geqq0, x_{k+1}=f(x_k)

如果kk是使xkx_kΩΩ中的最小整数,就说计算序列在kk步内终止,此时就说从xx产生输出xkx_k。(注意,如果xkx_k在Ω中,则xk+1x_{k+1}也是。因为此时,xk+1=xkx_{k+1}=x_k。)某些计算序列可能永远不终止;对于II中所有的xx都能在有限多步内终止的计算方法就是算法。

4.1 定义解读:
ΩΩff应保持逐点不动:

ΩΩ作为输出结果的集合,对于一个算法而言,经过有限步骤后,必然会使对于II中的输入对应的计算序列到达此集合中。ff保持ΩΩ逐点不动代表算法输出的稳定与确定,保证了指定输入经过一系列由ff定义的计算步骤后产生唯一指定的输出,并且在输出状态达到后,计算过程不再改变输出结果,体现了算法的可终止性、稳定性和可重复性

计算序列在kk步内终止:

计算序列是按照kk的次序进行的,如果某次计算首次到达结果集合,根据定义,后续计算依赖前面的结果,依然映射到结果集。此时的kk是最小的步骤数,本次计算过程到这一步结束。

4.2 示例:形式化定义欧几里得算法

4.2.1 算法E(欧几里得算法 Euclid's algorithm)

E1.[求余数(remainder)]以n除m并令r为所得余数。(我们将有0r<n0\leqq r \lt n)。

E2.[余数为零?]若r=0,算法结束,n即为答案。

E3.[减少]置m←n,n←r,并返回步骤E1

4.2.2 将算法E应用形式化定义

QQ为所有单元素(n)(n)、所有有序数偶(m,n)(m,n)以及所有有序四元组(m,n,r,1)(m,n,r,1),(m,n,r,2)(m,n,r,2)以及(m,n,p,3)(m,n,p,3)的集合。其中m,n,pm,n,p是正整数,rr是非负整数。

II为所有有序数偶(m,n)(m,n)组成的QQ的子集,ΩΩ为所有单元素(n)(n)组成的QQ的子集。定义ff如下:

f((m,n))=(m,n,0,1);f((n))=(n);f((m,n,r,1))=(m,n,nm的余数,2);f((m,n,r,2))=如果r=0则为(n),否则为(m,n,r,3);f((m,n,p,3))=(n,p,p,1) f((m,n)) = (m,n,0,1); f((n)) = (n);\\ f((m,n,r,1)) = (m,n,n除m的余数,2);\\ f((m,n,r,2)) = 如果r=0则为(n), 否则为(m,n,r,3);\\ f((m,n,p,3)) = (n,p,p,1)\\

上面关于ff的定义中,括号中的1、2、3与算法E的编号作用类似,用于定义计算过程的顺序,以下将其作为步骤编号,逐行解读上面的定义。

第1行:初始情形,对于有序偶类型的输入,转到步骤1;对于单点情形,也就是输出集合ΩΩ中的元素,输入即为最终结果(体现ff应保持ΩΩ逐点不动)

第2行:(步骤1)进行求余运算,然后转到步骤2

第3行:(步骤2)对步骤2的计算结果进行判断,如果为0则结束,否则转到步骤3

第4行:(步骤3)将mm的值设置为nn,将nn的值设置为步骤2的余数pp,然后转到步骤1

5. 计算方法形式化定义存在的问题

上面关于算法的形式化定义没有涉及可行性的的限制。例如,QQ可以表示无法手工计算的无穷序列,或者ff可能包含凡人有时无法执行的操作。如果希望对算法的概念加上限制,使得它仅涉及初等的运算,需要对Q,I,ΩQ,I,Ωff加上一些限制。此处作者结合了马尔科夫(A. A. Markov)算法给出了一个具有可行性算法的示例。

5.1 马尔可夫算法

马尔可夫算法是使用类似形式文法的规则在符号串上操作的字符串重写系统。马尔可夫算法被证明是图灵完全的,这意味着它们适合作为一般的计算模型,并可以用它的简单概念表示任何数学表达式。

(这个网址)有关于如何应用该算法保证可计算性的说明,可计算能够保证算法的可行性。

5.1.2 算法简介

该算法由一些列规则组成。

规则(Rules):一系列成对的字符串,通常以“pattern→replacement”的形式呈现。每条规则可能是普通规则,也可能是终止规则。

步骤:

给定一个输入字符串:

  1. 按从上到下的顺序检查这些规则,看输入字符串中是否能找到任何模式。

  2. 如果没有找到,算法停止运行。

  3. 如果找到一个(或多个),则使用其中第一条规则,将输入字符串中匹配文本(pattern)最左边的出现位置用其替换内容(replacement)进行替换。

  4. 如果刚应用的规则是终止规则,算法停止运行。

  5. 转到步骤1。

请注意,每次应用规则后,都要从第一条规则开始重新进行搜索。

5.1.3 算法示例

规则:

规则1. "|0" -> "0||"

规则2. "1" -> "0|"

规则3. "0" -> ""

输入字符串:

"101"

应用算法后,各执行步骤的结果:

  1. "101"

  2. "0|01"

  3. "00||1"

  4. "00||0|"

  5. "00|0|||"

  6. "000|||||"

  7. "00|||||"

  8. "0|||||"

  9. "|||||"

5.2 结合马尔科夫算法的示例

AA是字母的有限集合,AA^*AA上的所有字符串的集合(即所有有序序列x1x2...xnx_1x_2...x_n的集合,其中n0n \geq 0且对于1jn,xj1 \leq j \leq n,x_jAA中)。思路是对计算状态进行编码,以便用AA^*的字符串来表示计算状态。现在令NN为一个非负整数,QQ为所有(σ,j)(σ,j)的集合,其中σσAA^*中的元素,jj是一个整数,0jN0\leq j \leq N, 令IIj=0j=0时的QQ的子集,ΩΩj=Nj=N时的QQ的子集。如果θθσσ都是AA^*中的字符串,对于字符串aaωω,如果σσ可以写成aθωaθω的形式,那么就说θθ出现在σσ中。为了完成定义,令ff是对于0jN0\leq j \leq N,由字符串θj,φjθ_j,φ_j和整数aj,bja_j,b_j所定义的下列类型的一个函数:

f((σ,j))=(σ,aj)f((σ, j)) = (σ, a_j) 如果θjθ_j没有出现在σσ中;

f((σ,j))=(αφjω,bj)f((σ, j)) = (αφ_jω, b_j ) 如果αα是满足σ=αθjωσ =αθ_jω的最短字符串

f((σ,N))=(σ,N)f((σ, N))=(σ, N)

示例解读

nn:字符串长度

jj:首次出现为字符串中的索引编号;后续为某个计算状态的代号

σσ:字符串形式的计算状态

NN:范围边界,可以防止QQ变为无穷个状态

θθ:用于字符串包含形式的定义

θjθ_j:马尔可夫算法中的匹配模式(pattern)

φjφ_j:马尔可夫算法中的替换内容(replacement)

aaωω:用于字符串包含形式的定义

aja_jbjb_j:表示计算状态代号

ff函数的3行定义,对应马尔可夫算法中的前4行步骤。以下详细说明:

第一行:如果没有找到匹配模式,计算状态变为aja_j,进行下一次匹配

第二行:如果已经找到匹配模式,做最短匹配,计算状态变为bjb_j,进行下一次匹配

第三行:如果匹配到了最后一个规则,那么输入等于输出,计算状态在此刻不再改变,进入终态

由于NN的限定和AA是有限集合的限制,该算法的QQ的元素个数不会无限。第二行的最短匹配能保证算法的确定性,防止字符串的替换结果不唯一。该算法的每一步都是可行的。

5.3 上面的示例是否整体具有有限性

ff是否能保证NN关联的状态是必然可达的?结论是否定的。如果替换始终在若干个状态之间循环流转,相当于出现了无限递归,那么算法就无法终止。马尔科夫算法的规则如果设计不当,会导致算法不具有有限性。 例如下面的情形:
规则:

  1. “01”→“10”
  2. “10”→“01”

输入:
10

此时计算过程无法终止