我有一个多维数组:
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
因此,除了递归方法外,您的原始方法实际上比所有建议都快。