我有一个问题,关于这段代码的最佳情况和大O表示法的最坏情况。在我看来,这两种情况都应为O(n ^ 3),但有些人不同意。
public int [][] multiply (int [][] A, int
[][] B, int n) {
int [][] C = new int[n][n]; - 1 ( ignored )
for(int i=0; i<n; i++) { - n
for(int j=0; j<n; j++) { - n
if(A[i][j ]!=0) { - 1 ( ignored )
for (int k=0; k<n; k++) { - n
C[i][k] += A[i][j]*B[j][k]; -
}
}
}
}
return C;
}
答案 0 :(得分:0)
在平均和最差情况下,矩阵乘法确实需要O(n ^ 3)时间才能运行。对于分别为m x n和n x p的2个矩阵,将总共进行m n p个计算(为简单起见,为n ^ 3个),在所得矩阵中的每个条目对应一个。最好的情况是,当程序看到至少一个矩阵为零矩阵(矩阵中的所有条目均为0)时,取决于程序执行的操作。如果可以找到零矩阵,则可以使程序短路。在这种情况下,运行时间将为O(n ^ 2)(最多只需扫描几个n x n矩阵),这是矩阵乘法可以实现的最佳时间。如果无法使用此优化,则无论如何该程序都将以O(n ^ 3)运行。无论哪种方式,由于Big-O表示法的定义,您仍然可以说最好的情况是O(n ^ 3),但这对大多数人来说并不重要。