无论如何要对 15 个大小为 5 的整数集进行笛卡尔积吗?似乎图书馆抛出异常错误:笛卡尔积太大!
问问题
781 次
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 回答