我正在写一个函数来确定一个列表的幂集的个数。在处理了这个问题并解决了它之后,我发现了集的长度和powerset的数量之间的关系。
2^我
其中i是列表的长度。
此公式适用于:
Powers.powers(new int[]{}); // 1
Powers.powers(new int[]{1}); // 2
Powers.powers(new int[]{1,2}); // 4
Powers.powers(new int[]{1,2,3,4}); // 16
利用这些信息,我写出了以下代码:
if(list.length == 1) return BigInteger.valueOf(2);
if(list.length == 0) return BigInteger.valueOf(1);
return BigInteger.valueOf((long)Math.pow(2, list.length));
在最初的几个测试中,它工作得很好,直到它在数组长度为100时打嗝为止。幸运的是,它确实计算了正确的值,即1.2676506e+30,但是arraysize 100的预期功率集数是:9223372036854775807。
编辑:将公式调整为2^i,为了澄清我理解计算是如何工作的,我只是不理解测试用例期望9223372036854775807的方式或原因。它传递一个长度为100的数组,除索引99的值为100外,所有值都为0。
1条答案
按热度按时间eoxn13cs1#
你是说
2 ^ n
,不是4 ^ (n/2)
. 其实是一样的。它很容易用
BigInteger
,无溢出风险:测试
输出
更新:如果可能存在重复值,则会变得稍微复杂一些:
测试
输出