生成可接受的排列

时间:2015-03-15 19:23:52

标签: java algorithm arraylist

我想生成集合列表的所有可能的排列,但排列并非全部符合条件。排列是子集的组合'集合列表的排列。

例如,我们有以下列表由两个子集组成:List = {(1,2),(3,4)}; 可接受的排列是:1234/1243/2134/2143/3412/4312/3421/4321 以下排列不可受理:1423/3142/1324/1342/2431/2341 / ....

我已经产生了所有可能的排列,但不是那些可接受的排列。

static void permute(ArrayList<Integer> arr, int k){
  for(int i = k; i < arr.size(); i++){
      java.util.Collections.swap(arr, i, k);
      permute(arr, k+1);
      java.util.Collections.swap(arr, k, i);
  }
  if (k == arr.size() -1){
      System.out.println(java.util.Arrays.toString(arr.toArray()));
  }

}

我真的需要这个代码来计算Owen(博弈论)的价值。提前谢谢

2 个答案:

答案 0 :(得分:0)

看起来你有8个可容许的排列,一个完整的二元树的对称组的元素有4个叶子,S2 wreath S2。如果这是你想要的,你可以通过循环第一级的排列来生成所有这些,然后对于每一个,循环遍历第二级排列的所有选择,修复排列的第一级。

如果n非常小,您可以生成所有排列,然后拒绝那些不会产生第一级一致排列的排列。

答案 1 :(得分:0)

这里的问题是你得到第一个数组的可能排列,然后是第二个数组并连接它们,你需要做的是做你在代码中做的同样的事情,然后创建一个新的2darray第一个数组的第一个值,第二个数组的第一个值,然后是第二个数组的第二个值,然后是第一个数组的第二个值。因此,您可以使用当前技术找到{(1,2),(3,4)}可能的排列,然后使用{(1,3),(2,4)}和{(1,找到可能的排列) 4),(2,4)}等。

如果您有超过2个列表,那么有用的来源是http://www.programcreek.com/2013/02/leetcode-permutations-java/ 它解释了这个过程,并有代码说明。