我有一个多维数组:

val M = Array.ofDim[Int](V, N)


目标是找到存在有界元素0
目前,我有此代码片段可以正常工作,但想知道是否有更好,更有效的方法来执行此操作。

M.zipWithIndex.reverse.collectFirst({
  case (arr, ind) if arr.exists(a => a <= W && a > 0) => {
    arr.zipWithIndex.find(a => a._1 <= W && a._1 > 0) match {
      case Some((weight, ind2)) => (ind, ind2, weight)
    }
  }
})

最佳答案

在这里使用命令式或递归式解决方案确实会更好。我将编写一个递归代码:

def finder(arr: Array[Array[Int]], w: Int, i: Int = 0, j: Int = 0): Option[(Int,Int,Int)] = {
  val ri = arr.length-i-1
  if (i >= arr.length) None
  else if (arr(ri)(j) > 0 && arr(ri)(j) < w) Some(ri,j,arr(ri)(j))
  else if (j+1 < arr(i).length) finder(arr,w,i,j+1)
  else finder(arr,w,i+1)
}


然后finder(M,W)应该做您想要的。请注意,这也是有效的-除了返回值外,不要装箱。



编辑-如果您关心性能,以下是100x100阵列上现有解决方案的运行时间,该解决方案没有解决方案,也没有一种解决方案的运行距离终点为77%(即,运行时间应约为1/4):

Original without answer:     65 μs / iteration
Original with answer at 1/4: 18 μs / iteration


结果表与原始方法相比,花费的相对时间(更低的速度更快,使用-optimise进行编译,但几乎没有区别):

                  No Answer    1/4 Answer
Original            1.00          1.00
Rex                 0.55          0.72
4e6                 1.95          7.00
missingfaktor       2.41          1.91
Luigi               4.93          3.92


因此,除了递归方法外,您的原始方法实际上比所有建议都快。

09-10 20:34