顺时针和逆时针旋转阵列的有效方法

时间:2014-09-08 06:45:03

标签: c++ algorithm vector rotation

我在C ++中顺时针和逆时针旋转数组或向量。就时间复杂度而言,哪种方法最有效? 我使用了rotate()函数,但我想知道有没有比这更快的方法?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
   vector<int> v;
   for(int i=0;i<5;i++)
      v.push_back(i);
   int d=2;
   rotate(v.begin(),v.begin()+d,v.end());
   return 0;
}

3 个答案:

答案 0 :(得分:3)

rotate()是一个线性时间函数,这是你能做的最好的。

但是,如果您需要进行多次旋转,则可以累积。

例如: 4的旋转和5的旋转与9的单个旋转相同。

或者事实上,在某些应用程序中,您甚至可能不想实际旋转。

就像,如果你想通过&#39; d&#39;旋转。当问到v [i]时,你可以创建一个返回v [(i + d)%v.size()]的函数。这是恒定时间的解决方案。但就像我说的那样,这是特定于应用程序的。

答案 1 :(得分:2)

&#34; 的一般答案可以让XY更快吗?&#34;有点问题: 也许你可以。但可能你不应该。

std::rotate旨在提高普通案例的效率。这意味着,如果您有一个非常具体的案例,可能可以为该案例提供更高效的实施。

BUT:

  • 不必费心为您的特定情况搜索更高性能的实现,因为找到特定的实现将需要您了解所采取步骤的详细性能以及编译器将执行的优化。 / LI>
  • 不必费心去实施它,因为你必须对它进行测试,但你对角落案例的报道仍然不如已经使用标准库实现的测试好。
  • 不要使用它,因为有人会感到烦躁,问自己为什么要推出自己的实现而不只是使用标准库。而且其他人会将其用于不符合标准实施的情况。
  • 除非您100%确定它是性能瓶颈,否则不要花时间来提高清晰代码的性能。 100%确定意味着,您已经使用了一个分析器并确定了瓶颈的确切位置。

答案 2 :(得分:0)

#include <bits/stdc++.h>
#include <iostream>
using namespace std;

    void rotatebyone(int arr[], int n) {
    int temp= arr[0], i;
    for(i=0;i<n;i++)
    {
      arr[i]=arr[i+1];
      arr[n]=temp;
    }
  }

int main()
{
    int arr[]={2,3,4,5,6,7,8};
    int m= sizeof(arr)/sizeof(arr[0]);
    int i;
    int d=1;

    for(i=0;i<d;i++) {          //function to implement it d no of times
        rotatebyone(arr,m);
    }

    for(i=0;i<m;i++) {
        cout<<arr[i]<<"";
    }

return 0;
}