2017-01-07 9 views
-1

私はHashMap、Listなどを使用する必要がありますか?

  1. 店舗のキーと値のペアのリスト(シナリオ、listOfResults)
  2. がランダムに新しいシナリオをシミュレートし、シナリオがであるかどうかを確認するために、結果に
  3. 小切手を見つけたプログラムを書いていますキーと値のペア
  4. その場合のリストは、新しい結果が
  5. そうでない場合は、リストに追加されるように、そのキーと値のペアを更新キーと値のペアのリストに、シナリオ、結果のペアを追加します
  6. ステップ2〜5を繰り返します。

現在、私はHashMapを使用しています。これは、キー値システムが意味を成しているからです。ただし、計算には非常に時間がかかるようで、異なるデータ構造が適切かどうかを検討しています。

100シナリオをシミュレートすると8.623秒かかって、4,600のキーと値のペアを持つHas​​hMapを残しました。

200のシナリオをシミュレートすると42.690秒かかり、9,431のキーと値のペアを持つHas​​hMapを残しました。

時間が指数関数的に増加している間、キーと値のペアの数は直線的に増加しており、すぐに制御不能になります。プログラムをさらに最適化できるかもしれませんが、間違ったデータ構造を使用していますか?

更新:私の問題は私のhashcode()メソッドにあると思われます。ここにある:

@Override 
public int hashCode() { 
    int result = 31 + legalBoard; 
    result = result*31 + playerToMove; 
    result = result*31 + Arrays.hashCode(getSmallestFieldConfiguration()); 
    //System.out.println("Hashcode: " + result + " ---------- " + Arrays.toString(field)); 
    return result; 
} 

legalBoardplayerToMove間-1および8 INTのいずれかであり、-1または1 field、値-1、0とINT [81]であり、そして1 getSmallestConfiguration()方法が発見されていますアレイのすべての可能な反射/回転のうち最小配列、ここに示されているように:

パブリッククラスMatrixTransformations { 公共:

public int[] getSmallestFieldConfiguration(){  
    int[] smallestConfig = field; 
    for(int[] config : getAllOtherFieldConfigurations()){ 
     if(isGreater(smallestConfig, config)){ 
      smallestConfig = config; 
     } 
    } 
    return smallestConfig; 
} 

public int[][] getAllOtherFieldConfigurations(){ 
    int[][] configs = new int[7][]; 
    int[][] twoDimensionalField = new int[][]{ 
     {field[0],field[1],field[2],field[3],field[4],field[5],field[6],field[7],field[8]}, 
     {field[9],field[10],field[11],field[12],field[13],field[14],field[15],field[16],field[17]}, 
     {field[18],field[19],field[20],field[21],field[22],field[23],field[24],field[25],field[26]}, 
     {field[27],field[28],field[29],field[30],field[31],field[32],field[33],field[34],field[35]}, 
     {field[36],field[37],field[38],field[39],field[40],field[41],field[42],field[43],field[44]}, 
     {field[45],field[46],field[47],field[48],field[49],field[50],field[51],field[52],field[53]}, 
     {field[54],field[55],field[56],field[57],field[58],field[59],field[60],field[61],field[62]}, 
     {field[63],field[64],field[65],field[66],field[67],field[68],field[69],field[70],field[71]}, 
     {field[72],field[73],field[74],field[75],field[76],field[77],field[78],field[79],field[80]}, 
    }; 
    /*for(int i=0; i<81; i++){ 
     twoDimensionalField[i%9][i/9] = field[i]; 
    }*/ 

    //Reflections 
    configs[0] = getFieldFromMatrix(MatrixTransformations.reflectVertical(twoDimensionalField)); 
    configs[1] = getFieldFromMatrix(MatrixTransformations.reflectHorizontal(twoDimensionalField)); 
    //Rotations 
    int[][] singleRotation = MatrixTransformations.rotate(twoDimensionalField); 
    configs[2] = getFieldFromMatrix(singleRotation); 
    int[][] doubleRotation = MatrixTransformations.rotate(twoDimensionalField); 
    configs[3] = getFieldFromMatrix(doubleRotation); 
    configs[4] = getFieldFromMatrix(MatrixTransformations.rotate(doubleRotation)); 
    //Transpositions 
    configs[5] = getFieldFromMatrix(MatrixTransformations.transpose(twoDimensionalField)); 
    configs[6] = getFieldFromMatrix(MatrixTransformations.transpose(doubleRotation)); 

    return configs; 
} 

MatrixTransformations方法は次のようになりMatrixTransformations(){}

public static int[][] reflectVertical(int[][] arr){ 
    for(int j=0; j<9; j++){ 
     for(int k=0; k<4; k++){ 
      int temp = arr[j][k]; 
      arr[j][k] = arr[j][3-k]; 
      arr[j][8-k] = temp; 
     } 
    } 
    return arr; 
} 
public static int[][] reflectHorizontal(int[][] arr){ 
    for(int j=0; j<4; j++){ 
     for(int k=0; k<9; k++){ 
      int temp = arr[j][k]; 
      arr[j][k] = arr[8-j][k]; 
      arr[8-j][k] = temp; 
     } 
    } 
    return arr; 
} 
public static int[][] transpose (int[][] array) { 
     if (array == null || array.length == 0)//empty or unset array, nothing do to here 
     return array; 

     int width = array.length; 
     int height = array[0].length; 

     int[][] array_new = new int[height][width]; 

     for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      array_new[y][x] = array[x][y]; 
     } 
     } 
     return array_new; 
    } 

public static int[][] rotate(int[][] arr){ 
    int[][] newArr = new int[9][9]; 
    for (int i = 0; i < 9; ++i) { 
     for (int j = 0; j < 9; ++j) { 
      newArr[i][j] = arr[8 - j][i]; 
     } 
    } 
    return newArr; 
} 
} 
+1

どうすればわかりますか?あなたはコードを投稿していません。コードは重要です。 –

+1

長い実行時間を含むコードを投稿する必要があります。この問題はおそらくマップではなく、コード内でどのように使用されているのか、その他のものがコード内にあるのでしょう。 – davidxxx

+0

davidxxxに同意します - (** very ** vague!)の説明に基づいて、野生の推測ではステップ4は高価です。リストを更新するのは高価なもののように聞こえるかもしれません**もし** list.contains(something)のようなものがあれば。他の操作はO(1)でなければなりません(少なくとも、適切に実装されていればリストしたもの) – Marco13

答えて

0

恐らくマップを貼るべきです。あなたのキーがシーケンシャルでない限り1,2,3乱数の9Kを使用すると、メモリの問題が十分でない場合があります。

+0

ありがとうございます。私の疑問は、私のリスト(置換機能)のステップ4が最も時間がかかることです。 map.put(key、map.get(key).getUpdatedKey(thingIHaveToAdd)))のようなものを使わずに、指定されたキーの値を「更新」する方法はありますか? – QuestionCactus

+0

前述のように、より多くのコードはより良いと言われていますが、ボトルネックはかなり特定されていますが、利用可能な構造を通過して痛みを最小限に抑えるためにはあまりにも多くの時間を費やす必要はありません。 – efekctive

+0

コード – QuestionCactus

関連する問題