arrays – 在Scala中检索多维数组中有界元素的最大索引
发布时间:2020-12-16 18:11:07 所属栏目:安全 来源:网络整理
导读:我有一个多维数组: val M = Array.ofDim[Int](V,N) 目标是找到存在有界元素0 0的最大V维度索引. w0 = W并返回索引和元素值. 目前我有这个代码片段可以工作,但想知道是否有更好,更有效的方法来做到这一点. M.zipWithIndex.reverse.collectFirst({ case (arr,
我有一个多维数组:
val M = Array.ofDim[Int](V,N) 目标是找到存在有界元素0 <0的最大V维度索引. w0< = W并返回索引和元素值. 目前我有这个代码片段可以工作,但想知道是否有更好,更有效的方法来做到这一点. 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,i+1) } 然后发现者(M,W)应该做你想做的事.请注意,这也是有效的 – 除了返回值之外没有拳击. 编辑 – 如果你关心性能,这里是100×100阵列上现有解决方案的运行时间,它在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 所以你的原始方法实际上比所有的建议更快,除了递归的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |