8

この質問をする方法がよくわかりませんが、ルックアップ配列には(これまでのところ)2つの方法があります

オプション 1 は次のとおりです。

bool[][][] myJaggegArray;

myJaggegArray = new bool[120][][];
for (int i = 0; i < 120; ++i)
{
  if ((i & 0x88) == 0)
  {
    //only 64 will be set
    myJaggegArray[i] = new bool[120][];
    for (int j = 0; j < 120; ++j)
    {
      if ((j & 0x88) == 0)
      {
        //only 64 will be set
        myJaggegArray[i][j] = new bool[60];
      }
    }
  }
}

オプション 2 は次のとおりです。

bool[] myArray;
//                [998520]
myArray = new bool[(120 | (120 << 7) | (60 << 14))];

どちらの方法もうまく機能しますが、高速ルックアップを行う別の (より良い) 方法はありますか?速度/パフォーマンスが重要な場合は、どちらを使用しますか?

これはチェス盤の実装 (0x88)で使用され、ほとんどの場合

[from][to][dataX]オプション 1 の場合

[(from | (to << 7) | (dataX << 14))]オプション 2 の場合

4

2 に答える 2

2

1 つの大きなメモリ ブロックを持つ利点があるため、1 つの大きな配列を使用することをお勧めしますが、その配列への特別なアクセサーを作成することもお勧めします。

class MyCustomDataStore
{ 
  bool[] array;
  int sizex, sizey, sizez;

  MyCustomDataStore(int x, int y, int z) {
    array=new bool[x*y*z];
    this.sizex = x;
    this.sizey = y;
    this.sizez = z;
  }

  bool get(int px, int py, int pz) {
    // change the order in whatever way you iterate
    return  array [ px*sizex*sizey + py*sizey + pz ];
  }

}
于 2013-04-15T12:47:34.350 に答える
1

z-size <= 64のlongの配列でdariuszのソリューションを更新するだけです

edit2: '<<' バージョンに更新、サイズは 128x128x64 に固定

class MyCustomDataStore
{
     long[] array;

     MyCustomDataStore() 
     {
          array = new long[128 | 128 << 7];
     }

     bool get(int px, int py, int pz) 
     {
          return (array[px | (py << 7)] & (1 << pz)) == 0;
     }

     void set(int px, int py, int pz, bool val) 
     {
          long mask = (1 << pz);
          int index = px | (py << 7);
          if (val)
          {
               array[index] |= mask;
          }
          else
          {
               array[index] &= ~mask;
          }
     }
}

編集: パフォーマンス テスト: 128x128x64 の塗りつぶしと読み取りを 100 回使用

long: 9885ms, 132096B
bool: 9740ms, 1065088B
于 2013-04-15T13:16:54.550 に答える