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

Scala列表的上三角循环习语

发布时间:2020-12-16 18:20:19 所属栏目:安全 来源:网络整理
导读:从命令式编程的背景来看,我已经习惯了 for (i = 0; i 1000000; i++) { for (j = i + 1; j 1000000; j++) { doSomething(array[i],array[j]) }} 检查百万元素数组中的所有唯一对. doSomething是一些操作,在对角线上产生对角线和对称或反对称结果的微不足道的
从命令式编程的背景来看,我已经习惯了

for (i = 0;  i < 1000000;  i++) {
    for (j = i + 1;  j < 1000000;  j++) {
        doSomething(array[i],array[j])
    }
}

检查百万元素数组中的所有唯一对. doSomething是一些操作,在对角线上产生对角线和对称或反对称结果的微不足道的结果 – 这就是为什么我只想在上三角形上工作. (这里有一个小变体,其中i == j的情况很有趣;这很容易解决.)

我发现自己奇怪地试图在Scala中做这件事.我有一个大型列表,并希望对所有成对组合做一些事情,但是

list.flatMap(x => list.map(y => doSomething(x,y))

包括所有冗余或琐碎的案例(两个太多的工作因素)和

(0 until 1000000).flatMap({i =>
  (0 until 1000000).map({j =>
    doSomething(list(i),list(j))
  })
})

会是非常错误的,因为列表不是随机访问(N ^ 2因子太多的工作).我可以将我的列表转换为数组,但感觉它错过了重点.列表是链接列表,因此我的命令示例中的j 1元素距离我正在检查的i只有一步之遥.我敢肯定我可以用C / Python /中的链接列表编写一个有效的上三角循环.

我想我现在可以吞下两个因子,但这是一个常见的情况,因为感觉应该有一个很好的解决方案.

此外,这个“上三角形环”是否有一个共同的名称?我找不到一个好的搜索字符串.

编辑:这是一个糟糕的解决方案的例子:

list.zipWithIndex.flatMap({case (x,i) =>
  list.zipWithIndex.map({case (y,j) =>
    if (j > i)
      doSomething(x,y)
    else
      Nil
  })
})

因为它仍然访问不需要的节点.

解决方法

您可能希望查看 Vector数据类型,它允许基于快速索引的查找.

此外,还有一个内置的组合方法,可以为您提供您正在寻找的样子.

scala> (1 to 3).combinations(2).mkString(" ")
res1: String = Vector(1,2) Vector(1,3) Vector(2,3)

(编辑:李大同)

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

    推荐文章
      热点阅读