私はHashMap、Listなどを使用する必要がありますか?
- 店舗のキーと値のペアのリスト(シナリオ、listOfResults)
- がランダムに新しいシナリオをシミュレートし、シナリオがであるかどうかを確認するために、結果に
- 小切手を見つけたプログラムを書いていますキーと値のペア
- その場合のリストは、新しい結果が
- そうでない場合は、リストに追加されるように、そのキーと値のペアを更新キーと値のペアのリストに、シナリオ、結果のペアを追加します
- ステップ2〜5を繰り返します。
現在、私はHashMapを使用しています。これは、キー値システムが意味を成しているからです。ただし、計算には非常に時間がかかるようで、異なるデータ構造が適切かどうかを検討しています。
100シナリオをシミュレートすると8.623秒かかって、4,600のキーと値のペアを持つHashMapを残しました。
200のシナリオをシミュレートすると42.690秒かかり、9,431のキーと値のペアを持つHashMapを残しました。
時間が指数関数的に増加している間、キーと値のペアの数は直線的に増加しており、すぐに制御不能になります。プログラムをさらに最適化できるかもしれませんが、間違ったデータ構造を使用していますか?
更新:私の問題は私の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;
}
legalBoard
playerToMove
間-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;
}
}
どうすればわかりますか?あなたはコードを投稿していません。コードは重要です。 –
長い実行時間を含むコードを投稿する必要があります。この問題はおそらくマップではなく、コード内でどのように使用されているのか、その他のものがコード内にあるのでしょう。 – davidxxx
davidxxxに同意します - (** very ** vague!)の説明に基づいて、野生の推測ではステップ4は高価です。リストを更新するのは高価なもののように聞こえるかもしれません**もし** list.contains(something)のようなものがあれば。他の操作はO(1)でなければなりません(少なくとも、適切に実装されていればリストしたもの) – Marco13