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

Efficient way to rotate array clockwise and counterclockwise

本文关键字:有效 方式 阵列 旋转 逆时针 顺时针      更新时间:2023-10-16

我在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;
}

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

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

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

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

比如,如果你想按"d"旋转。您可以创建一个函数,当被要求获得v[i]时,它会返回v[(i+d)%v.size()]。这是一个恒定时间解。但正如我所说,这是特定于应用程序的。

<我能让XY更快吗>";问题类型:也许你可以。但也许你不应该。

CCD_ 1被设计为对于平均情况是有效的。这意味着,如果您有一个非常具体的案例,可能会为该案例提供更高性能的实现。

但是:

  • 不要为您的特定情况搜索更高性能的实现,因为找到特定的实现需要您了解所采取步骤的详细性能以及编译器将执行的优化
  • 不要费心去实现它,因为您将不得不对它进行测试,而且您对角落案例的覆盖率仍然不如使用标准库实现已经执行的测试好
  • 不要使用它,因为有人会很生气,问自己为什么要推出自己的实现,而不仅仅使用标准库。其他人会将其用于性能不如标准实现的情况
  • 不要花费时间来提高一段清晰代码的性能,除非你100%确信这是一个性能瓶颈。100%肯定意味着,您已经使用了探查器并精确定位了瓶颈的确切位置
#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;
}