三维阵列遍历

Three-dimensional array traversal

本文关键字:遍历 阵列 三维      更新时间:2023-10-16

我遇到了一个关于三维数组的问题,我无法弄清楚。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订单中获得了短短的运行时间。测试结果

希望这很有帮助。