算法的形式化表示,第一章习题8解答

最近在读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,所以此为结束



你可能感兴趣的:(算法,gcd,TAoCP,马尔科夫算法)