我有一个List,我想从中提取子集。所以我做了
val l = List(1,2,4).toSet.subsets.toList
`这适用于小型列表,但在大型列表上失败。如何使子集调用并行?
我尝试制作清单' l'本身是并行的,但是对该列表的toSet调用返回一个没有子集调用的parSeq。我是否必须编写自己的子集算法?
感谢所有帮助。
答案 0 :(得分:1)
失败可能有两个原因:
两者都与同一个问题有关:你试图实现一个指数级增长的迭代器。
有一个很好的理由def subsets(): Iterator[Set[A]]
返回迭代器而不是列表 - 结果集可能很大。实际上数量
所有可能的子集都是2^n
:
scala> (1 to 10).toSet.subsets.size
res0: Int = 1024
scala> math.pow(2, 10)
res1: Double = 1024.0
如果你并行生成子集,你仍然会很快耗尽内存或无休止地等待。换句话说,这是一个算法问题,而不是并发/硬件问题。
解决这个问题的方法是在你去的时候使用延迟生成器(迭代器/流),而不是一次尝试获取所有数据。如果您更喜欢Stream
接口,则可以将返回的迭代器转换为stream:
scala> (1 to 10).toSet.subsets.toStream
res2: scala.collection.immutable.Stream[scala.collection.immutable.Set[Int]] = Stream(Set(), ?)
Streams只是惰性列表,因此数据结构本身没有太大差异,它应该符合您的要求。