最近在读TAOCP(计算机程序设计艺术第三版)一书,刚读到第一章,第一节的时候,在第一节末尾提到,关于算法形式化的表示,也就是公式3:
f((σ, j)) = (σ, aj) :若串θj不在σ中出现。
f((σ, j)) = (αΦjω, bj) : 若α是使σ=αθjω最短的串。
f((σ, N)) = (σ, N)
对于上面的公式,着实难以理解,看了几遍没什么收获,就直接跳过了,但是等到做习题8的时候,一下卡住了,根本摸不着头脑:
(8)通过描述等式3中的θj, Φj, aj, bj,给出计算正整数m和n最大公因子的一个“能行的”形式算法。令输入串由ambn表示,由m个a后面跟n个b。试尽可能简单给出你的解。【提示:使用算法E,但代替步骤E1中的除法,置r←|m-n|, n←min(m, n)】
回头先来分析一下书中的描述,在书中出现了这样几个变量,我们简单的先分析下这几个变量的意思:
σ:A*中的串
θ:A*中的串,在满足σ=αθω的情况下,表示θ在σ中出现,也就是子串。
j:整数
aj, bj:整数
在这里,我们先得理解aj跟bj的概念,这个很重要,因为突兀的出现了这几个整数变量,但是没有对其进行任何解释。aj跟bj其实就是算法中具体的步骤,第几步的意思,理解了aj跟bj的概念,再细细研读书中的描述,我们就可以通俗的表示公式3了:
前提:串θj, 串Φj, 串σ, 函数f
f((σ, j)) = (σ, aj) :若串θj不在σ中,则进行算法步骤aj。
f((σ, j)) = (αΦjω, bj) : 若串θj在σ中,也就是σ=αθjω, 则使用Φj替换θj,并转入算法步骤bj。
f((σ, N)) = (σ, N):算法在进入第N步后终止。
为了增进理解,可以去了解下马尔科夫算法 http://en.wikipedia.org/wiki/Markov_algorithm
理解了公式3的概念,再回过头来看习题8,其实就是用形式化的方式解最大公因子算法。
首先按照题目的提示,替换gcd算法步骤1:
E1.【求差值】置r←|m-n|, n←min(m, n)
E2.【差值为零?】若r=0,算法结束,n即为答案。
E3.【减少】置m←n,n←r,并返回步骤1.|
有了算法描述,直接上答案,这里的难点只是如何用字符串替换来表述算法中的运算和赋值:
命A=|a,b,c|, N=5. 这个算法将以字符串agcd(m,n)结束。
σ = ambn
j θj Φj bj aj
0 ab ‘’ 1 2 用空串代替σ 中的ab,若不存在ab,进入步骤aj=2 (m-n)
1 ‘’ c 0 0 把c加到σ 最左边,返回步骤0(min(m, n))
2 a b 2 3 把所有的a变成b(n←|m-n|)
3 c a 3 4 把所有的c变成a(m←min(m, n))
4 b b 0 5 如果还剩有b则重复回到步骤0,否则进入步骤5,由于N=5,所以此为结束