三维数组遍历

时间:2017-09-07 05:11:33

标签: c++ arrays algorithm operating-system

我遇到了关于三维数组的问题,我无法弄明白。假设我使用的是C ++而且我有一个三维数组a [i] [j] [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上的表现如此,非常感谢。

2 个答案:

答案 0 :(得分:0)

我已经在ubuntu 14.04中测试了你的代码。我从命令i-j-k得到了短暂的运行时间。 Test result

希望这有用。

答案 1 :(得分:0)

首先应该知道如何将内存分配给多维数组。 here非常详细地解释了数组如何获取内存分配。 对于N维数组可视化和工作This是非常好的页面,你可以得到。 这将彻底解决您的问题。顺便说一下,我也会阅读这些页面:0