部分排列重复。列出所有解算法

时间:2014-06-06 10:43:30

标签: arrays algorithm permutation partial

我将寻求您最好的建议和建议。我对不同的盒子和物体有问题。

让我解释一下:例如,我有2个盒子和3个物体。所以我用2 ^ 3 = 8种可能的解决方案来计算所有解决方案。方框列表{-1, 0}。对象列表{0, 1, 2}

我对一个解决方案的表示:一个数组[objects.length]

1 solution : [-1,-1,-1];
2 solution : [0,-1,-1];
3 solution : [-1,0,-1];
4 solution : [-1,-1,0];
5 solution : [0,0,-1];
6 solution : [-1,0,0];
7 solution : [0,-1,0];
8 solution : [0,0,0];

现在我提出的算法不起作用:

Array box = {-1, 1}
Array object = {0, 1, 2}
Array solutions = {}

// INITIALISATION
Stack sbox = box;
Stack sobject = object;

WHILE sobject not empty DO
     object = Pop sobject;

     FOR i from 0 to box.length DO
          solution[object] = box[i];
     FIN POUR
END WHILE

但是这个解决方案不正确,因为我只有6个解决方案。

您能帮我提供不同的文件或建议吗?感谢。

3 个答案:

答案 0 :(得分:2)

我不知道为什么你的盒子数组是{-1,0},无论如何下面的代码都有效。你只需要一个基数(方框数)然后一遍又一遍地除去排列的总数。在你的情况下,你有2 ^ 3 = 8个解,你的基数是2,你在外循环中尝试0,1,2,.. 7,并在内循环中除以基数。

    int[] box = {-1, 0};
    int objects = 3;
    int total = (int) Math.pow(box.length, objects);
    int radix = box.length;
    for (int i = 0; i < total; i++) {
        int v = i;
        for (int pos = 0; pos < objects; pos++) {
            System.out.print(box[v % radix] + " ");
            v = v / radix;
        }
        System.out.println();
    }

这样,当你有很多盒子时,你可以避免大堆栈(递归也需要堆栈)。在更复杂的情况下,你可以有多个基数,例如。对于第一个框,允许项目A和B,对于第二个框,允许B,C和D.

答案 1 :(得分:1)

给你的方框数字0 ... n

对象数量:m

您可以简单地将数字计入基数n并使用结果数字来确定放置每个对象的框。只需从0计算到m^n-1即可获得所有组合。

框3的示例数,对象数4

0000    all in boy 0
0001    fist three in box 0 last one in box 1
0002
0010
0011
0012
0020    fist two in box 0, third one in box 2 and last one in box 0
...
2210    fist two in box 2, third one in box 1 and last one in box 0
2211
2212
2220
2221
2222

这样您就可以获得所有m^n种可能的组合。

答案 2 :(得分:1)

最简单的解决方案可能是递归函数。

基本上,对于每个索引(对象),尝试所有可能的元素(框),然后递归到下一个索引。

box = {-1, 0}
objectCount = 3
solutions = {}

getPermutations(0, new array[objectCount]) // function call

getPermutations(index, output)
   if index == output.length
      solutions.add(output)
   else
      for each box b
         output[index] = b
         getPermutations(index + 1, output)

Live Java demo