2017-09-07 12 views
0

私は3次元配列についての問題を抱えており、私はそれを理解することができません。私はC++を使用していると仮定し、3次元配列a [i] [j] [k]を持っています。それを横断する異なる順序で6つの方法があります。3次元配列のトラバーサル

I-J-K、I-K-J、J-I-K、J-K-I、K-I-J、K-J-I

今、私はさまざまな方法で実行時間を比較してみてください。

#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の運転時間は、それが常に連続して訪問するメモリ空間から最短になると思う。私は、次のとおりであり、Windowsと私のコードにグラム++ -O0を使用します。しかし、それは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が得られます。 これはあなたの問題を完全に解決します。 BTW私はまたそれらのページを読むつもりです:0

0

私はあなたのコードをubuntu 14.04でテストしました。私は注文i-j-kから短絡した運転時間を得た。 Test result

希望すると便利です。

+0

ありがとうございます。では、異なるOSでの結果はどう思いますか? – AerysNan