【问题标题】:Looking for an efficient way to update multi-dimensional arrays寻找更新多维数组的有效方法
【发布时间】:2019-05-31 09:50:13
【问题描述】:

我更新了一个多维数组 (Y[i][t][k]) 的值。由于更新需要经过多次迭代,因此这部分代码的运行时间非常重要。我想知道是否有人知道如何以更有效的方式做到这一点。

以下是需要更新的部分。

double [][][] Y=new double [a.length][b.length][c.length];
for(int i=0;i<a.length;i++){
 for(int j=0;j<b;j++){
  for (int k=0; k<c.length; k++){
    if(i==w && j==r && k==u){// w, r and u can have any value.
      Y[i][j][k]=g;
     }else{
      Y[i][j][k]=f; 
     }
    }
  }
}

注意:

    a is int [][].
    b is int.
    c is int [][].
    q is double.
    YIN is double [][][].
    F is double.
    g=q*YIN[i][j][k]+(1-q)*(Y[i][j][k]-F)
    f=q*YIN[i][j][k]+(1-q)*(Y[j][j][k])

【问题讨论】:

  • 变量Y的数据类型是什么,gf以及abc是什么?请使用更完整的示例程序更新您的帖子。
  • 最小的改变是消除最内部循环中的if 语句,并仅遍历整个数组,将元素设置为f,然后在这样做之后,将Y[0][0][10] 设置为g 应该 c.length 大于 10。删除 if 语句可能会产生很大的不同,除非您的 java 编译器为您提升它。我会检查两种方式,看看是否有时差。
  • 如果“b 是 int”b.length 是什么?
  • 感谢您的观察。正确的。它是“b”而不是“b.length”。

标签: java arrays eclipse for-loop multidimensional-array


【解决方案1】:

您正在设置多维数组区域的每个元素,其成本与设置的元素数量成正比,因此没有理由认为您可以渐近做得更好。但是,通过使用批量操作方法以及在循环外处理特殊情况而不是在每次迭代时对其进行测试,您可能会获得一些速度提升。例如,

for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < b.length; j++) {
        Arrays.fill(Y[i][j], 0, c.length, f);
    }
}

if (c.length > 10) {
    Y[0][0][10] = g;
}

当然,这假设f 是一个常量表达式,或者至少它的每次评估都相等(在== 运算符的意义上)并且不会产生副作用。在这种情况下,使用批量复制代替批量设置可能会更好一些:

for (int i = 0; i < a.length; i++) {
    Arrays.fill(Y[i][0], 0, c.length, f);
    for (int j = 1; j < b.length; j++) {
        System.arraycopy(Y[i][0], 0, Y[i][j], 0, c.length);
    }
}

if (c.length > 10) {
    Y[0][0][10] = g;
}

如果表达式f 不满足上述要求,那么您能做的最好的可能就是将特殊情况从循环中取出,而不更改任何其他内容。对于某些表达式f 和/或g,即使这样也可能是不可能的,因为它可能会产生不等价的结果。例如,其中一个或两个都以某种相关方式是有状态的,例如通过柜台关闭。

【讨论】:

    【解决方案2】:

    据我了解,您的目标是将 Y[0][0][10] 设置为 g 并将其他元素设置为 f。

    那么忘记疯狂循环并像下面的代码那样做怎么样?

    Arrays.fill(Y, f);
    
    Y[0][0][10] = g;
    

    【讨论】:

    • 一个可以可能参与Arrays.fill(),但如果f的类型对于分配给Y[i][j][k]是正确的,那么它几乎肯定是不 i> 正确的做法是Arrays.fill(Y, f)
    • 如果c.length小于等于10怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2020-06-19
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多