2017-09-07 119 views
0

我遇到了一個關於三維數組的問題,我找不到它。假設我使用C++,並且我有一個三維數組a [i] [j] [k]。有六種方式與穿越它的不同的順序:三維數組遍歷

I-J-K,I-K-J,J-11-K,J-K-I,K-I-J,K,J-11

現在,我嘗試比較不同的方式運行時間。我用G ++ -O0在Windows和我的代碼如下:

#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上的行爲如此,非常感謝。

+0

請添加各種測試的時間信息。這對那些能夠回答你的問題的人來說很有用。 –

+0

也嘗試更改測試訂單 – MBo

+0

@MBo我試圖改變順序。只要我不首先測試j-i-k,它將是最快的。如果我首先測試j-i-k,那麼比i-j-k慢一點。但這並不能解釋爲什麼j-i-k如此之快(至少比i-k-j更快)。 – AerysNan

回答

0

首先應該知道如何將內存分配給多維數組。 here非常詳細的解釋給出了數組如何獲得內存分配。 對於N維陣列可視化和工作This是非常好的頁面,你可以得到。 這將完全解決您的問題。順便說一句我也將閱讀這些網頁:0

0

我已經測試了您的代碼在Ubuntu 14.04。我從命令i-j-k得到了短暫的運行時間。 Test result

希望這會對您有所幫助。

+0

非常感謝。那麼你如何看待不同操作系統上的結果? – AerysNan