Une question intéressante que j'ai trouvée, a demandé qu'une matrice NxN soit pivotée, en place de 90 degrés. Ma solution récursive, en C, est ci-dessous. Cependant, lorsque j'ai recherché d'autres solutions, la plupart utilisaient une boucle imbriquée for
pour accomplir la tâche (ce qui semble fonctionner correctement). Les implémentations en boucle imbriquées semblent fonctionner en O(n^2)
heure.Rotation matricielle en place
Voir: How do you rotate a two dimensional array?
Je crois que la solution récursive fonctionne dans O((n^2-n)/2)
, qui est O(n^2)
aussi bien. Ma question est double. 1) L'analyse de complexité ci-dessus est-elle correcte pour les solutions récursives et non récursives, et 2) Y a-t-il un moyen très efficace ou intelligent de faire pivoter une matrice que je n'ai pas trouvée?
TIA.
#include <stdio.h>
#include <stdlib.h>
int SIZE = 0;
/**
* In-place, recursive, clockwise, 90 degree matrix rotation.
*/
static void rotate_in_place(int matrix[][SIZE], int n)
{
if(n < 2)
return;
int temp1, temp2;
for(int i = 0; i < (n-1); i++)
{
temp1 = matrix[i][n-1];
matrix[i][n-1] = matrix[0][i];
temp2 = matrix[n-1][n-i-1];
matrix[n-1][n-i-1] = temp1;
temp1 = matrix[n-i-1][0];
matrix[n-i-1][0] = temp2;
matrix[0][i] = temp1;
}
matrix = ((int*)matrix) + SIZE + 1;
n -= 2;
rotate_in_place(matrix, n);
}
static void print_matrix(int matrix[][SIZE])
{
printf("\n");
for(int i = 0; i < SIZE; i++)
{
for(int j = 0; j < SIZE; j++)
printf("%4i ", matrix[i][j]);
printf("\n");
}
}
int main()
{
// Create some matrices and rotate them.
//
int matrices = 10;
for(int i = 2; i < matrices; i++)
{
int matrix[i][i];
int count = 0;
for(int j = 0; j < i; j++)
for(int k = 0; k < i; k++)
matrix[j][k] = ++count;
printf("\n\nRotating %ix%i matrix.\n", i, i);
SIZE = i;
printf("\nOriginal matrix.\n");
print_matrix(matrix);
rotate_in_place(matrix, i);
printf("\n\nRotated matrix.\n");
print_matrix(matrix);
}
return EXIT_SUCCESS;
}
Vous devez déplacer les éléments n * n à de nouveaux endroits, donc il est difficile de voir comment il pourrait jamais être moins que O (n^2). –
J'appellerais à peine cette solution récursive. Vous pouvez remplacer trivialement l'appel final par un 'goto' ... –