加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

所以你的原始方法实际上比所有的建议更快,除了递归的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读