我發現一個有趣的問題,要求將NxN矩陣旋轉90度。 C中的遞歸解決方案如下。然而,當我查找其他解決方案時,大多數使用嵌套for
循環來完成任務(這似乎工作正常)。嵌套循環實現似乎在O(n^2)
時間內運行。原地矩陣旋轉
請參見: How do you rotate a two dimensional array?
我相信遞歸解決方案在O((n^2-n)/2)
,這是O(n^2)
以及運行。我的問題是雙重的。 1)我的複雜性分析是否正確的遞歸和非遞歸解決方案,以及2)是否有一些高效率或聰明的方法來旋轉我沒有找到的矩陣?
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;
}
你必須離開N * N元素到新的位置,所以很難看到它怎麼可能在爲O任何減少(N^2)。 – 2011-05-05 20:57:35
我幾乎不會稱這個解決方案遞歸。你可以用一個「goto」來代替最後的呼叫... – 2011-05-05 21:15:15