Bulduğum ilginç bir soru, bir NxN matrisinin 90 derece yerinde yerinde döndürülmesini istedi. Yinelemeli çözümüm C içinde. Ancak diğer çözümlere baktığımda, çoğu zaman görevi yerine getirmek için yuvalanmış bir for
döngüsünü kullandı (ki bu iyi çalışıyor gibi görünüyor). Yuvalanmış döngü uygulamaları, O(n^2)
zamanında çalışır.Yerinde Matris Dönüşü
bakınız: How do you rotate a two dimensional array?
Ben özyinelemeli çözüm de O(n^2)
olduğunu O((n^2-n)/2)
, çalışır inanıyoruz. Sorum şu iki kat. 1) Karmaşıklık analizim, hem özyinelemeli hem de özyinelemeyen çözümler için doğrudur ve 2) Bulmadığım bir matrisi döndürmek için bazı yüksek verimli veya akıllıca bir yol var mı?
TIA. Tüm eleman takas için gereken olarak
#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;
}
izler, bu yüzden hiç (n^2) O daha azını nasıl olabilir görmek zor. –
Bu çözümü özensiz olarak adlandırıyorum. Son çağrıyı bir "goto" ile değiştirebilirsiniz ... –