当 Knuth 说“让输入由字符串表示a^mb^n
”时,他的意思是输入应该采用m
number of a
s 和n
number of b
s 的形式。因此输入f((m,n))
wherem = 3
和n = 2
将由 string 表示aaabb
。
花点时间回顾一下他在该章中的方程 3,它代表了一个马尔可夫算法。(以下)
f((σ,j)) = (σ,a_j) if θ_j does not occur in σ
f((σ,j)) = (αφ_jω,b_j) if α is the shortest string for which σ = αθ_jω
f((σ,N)) = (σ,N)
所以想法是为每个变量定义序列j, θ_j, φ_j, a_j & b_j
。这样,使用上述马尔可夫算法,您可以指定输入字符串发生的情况,具体取决于j
.
现在,进入您的主要问题;
我的问题是这如何与练习中给出的方向联系起来,以使用书中给出的算法 E,原始 r(余数)替换为 |mn| n 由 min(m,n) 代替。
本质上,Knuth 在这里所说的是,您不能使用上述马尔可夫算法进行除法。那么最接近除法的东西是什么?好吧,基本上我们可以从较大的数字中减去较小的数字,直到剩下余数。例如;
10 % 4 = 2
与执行以下操作相同;
10 - 4 = 6 Can we remove another 4? Yes. Do it again.
6 - 4 = 2 Can we remove another 4? No. We have our remainder.
现在我们有剩下的了。这本质上就是他希望您对我们的输入字符串执行的操作,例如aaabb
.
如果您通读书后 Knuth 建议的答案并通过几个示例进行操作,您会发现这本质上是他正在做的事情,即删除对ab
然后添加 ac
直到不再ab
存在对。以我在顶部使用的示例为例,我们得到了这样操作的字符串aaabb, aab, caab, ca, cca, ccb, aab (then start again)
这与r = m % n, m = n, n = r (then start again)
. 不同之处当然是在上面我们使用了模运算符和除法,但在上面的示例中我们只使用了减法。
我希望这有帮助。实际上,我在我的博客上对马尔可夫算法的 Knuth 变体进行了更深入的分析。因此,如果您仍然感到有点卡住,请阅读该系列。