Java 难以理解两个嵌套for循环如何仍然具有O(n)运行时
我有下面一段解决方案代码来向右旋转图像 它首先转置矩阵,然后在垂直轴上翻转:Java 难以理解两个嵌套for循环如何仍然具有O(n)运行时,java,algorithm,matrix,big-o,space-complexity,Java,Algorithm,Matrix,Big O,Space Complexity,我有下面一段解决方案代码来向右旋转图像 它首先转置矩阵,然后在垂直轴上翻转: public static void rotateSquareImageCW(int[][] matrix) { transposeMatrix(matrix); flipVerticalAxis(matrix); } public static void transposeMatrix(int[][] matrix) { int n = matrix.length - 1;
public static void rotateSquareImageCW(int[][] matrix) {
transposeMatrix(matrix);
flipVerticalAxis(matrix);
}
public static void transposeMatrix(int[][] matrix) {
int n = matrix.length - 1;
int temp = 0;
for(int i = 0; i <= n; i++){
for(int j = i+1; j <= n; j++){
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
private static void flipVerticalAxis(int[][] matrix) {
int n = matrix.length - 1;
int temp = 0;
for(int i = 0; i <= n; i++){
for(int j = 0; j <= n/2; j++){
temp = matrix[i][j];
matrix[i][j] = matrix[i][n-j];
matrix[i][n-j] = temp;
}
}
}
publicstaticvoidrotatesquareimagecw(int[][]矩阵){
转置矩阵(矩阵);
垂直轴(矩阵);
}
公共静态void transpossematrix(int[][]矩阵){
int n=矩阵长度-1;
内部温度=0;
对于(int i=0;i,正如注释中已经指出的,它取决于O(n)
表达式中n
的定义
最合理的定义是n
表示矩阵的宽度或高度。这与各种矩阵算法分析一致,并且代码使用了一个名为n
的变量,该变量的含义正好相同
代码仅使用一组固定的附加存储元素,即i
、j
、n
和temp
,因此它是恒定空间(不计算预先存在的矩阵
),意味着O(1)
空间复杂性
这两个嵌套循环分别迭代n
(或n/2
)元素,因此您完全正确,这意味着O(n²)
所以,它是空间和时间复杂度。那么,这里O(n)中的“n”是什么?如果n是矩阵中的元素数,那么它就有O(n)时间复杂度。如果n是矩阵的宽度(=高度),那么它就是O(n^2)。如果n总是相同的数(一个常数)那么作者是对的,它是O(1)时间,但他是错的,它是O(n)空间。对于变量n,这段代码在O(n^2)时间内运行,n定义为矩阵中的行数