【发布时间】:2011-10-21 01:40:29
【问题描述】:
我想在 Java 中循环一个数组的一半;这是因为矩阵将是完全对称的。如果我循环抛出 i 列和 j 行,每次我对 matrix[i][j] 执行操作时,我都会对 matrix[j][i] 执行完全相同的操作。我应该能够通过不循环超过一半的矩阵来节省时间。对最简单的方法有什么想法吗?
【问题讨论】:
我想在 Java 中循环一个数组的一半;这是因为矩阵将是完全对称的。如果我循环抛出 i 列和 j 行,每次我对 matrix[i][j] 执行操作时,我都会对 matrix[j][i] 执行完全相同的操作。我应该能够通过不循环超过一半的矩阵来节省时间。对最简单的方法有什么想法吗?
【问题讨论】:
如果你想得到一个三角形:
for(int i=0; i<array.length; i++){
for(int j=0; j<=i; j++){
..do stuff...
}
}
【讨论】:
for (i = 0;i < size; ++i) {
for (j = 0; j < i; ++j) {
result = do_operation(i,j);
matrix[i][j] = result;
matrix[j][i] = result ;
}
}
所以你只为每一对调用操作方法do_operation一次。
【讨论】:
for(int i = 0; i<array.length; i++){
for(int j = 0; j < array[i].length - i; j++){
// operation here
}
}
【讨论】:
也许我在这里遗漏了一些东西,但是假设您有两个数组分别代表您的行和列,并假设它是对称的(如您所说):
int dimension = rows.Length;
for(int i=0; i<dimension; i++)
{
int j = (dimension-1) - i; //need dimension-1 to avoid an off-by-one error
DoSomething(matrix[i][j]);
DoSomehting(matrix[j][i]);
}
此解决方案具有运行时复杂性优势,即仅迭代一个循环而不是两个循环。
【讨论】: