【发布时间】:2013-09-09 21:13:28
【问题描述】:
从我的命令式编程背景来看,我已经习惯了
for (i = 0; i < 1000000; i++) {
for (j = i + 1; j < 1000000; j++) {
doSomething(array[i], array[j])
}
}
检查一百万个元素数组中的所有唯一对。 doSomething 是一些在对角线和对称或反对称的对角线结果上产生微不足道结果的操作——这就是我只想处理上三角形的原因。 (i == j 的情况很有趣;这很容易解决。)
我发现自己奇怪地被困在 Scala 中尝试这样做。我有一个很大的List 并且想对所有成对组合做点什么,但是
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 的工作量太大)。我可以将我的Lists 转换为Arrays,但感觉好像没有抓住重点。 Lists 是链表,所以我的命令式示例中的 j + 1 元素距离我目前正在检查的 i 仅一步之遥。我确信我可以在 C/Python/whatever 中的链表上编写一个高效的上三角循环。
我想我现在只能吞下 2 的因素,但这是一种很常见的情况,感觉应该有一个很好的解决方案。
另外,这个“上三角环”有一个通用名称吗?我找不到合适的搜索字符串。
编辑:下面是一个错误解决方案的例子:
list.zipWithIndex.flatMap({case (x, i) =>
list.zipWithIndex.map({case (y, j) =>
if (j > i)
doSomething(x, y)
else
Nil
})
})
因为它仍然会访问不需要的节点。
【问题讨论】:
标签: scala nested-loops functor