使用置换的原因:线程“主”中的异常java.lang.OutOfMemoryError:Java堆空间

时间:2018-07-13 14:29:13

标签: scala out-of-memory heap permutation

在使用排列时,我遇到了这个问题。我收到错误消息:

  

线程“ main”中的异常java.lang.OutOfMemoryError:Java堆空间

这显然是因为列表不能容纳那么多信息。我该如何解决这个问题?我应该将列表分成更多列表,以便保留信息吗?我没有给出任何代码,因为有很多方法可以实现。

1 个答案:

答案 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

相反。只需确保不会尝试一次将所有这些元素保存在列表中即可。