【问题标题】:Java loop over half of arrayJava循环遍历数组的一半
【发布时间】:2011-10-21 01:40:29
【问题描述】:

我想在 Java 中循环一个数组的一半;这是因为矩阵将是完全对称的。如果我循环抛出 i 列和 j 行,每次我对 matrix[i][j] 执行操作时,我都会对 matrix[j][i] 执行完全相同的操作。我应该能够通过不循环超过一半的矩阵来节省时间。对最简单的方法有什么想法吗?

【问题讨论】:

    标签: java loops matrix


    【解决方案1】:

    如果你想得到一个三角形:

    for(int i=0; i<array.length; i++){
      for(int j=0; j<=i; j++){
        ..do stuff...
      }
    }
    

    【讨论】:

    • 不要忘记在主对角线(matrix[i][i])的 j 循环之外做一些事情。
    【解决方案2】:
    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一次。

    【讨论】:

    • 你有 i > 尺寸。看起来它现在已经修复了。
    • 这显然也是一个不起作用的循环。下次访问 stackoverflow 时,我一定会带上我的水晶球。
    • 人们回答 SO 的原因并不是为了让问题海报可以剪切并粘贴到他们的 IDE 中。它是给出一个关于如何解决问题的想法。如果您正在寻找经过校对的可编译代码,请找保姆。
    • 其他人的代码都编译得很好。把它合二为一并测试出来有那么难吗?
    【解决方案3】:
    for(int i = 0; i<array.length; i++){
      for(int j = 0; j < array[i].length - i; j++){
         // operation here
      }
    }
    

    【讨论】:

    • 有趣。这是否与 Andreas 相同,但三角形指向不同的方向?
    • 基本上是的。我忘记了矩阵中对角线的走向,所以从技术上讲这是不正确的。
    【解决方案4】:

    也许我在这里遗漏了一些东西,但是假设您有两个数组分别代表您的行和列,并假设它是对称的(如您所说):

    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]);
    }
    

    此解决方案具有运行时复杂性优势,即仅迭代一个循环而不是两个循环。

    【讨论】:

    • 这段代码似乎只在右上角到左下角对角线上的每个项目上运行 DoSomething ......两次。我认为目的是对“下方”矩阵中的每个项目运行 DoSomething,包括对角线
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2014-06-04
    相关资源
    最近更新 更多