我在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;
}
答案 0 :(得分:3)
rotate()是一个线性时间函数,这是你能做的最好的。
但是,如果您需要进行多次旋转,则可以累积。
例如: 4的旋转和5的旋转与9的单个旋转相同。
或者事实上,在某些应用程序中,您甚至可能不想实际旋转。
就像,如果你想通过&#39; d&#39;旋转。当问到v [i]时,你可以创建一个返回v [(i + d)%v.size()]的函数。这是恒定时间的解决方案。但就像我说的那样,这是特定于应用程序的。
答案 1 :(得分:2)
&#34; 的一般答案可以让XY更快吗?&#34;有点问题: 也许你可以。但可能你不应该。
std::rotate
旨在提高普通案例的效率。这意味着,如果您有一个非常具体的案例,可能可以为该案例提供更高效的实施。
答案 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;
}