番石榴谷歌代码笛卡尔



有办法在15个大小为5的整数集上做笛卡尔积吗?似乎库抛出了一个异常错误:笛卡尔积太大!

错误信息解释了这个问题:

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

15个5长度集合的笛卡尔积产生5^15个不同的结果,即30,517,578,125。因为Set不可能有大于Integer.MAX_VALUEsize(),所以不可能(正确地)返回这么大的集合。正如路易斯·沃瑟曼所指出的那样,你不太可能真的想对如此大量的结果进行操作,因为无论你怎么做,构建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
  }
}

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

相关内容

  • 没有找到相关文章

最新更新