striker159
Lt. Junior Grade
- Registriert
- Dez. 2008
- Beiträge
- 327
Ich habe ein dynamisches Programm mit einem n-dimensionalen Array, das ich füllen will. Auf die genaue Dimension habe ich mich noch nicht festgelegt, wird aber wohl ca 5 sein.
Die Abhängigkeit ist durch die Manhatten Distanz zum Ursprung gegeben. Für Einträge mit Manhatten Distanz D müssen die Einträge mit Distanz D-1 bekannt sein.
Das Array fülle ich demnach in Ebenen mit gleicher Manhatten Distanz der Elemente.
Nun bin ich auf der Suche nach einem Weg, die Anzahl an Iterationen zu verringern. Denn zb mit einem 50x50x50 Array habe ich in der aktuellen Version 122500 unnötige Iterationen (misses im code), also knapp 50% overhead.
Wie kann das speziell bei 3 Dimensionen, oder auch allgemein bei n Dimensionen verbessert werden?
Kann es verbessert werden?
Die Abhängigkeit ist durch die Manhatten Distanz zum Ursprung gegeben. Für Einträge mit Manhatten Distanz D müssen die Einträge mit Distanz D-1 bekannt sein.
Das Array fülle ich demnach in Ebenen mit gleicher Manhatten Distanz der Elemente.
Nun bin ich auf der Suche nach einem Weg, die Anzahl an Iterationen zu verringern. Denn zb mit einem 50x50x50 Array habe ich in der aktuellen Version 122500 unnötige Iterationen (misses im code), also knapp 50% overhead.
Wie kann das speziell bei 3 Dimensionen, oder auch allgemein bei n Dimensionen verbessert werden?
Kann es verbessert werden?
Code:
const int MAX_X_DIM = 50;
const int MAX_Y_DIM = 50;
const int MAX_Z_DIM = 50;
const int MAX_X_INDEX = MAX_X_DIM - 1;
const int MAX_Y_INDEX = MAX_Y_DIM - 1;
const int MAX_Z_INDEX = MAX_Z_DIM - 1;
const int MAX_PLANE = MAX_X_INDEX + MAX_Y_INDEX + MAX_Z_INDEX;
int misses = 0;
int data[MAX_X_DIM][MAX_Y_DIM][MAX_Z_DIM];
memset(&data,0,MAX_X_DIM*MAX_Y_DIM*MAX_Z_DIM);
for(int plane = 0; plane <= MAX_PLANE; ++plane){
int maxX = plane;
maxX = min(maxX, MAX_X_INDEX);
for(int x = 0; x <= maxX; ++x){
int maxY = plane - x;
maxY = min(maxY, MAX_Y_INDEX);
for(int y = 0; y <= maxY; ++y){
int z = plane - x - y;
if(z <= MAX_Z_INDEX && x + y + z == plane){
//do stuff
// berechne data[x][y][z] aus data[x-1][y][z], data[x][y-1][z] und data[x][y][z-1]
}else{
++misses;
}
}
}
}
cout << "misses : " << misses << endl;
Zuletzt bearbeitet: