Estoy estudiando esta pieza de código al rotar una matriz NxN; He trazado el programa innumerables veces, y entiendo cómo ocurre la rotación real. Básicamente gira las esquinas primero y los elementos después de las esquinas en el sentido de las agujas del reloj. Simplemente no entiendo un par de líneas, y el código todavía no está "dirigido a casa" en mi cerebro, por así decirlo. Por favor ayuda. Lo estoy girando 90 grados, con una matriz de 4x4 como mi ejemplo de rastreo.Rotar una matriz bidimensional en 90 grados
[1][2][3][4]
[5][6][7][8]
[9][0][1][2]
[3][4][5][6]
convierte
[3][9][5][1]
[4][0][6][2]
[5][1][7][3]
[6][2][8][4]
public static void rotate(int[][] matrix, int n){
for(int layer=0; layer < n/2; ++layer) {
int first=layer; //It moves from the outside in.
int last=n-1-layer; //<--This I do not understand
for(int i=first; i<last;++i){
int offset=i-first; //<--A bit confusing for me
//save the top left of the matrix
int top = matrix[first][i];
//shift left to top;
matrix[first][i]=matrix[last-offset][first];
/*I understand that it needs
last-offset so that it will go up the column in the matrix,
and first signifies it's in the first column*/
//shift bottom to left
matrix[last-offset][first]=matrix[last][last-offset];
/*I understand that it needs
last-offset so that the number decreases and it may go up the column (first
last-offset) and left (latter). */
//shift right to bottom
matrix[last][last-offset]=matrix[i][last];
/*I understand that it i so that in the next iteration, it moves down
the column*/
//rightmost top corner
matrix[i][last]=top;
}
}
}
Estoy de acuerdo que es un método más fácil, pero ¿no sería mucho menos eficiente para matrices pequeñas? La transposición de la matriz mueve los elementos a la fila correcta, pero la columna incorrecta, que requiere una corrección posterior. El algoritmo de OP mueve los elementos a la fila y columna correctas en el primer intento (menos asignaciones en total). Estoy ignorando localidad en esta comparación ya que no es un problema para matrices pequeñas. Para matrices grandes, es posible que deseemos alterar el orden de las asignaciones en el algoritmo de OP y optimizar la transposición en este algoritmo. –
@ Nathan: ambos métodos realizan la misma cantidad de cargas de memoria y asignaciones de memoria (recuerde que el swap temporal generalmente será un registro, así como también 'top' en el código de OP). Este es simple y legible, y probablemente más eficiente que el propuesto, que no aborda los datos contiguamente. –