【问题标题】:Knuth the art of computer programming ex 1.1.8Knuth 计算机编程艺术 ex 1.1.8
【发布时间】:2014-11-04 18:39:09
【问题描述】:

我不明白 Knuth 在他对第 1.1 章练习 8 的说明中是什么意思。

任务是使用他的符号theta[j]phi[j]b[j]a[j] 制作两个正整数mn 的有效gcd 算法,其中theta 和phi 是字符串,@987654330 @ 和 b - 在这种情况下代表计算步骤的正整数。

让输入为a^mb^n 形式的字符串。

schnaaderhere 给出了对 Knuth 算法的出色解释。

我的问题是这如何与练习中给出的方向联系起来,以使用他在书中给出的算法 E,原始 r(余数)被 |m-n| 和 @987654335 取代@ 替换为min(m,n)

【问题讨论】:

标签: algorithm greatest-common-divisor knuth taocp


【解决方案1】:

当 Knuth 说“让输入由字符串 a^mb^n 表示”时,他的意思是输入应该采用 m 数量 as 和 n 数量 b 的形式s。所以输入f((m,n)),其中m = 3n = 2 将由字符串aaabb 表示。

花点时间回顾一下他在该章中的方程式 3,它代表Markov algorithm。 (下)

        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(余数)替换为 |m-n|并且 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 对,然后添加 c 直到没有更多对 ab 存在。以我在顶部使用的示例为例,我们得到了被操纵的字符串aaabb, aab, caab, ca, cca, ccb, aab (then start again)

r = m % n, m = n, n = r (then start again) 相同。不同之处当然是在上面我们使用了取模运算符和除法,但在上面的示例中我们只使用了减法。

我希望这会有所帮助。我实际上在我的博客上wrote a more in-depth analysis of Knuth's variation on a Markov algorithm。因此,如果您仍然觉得有点卡住,请阅读该系列。

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多