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. 计算方法的形式化定义:
计算方法为一个四元组(),其中是包含子集和的一个集合,而是从到其自身的一个函数。此外,在下应保持逐点不动,即,对于中的所有元素,应等于。四个量分别表示计算的状态,输入,输出以及计算规则。集合中的每一个输入定义一个计算序列如下:
如果是使在中的最小整数,就说计算序列在步内终止,此时就说从产生输出。(注意,如果在Ω中,则也是。因为此时,。)某些计算序列可能永远不终止;对于中所有的都能在有限多步内终止的计算方法就是算法。
4.1 定义解读:
在应保持逐点不动:
作为输出结果的集合,对于一个算法而言,经过有限步骤后,必然会使对于中的输入对应的计算序列到达此集合中。保持逐点不动代表算法输出的稳定与确定,保证了指定输入经过一系列由定义的计算步骤后产生唯一指定的输出,并且在输出状态达到后,计算过程不再改变输出结果,体现了算法的可终止性、稳定性和可重复性
计算序列在步内终止:
计算序列是按照的次序进行的,如果某次计算首次到达结果集合,根据定义,后续计算依赖前面的结果,依然映射到结果集。此时的是最小的步骤数,本次计算过程到这一步结束。
4.2 示例:形式化定义欧几里得算法
4.2.1 算法E(欧几里得算法 Euclid's algorithm)
E1.[求余数(remainder)]以n除m并令r为所得余数。(我们将有)。
E2.[余数为零?]若r=0,算法结束,n即为答案。
E3.[减少]置m←n,n←r,并返回步骤E1。
4.2.2 将算法E应用形式化定义
令为所有单元素、所有有序数偶以及所有有序四元组,以及的集合。其中是正整数,是非负整数。
令为所有有序数偶组成的的子集,为所有单元素组成的的子集。定义如下:
上面关于的定义中,括号中的1、2、3与算法E的编号作用类似,用于定义计算过程的顺序,以下将其作为步骤编号,逐行解读上面的定义。
第1行:初始情形,对于有序偶类型的输入,转到步骤1;对于单点情形,也就是输出集合中的元素,输入即为最终结果(体现应保持逐点不动)
第2行:(步骤1)进行求余运算,然后转到步骤2
第3行:(步骤2)对步骤2的计算结果进行判断,如果为0则结束,否则转到步骤3
第4行:(步骤3)将的值设置为,将的值设置为步骤2的余数,然后转到步骤1
5. 计算方法形式化定义存在的问题
上面关于算法的形式化定义没有涉及可行性的的限制。例如,可以表示无法手工计算的无穷序列,或者可能包含凡人有时无法执行的操作。如果希望对算法的概念加上限制,使得它仅涉及初等的运算,需要对和加上一些限制。此处作者结合了马尔科夫(A. A. Markov)算法给出了一个具有可行性算法的示例。
5.1 马尔可夫算法
马尔可夫算法是使用类似形式文法的规则在符号串上操作的字符串重写系统。马尔可夫算法被证明是图灵完全的,这意味着它们适合作为一般的计算模型,并可以用它的简单概念表示任何数学表达式。
(这个网址)有关于如何应用该算法保证可计算性的说明,可计算能够保证算法的可行性。
5.1.2 算法简介
该算法由一些列规则组成。
规则(Rules):一系列成对的字符串,通常以“pattern→replacement”的形式呈现。每条规则可能是普通规则,也可能是终止规则。
步骤:
给定一个输入字符串:
-
按从上到下的顺序检查这些规则,看输入字符串中是否能找到任何模式。
-
如果没有找到,算法停止运行。
-
如果找到一个(或多个),则使用其中第一条规则,将输入字符串中匹配文本(pattern)最左边的出现位置用其替换内容(replacement)进行替换。
-
如果刚应用的规则是终止规则,算法停止运行。
-
转到步骤1。
请注意,每次应用规则后,都要从第一条规则开始重新进行搜索。
5.1.3 算法示例
规则:
规则1. "|0" -> "0||"
规则2. "1" -> "0|"
规则3. "0" -> ""
输入字符串:
"101"
应用算法后,各执行步骤的结果:
-
"101"
-
"0|01"
-
"00||1"
-
"00||0|"
-
"00|0|||"
-
"000|||||"
-
"00|||||"
-
"0|||||"
-
"|||||"
5.2 结合马尔科夫算法的示例
令是字母的有限集合,是上的所有字符串的集合(即所有有序序列的集合,其中且对于在中)。思路是对计算状态进行编码,以便用的字符串来表示计算状态。现在令为一个非负整数,为所有的集合,其中是中的元素,是一个整数,, 令是时的的子集,是时的的子集。如果和都是中的字符串,对于字符串和,如果可以写成的形式,那么就说出现在中。为了完成定义,令是对于,由字符串和整数所定义的下列类型的一个函数:
如果没有出现在中;
如果是满足的最短字符串
示例解读
:字符串长度
:首次出现为字符串中的索引编号;后续为某个计算状态的代号
:字符串形式的计算状态
:范围边界,可以防止变为无穷个状态
:用于字符串包含形式的定义
:马尔可夫算法中的匹配模式(pattern)
:马尔可夫算法中的替换内容(replacement)
、:用于字符串包含形式的定义
、:表示计算状态代号
函数的3行定义,对应马尔可夫算法中的前4行步骤。以下详细说明:
第一行:如果没有找到匹配模式,计算状态变为,进行下一次匹配
第二行:如果已经找到匹配模式,做最短匹配,计算状态变为,进行下一次匹配
第三行:如果匹配到了最后一个规则,那么输入等于输出,计算状态在此刻不再改变,进入终态
由于的限定和是有限集合的限制,该算法的的元素个数不会无限。第二行的最短匹配能保证算法的确定性,防止字符串的替换结果不唯一。该算法的每一步都是可行的。
5.3 上面的示例是否整体具有有限性
是否能保证关联的状态是必然可达的?结论是否定的。如果替换始终在若干个状态之间循环流转,相当于出现了无限递归,那么算法就无法终止。马尔科夫算法的规则如果设计不当,会导致算法不具有有限性。
例如下面的情形:
规则:
- “01”→“10”
- “10”→“01”
输入:
10
此时计算过程无法终止