三维阵列遍历
Three-dimensional array traversal
我遇到了一个关于三维数组的问题,我无法弄清楚。k]。有六种方式,有不同的遍历:
i-j-k,i-k-j,j-i-k,j-k-i,k-i-j,k-j-i
现在,我尝试比较不同方式的运行时间。我在Windows上使用G -O0,我的代码如下:
#define N 512
#include<ctime>
#include<iostream>
using namespace std;
int a[N][N][N],b[N][N][N],c[N][N][N];
int main(){
clock_t start;
clock_t finish;
start=clock();
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int i=0;i<N;i++)
for(int k=0;k<N;k++)
for(int j=0;j<N;j++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int j=0;j<N;j++)
for(int i=0;i<N;i++)
for(int k=0;k<N;k++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int k=0;k<N;k++)
for(int j=0;j<N;j++)
for(int i=0;i<N;i++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
return 0;
}
我认为,I-J-K订单的运行时间将是最短的,因为它访问的内存空间始终是连续的。但是,J-I-K的速度甚至更快。输出就是这样:
656ms 1817ms 310ms 8475ms 5820ms 11804ms
我几次运行此程序,运行时间有所不同,但订单保持不变。当我在Ubuntu上运行此程序时,I-J-K成为最快的,这使我感到困惑。我想知道为什么这个程序在Windows上表现出色,非常感谢。
首先应该知道如何将内存分配给多维数组。这是一个非常详细的解释,可以很好地说明数组如何获得内存分配。对于n维数组可视化和工作,这是您可以获得的非常好的页面。这将完全解决您的问题。顺便说一句,我还将阅读这些页面:0
我在Ubuntu 14.04中测试了您的代码。我从I-J-K订单中获得了短短的运行时间。测试结果
希望这很有帮助。
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 如何遍历 2D 阵列?
- 数组 - 循环遍历辅助阵列
- 三维阵列遍历
- 创建一个二维向量阵列,遍历
- 如何大步遍历n维阵列
- 这是遍历阵列的更快方法