顺时针和逆时针旋转阵列的有效方式
Efficient way to rotate array clockwise and counterclockwise
我在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更快吗>";问题类型:也许你可以。但也许你不应该。我能让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;
}
相关文章:
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何以更有效的方式检查一个数字是否是素数?
- 为什么以这种方式使用迭代器有效?
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 以有效的方式从 Node .js运行 C 或C++代码
- 在这种情况下,如何以有效的方式使用模板
- 可能以有效的方式在模拟的循环中进行多线程
- 更有效的填充unordered_set方式?
- 持有多个特征矩阵Xd的最有效方式
- 存储资源的最有效方式
- 存储IPv4/IPv6地址的有效方式
- 使用单个索引访问子矩阵的有效方式
- 发出信号并保持pthread打开的有效方式
- 顺时针和逆时针旋转阵列的有效方式
- 使用Qt和OpenCV读取和处理视频文件的有效方式
- 这是将字符串作为参数传递给函数的内存有效方式
- 这是在c++中运行循环的有效方式吗?
- 在内存映射文件中交换字节的有效方式
- 将跨步数据复制到CUDA设备和从CUDA设备复制跨步数据的有效方式