0

无论如何要对 15 个大小为 5 的整数集进行笛卡尔积吗?似乎图书馆抛出异常错误:笛卡尔积太大!

4

1 回答 1

1

错误消息解释了该问题:

IllegalArgumentException: Cartesian product too large; must have size at most Integer.MAX_VALUE

15 个 5 长度集合的笛卡尔积产生 5^15 个不同的结果,即 30,517,578,125。因为 aSet不能有一个size()大于Integer.MAX_VALUE它不可能(正确)返回这么大的集合。正如 Louis Wasserman 所指出的,您不太可能真的想要对如此大量的结果进行操作,因为无论您如何构建 300 亿个列表都是昂贵的。您最好的选择可能是重新检查问题,看看是否有一些解决方案可以避免构建如此多的结果。

如果您实际上不需要Set语义,您当然可以使用嵌套的 for 循环一一简单地构造所有笛卡尔集(如文档中所述):

for (B b0 : sets.get(0)) {
  for (B b1 : sets.get(1)) {
    ...
    ImmutableList<B> tuple = ImmutableList.of(b0, b1, ...);
    // operate on tuple
  }
}

但是当然不要尝试将它们全部存储在一个集合中 - 当您超过集合的最大大小(或您的堆空间)时,您会收到错误消息。

于 2017-03-23T08:39:46.633 回答