如何计算所有可能的案例?

时间:2017-12-13 01:05:02

标签: java algorithm

例如,我有长度为n = 3的数组:

for(int i = 0; i < n; i++) {
    array[i] = i;
}

所以案件应该是:

1. 0
2. 1
3. 2
4. 0 1
5. 0 2
6. 1 2
7. 0 1 2

因此n = 3时病例数应为7。 在我的代码中:

int n = 3;
int[] array = new int[n];
for (int i = 0; i < n; i++) {
    array[i] = i;
}
int sum = 0;

for (int i = 0; i < n; i++) {
    System.out.println(array[i] + " ");
    sum++;
    for (int j = i; j < n; j++) {
        System.out.print(array[j] + " ");
    }
    System.out.println();
    sum++;
}
System.out.println("sum = " + sum);

输出是:

0 
0 1 2 
1 
1 2 
2 
2 
sum = 6

数字2是两次,所以它是错误的,总和实际上是= 5.而且我没有得到案件

4. 0 1 
and 
5. 0 2

如何计算所有可能的案例?

1 个答案:

答案 0 :(得分:1)

设置,而不是数组

第一个重要的注意事项是你不是在这里使用固定长度数组,而是使用不同长度的设置

看看你的例子。你允许

0
1
2
0, 1
0, 2
1, 2

不是全部大小3

另外,你不能区分

0, 1
1, 0

所以顺序并不重要,例如

电源设置

这就是你在这里实际描述power sets的原因。对于示例集{0, 1, 2},其功率集定义为

P({0, 1, 2}) = {
    {}, // empty set
    {0},
    {1},
    {2},
    {0, 1},
    {0, 2},
    {1, 2},
    {0, 1, 2}
}

幸运的是,它们的大小有一个简单的封闭公式。如果n是输入集的大小,则功率集的大小为

2^n

但他们也会计算空集,因此如果您不想要,则需要-1

2^n - 1

解决方案

因此在Java中你可以编写

int Set<Integer> input = ...
int size = (int) Math.pow(2, input.size()) - 1;

全部,您不需要手动构建内容。

但是,如果您有点好奇并想要构建它们,请查看Obtaining a powerset of a set in Java之类的问题。它是维基百科上显示的递归公式的实现。

所以,完全没效率,但也在工作:

int Set<Integer> input = ...

// Build the power-set using the method from linked question
Set<Set<Integer>> power = powerSet(input);

int size = power.size() - 1;