串旋转的杂耍算法

时间:2014-02-20 14:32:56

标签: algorithm

有几种方法可以处理字符串轮换 “Programming Pearls”深入讨论字符串轮换,有三种线性算法。(点击here进行检查)

第一个被称为“杂耍算法”,我花了很多时间研究它,但我仍然无法理解 Great Common Divisor 在其中扮演的角色。任何人都可以详细解释一下吗?

2 个答案:

答案 0 :(得分:3)

通过以d为步长移动元素来旋转元素。此过程在一定数量的移动后循环回来,因此您需要总共应用m个长度为l=n/m的周期。

l是解决等式l.d = 0 (mod n)的第一个值,因此m正好是gcd(n, d)

Example 1: for n=12, d=3, 3 cycles of length 4:
 0  3  6  9
 1  4  7 10
 2  5  8 11

Example 2: for n=12, d=10, 2 cycles of length 6:
 0 10 8 6 4 2
 1 11 9 7 5 3

答案 1 :(得分:1)

感谢您的解释!但是,对我来说,你可以跳到结论

并不是很直观
  

M = GCD(N,d)

,所以我只想在这里分享我的推理:

因为你想找到这样的最小值 ((n/m)*d)%n == 0,这意味着您希望找到能够满足此要求的最大m。从m = n开始,您可以逐个尝试,并在m=gcd(n,d)满足等式时发现。这是因为:(n/m)*d = (n/m)*((d/m)*m) = n*(d/m)。我们需要确保d/mn/m都是有效整数,并且对于m这样的最大值,必须是m=gcd(n,d)的情况。