【问题标题】:Juggling algorithm regarding Right Array rotation关于右阵列旋转的杂耍算法
【发布时间】:2020-03-25 17:56:43
【问题描述】:

最近我使用 Juggling 算法了解了线性时间的数组旋转。这是关于数组左旋转的sn-p。

void ArrayRotate (int A[], int n, int k)
{
  int d=-1,i,temp,j;
  for(i=0;i<gcd(n,k);i++)
  {
    j=i;
    temp=A[i];
    while(1)
    {
      d=(j+k)%n;
      if(d==i)
        break;
      A[j]=A[d];
      j=d;
    }
    A[j]=temp;
  }
}

但现在我被困在如何使用这种杂耍算法沿正确方向旋转数组。

1,2,3,4,5  (given array) 
5,1,2,3,4   (after 1 right rotation)

(我已经用蛮力法和反转法解决了这个问题。)

【问题讨论】:

  • 请只标记一种语言,除非问题是关于这两种语言的互操作性或它们之间的差异
  • for(i=n-1;i&lt;gcd(n,k);i--) -- 题外话,但您在循环的每次迭代中计算 gcd(n,k)。只需计算一次,将其存储在一个变量中,然后在for 循环中使用该变量。
  • for(i=n-1;i&lt;gcd(n,k);i--) 将立即停止,除非n &lt; knk 的主要因素,当然?
  • @ChrisHall 先生,我已经更正了代码。
  • @idclev463035818 我删除了重复的标签

标签: c++ arrays algorithm data-structures


【解决方案1】:
  1. 如前所述,如果允许,您应该使用 std::rotate。
  2. 您的实现存在错误。这是一个固定的实现。
void ArrayRotate(int A[], int n, int k) {
    int d = -1, i, temp, j;
    int g = gcd(n, k);
    for (i = 0; i < g; ++i) {
        j = i;
        temp = A[i];
        while (true) {
            d = (j + k) % n;
            if (d == i) {
                break;
            }
            A[j] = A[d];
            j = d;
        }
        A[j] = temp;
    }
 }

还请注意,我在循环条件之外取出了 gcd 计算。它在技术上不会影响复杂性,但只计算一次 gcd 就足够了。

要将数组向右旋转k 次,只需将其向左旋转n - k 次即可。

void ArrayRotateRight(int A[], int n, int k) {
    ArrayRotate(A, n, n - k);
}

或者把第8行改成d = (j - k + n) % n;

【讨论】:

    【解决方案2】:

    不确定您是作为智力练习还是为了生产代码,但对于生产代码,请使用 STL rotate 算法:

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    void display(int* a, int length)
    {
        for (int i = 0; i < length; ++i)
            cout << a[i] << " ";
    
        cout << endl;
    }
    
    int main()
    {
        const int len = 5;
    
        int arr[] =  { 1,2,3,4,5 };
    
        display(arr, len);
    
        rotate(arr, arr + 1, arr + len); // arr + x means left by x
    
        display(arr, len);
    
        rotate(arr, arr + len - 1, arr + len); // arr + len - x means right by x 
    
        display(arr, len);
    }
    

    【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多