旋转数组和循环次数混乱

时间:2016-06-02 10:15:33

标签: arrays algorithm

问题是写一个函数rotate(ar [],d,n),用d元素旋转大小为n的arr []。 解决方案(杂耍方法)在这里http://www.geeksforgeeks.org/array-rotation/。令我困惑的是为什么循环次数是n和d的gcd。有没有人通过例子知道证据?

2 个答案:

答案 0 :(得分:1)

  

为什么循环次数是n和d的gcd

所以循环次数完全分开了!如果'c'是所涉及的周期数,那么n应该可以被c完全整除,即n = x c,类似地,d = y c。

现在,在算法中,x是数组中的集合数,y是执行的步数(或迭代次数)。在给定的示例中检查并确认。

选择GCD的主要目的是使x和y为整数而不是某些浮点值。

答案 1 :(得分:0)

基本上开发人员尝试做的是

    Tmp = arr[0]
    for(i=0; i<n-1;i++){
     arr[i*d % n] = arr[(i+1)*d % n]
}
    arr[n-1] = arr[d-1]

如果GCD(n,d)= 1,程序运行正常,例如(n,d)=(5,2)

Tmp = arr[0]
arr[0]= arr[2]
arr[2]= arr[4]
arr[4]= arr[1]
arr[1]= arr[3]

arr[3]= arr[5]

但是当GCD(n,d)> 1在这里开始问题时,例子(6,2)

Tmp = arr[0]
arr[0]= arr[2]
arr[2]= arr[4]
arr[4]= arr[0] 
arr[0]= arr[2] // probleme because we are not able to go throw each element so we should break from the loop

由于n / GCD(6,2)= 3,我们只能正确地修改前三个元素,所以他在循环中放入了这样一个条件:如果我们回到第一个元素,他会从while中断并增加起始元素为1所以在下一次迭代中他修改了arr [1],arr [3],arr [5]