在使用排列时,我遇到了这个问题。我收到错误消息:
线程“ main”中的异常java.lang.OutOfMemoryError:Java堆空间
这显然是因为列表不能容纳那么多信息。我该如何解决这个问题?我应该将列表分成更多列表,以便保留信息吗?我没有给出任何代码,因为有很多方法可以实现。
答案 0 :(得分:1)
这是一个懒惰地枚举排列的实现:
def insertions[X](xs: List[X], y: X): Iterable[List[X]] = {
val n = xs.size
for (i <- 0 to n) yield {
val (a, b) = xs.splitAt(i)
a ++ (y :: b)
}
}
def permutations[X](elems: List[X]): Stream[List[X]] = elems match {
case Nil => Stream(Nil)
case h :: t => permutations(t).flatMap(insertions(_, h))
}
例如,
permutations((0 to 10).toList) foreach println
将打印Stream
的所有元素。
编辑
这个问题似乎暗示List.permutations
是以某种幼稚的方式实现的,它需要太多的内存,但事实并非如此:标准库中的实现还生成了一个迭代器,该迭代器逐一生成置换。因此,一个人只能使用
myList.permutations
相反。只需确保不会尝试一次将所有这些元素保存在列表中即可。