Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将整数置换的完整数组列表排序为决策树结构_Java_Algorithm_Arraylist_Tree_Permutation - Fatal编程技术网

Java 将整数置换的完整数组列表排序为决策树结构

Java 将整数置换的完整数组列表排序为决策树结构,java,algorithm,arraylist,tree,permutation,Java,Algorithm,Arraylist,Tree,Permutation,背景:我有一个ArrayList。整数是一些订单对象的引用ID。稍后,该列表将告诉分支定界算法,哪个顺序首先计划到日程中,哪个顺序第二,等等。。 B&B是一种基于树的算法,我想用作深度优先搜索 所以,我需要列表的每一个排列。我的第一次尝试使用了递归: private List<List<Integer>> permutations(List<Integer> input) { List<List<Integer>> permu

背景:我有一个
ArrayList
整数
是一些订单对象的引用ID。稍后,该列表将告诉分支定界算法,哪个顺序首先计划到日程中,哪个顺序第二,等等。。 B&B是一种基于树的算法,我想用作深度优先搜索

所以,我需要列表的每一个排列。我的第一次尝试使用了递归:

private List<List<Integer>> permutations(List<Integer> input) {

    List<List<Integer>> permutations = new ArrayList<List<Integer>>();

    if (input.size() == 0) {
        permutations.add(new ArrayList<Integer>());
        return permutations;
    }

    Integer firstElement = input.remove(0);

    List<List<Integer>> recursiveReturn = permutations(input);
    for (List<Integer> li : recursiveReturn) {

        for (int index = 0; index <= li.size(); index++) {
            List<Integer> temp = new ArrayList<Integer>(li);
            temp.add(index, firstElement);
            permutations.add(temp);
        }

    }
    return permutations;
}
但如果是深度优先搜索,我需要:

[1, 2, 3]
[1, 3, 2]  
[2, 1, 3] 
[2, 3, 1] 
[3, 1, 2] 
[3, 2, 1]
以便按预期访问我的树节点:


那么,如何将递归获取的
列表排序到该结构中?

如何对现有排列排序:

final List<List<Integer>> permutations = new ArrayList<>();
permutations.add(Arrays.asList(1, 2, 3));
permutations.add(Arrays.asList(1, 3, 2));
permutations.add(Arrays.asList(2, 1, 3));
permutations.add(Arrays.asList(2, 3, 1));
permutations.add(Arrays.asList(3, 1, 2));
permutations.add(Arrays.asList(3, 2, 1));

System.out.println("initial state=" + permutations);

Collections.reverse(permutations);

System.out.println("after shuffle=" + permutations);

final List<List<Integer>> result = permutations.stream().sorted((o1, o2) -> {
    final int length = o1.size();
    int diff = 0;
    for (int i = 0; i < length; ++i) {
        diff = o1.get(i) - o2.get(i);
        if (diff != 0) {
            break;
        }
    }
    return diff;
}).collect(Collectors.toList());

System.out.println("sorted again =" + result);
final List permutations=new ArrayList();
add(Arrays.asList(1,2,3));
add(Arrays.asList(1,3,2));
add(Arrays.asList(2,1,3));
add(Arrays.asList(2,3,1));
add(Arrays.asList(3,1,2));
add(Arrays.asList(3,2,1));
System.out.println(“初始状态=”+置换);
收藏。反向(排列);
System.out.println(“洗牌后=”+置换);
最终列表结果=排列.流().排序((o1,o2)->{
最终整数长度=o1.size();
int-diff=0;
对于(int i=0;i
如何生成排序排列():

import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.function.Consumer;
导入java.util.stream.collector;
导入java.util.stream.IntStream;
/**
*@作者卡罗尔·克罗尔
*/
公共类置换{
私有置换(){
}
公共静态列表置换(最终整数[]编号){
最终置换收集器置换收集器=新置换收集器();
置换(新整数[0],数字,置换收集器);
返回置换收集器.getResult();
}
私有静态无效置换(int[]前缀,int[]数组,最终使用者操作){
int length=array.length;
如果(长度==0){
操作.接受(前缀);
}否则{
对于(int i=0;i
如何对已存在的排列进行排序:

final List<List<Integer>> permutations = new ArrayList<>();
permutations.add(Arrays.asList(1, 2, 3));
permutations.add(Arrays.asList(1, 3, 2));
permutations.add(Arrays.asList(2, 1, 3));
permutations.add(Arrays.asList(2, 3, 1));
permutations.add(Arrays.asList(3, 1, 2));
permutations.add(Arrays.asList(3, 2, 1));

System.out.println("initial state=" + permutations);

Collections.reverse(permutations);

System.out.println("after shuffle=" + permutations);

final List<List<Integer>> result = permutations.stream().sorted((o1, o2) -> {
    final int length = o1.size();
    int diff = 0;
    for (int i = 0; i < length; ++i) {
        diff = o1.get(i) - o2.get(i);
        if (diff != 0) {
            break;
        }
    }
    return diff;
}).collect(Collectors.toList());

System.out.println("sorted again =" + result);
final List permutations=new ArrayList();
add(Arrays.asList(1,2,3));
add(Arrays.asList(1,3,2));
add(Arrays.asList(2,1,3));
add(Arrays.asList(2,3,1));
add(Arrays.asList(3,1,2));
add(Arrays.asList(3,2,1));
System.out.println(“初始状态=”+置换);
收藏。反向(排列);
System.out.println(“洗牌后=”+置换);
最终列表结果=排列.流().排序((o1,o2)->{
最终整数长度=o1.size();
int-diff=0;
对于(int i=0;i
如何生成排序排列():

import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.function.Consumer;
导入java.util.stream.collector;
导入java.util.stream.IntStream;
/**
*@作者卡罗尔·克罗尔
*/
公共类置换{
私有置换(){
}
公共静态列表置换(最终整数[]编号){
最终置换收集器置换收集器=新置换收集器();
置换(新整数[0],数字,置换收集器);
返回置换收集器.getResult();
}
私有静态无效置换(int[]前缀,int[]数组,最终使用者操作){
int length=array.length;
如果(长度==0){
操作.接受(前缀);
}否则{
对于(int i=0;iimport java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * @author Karol Krol
 */
public class Permutation {

    private Permutation() {
    }

    public static List<List<Integer>> permutation(final int[] numbers) {
        final PermutationCollector permutationCollector = new PermutationCollector();
        permutation(new int[0], numbers, permutationCollector);
        return permutationCollector.getResult();
    }

    private static void permutation(int[] prefix, int[] array, final Consumer<int[]> operation) {
        int length = array.length;
        if (length == 0) {
            operation.accept(prefix);
        } else {
            for (int i = 0; i < length; ++i) {
                final int[] newPrefix = append(prefix, array[i]);
                final int[] reducedArray = reduce(array, i);
                permutation(newPrefix, reducedArray, operation);
            }
        }
    }

    private static int[] append(int[] array, int element) {
        int newLength = array.length + 1;
        array = Arrays.copyOf(array, newLength);
        array[newLength - 1] = element;
        return array;
    }

    private static int[] reduce(int[] array, int index) {
        final int newLength = array.length - 1;
        if (index == 0) {
            return Arrays.copyOfRange(array, 1, array.length);
        } else {
            final int[] dest = new int[newLength];
            System.arraycopy(array, 0, dest, 0, index);
            System.arraycopy(array, index + 1, dest, index, newLength - index);
            return dest;
        }
    }

    public static class PermutationCollector implements Consumer<int[]> {

        private List<List<Integer>> result = new ArrayList<>();

        @Override
        public void accept(int[] ints) {
            result.add(IntStream.of(ints).boxed().collect(Collectors.toList()));
        }

        public List<List<Integer>> getResult() {
            return result;
        }
    }
}
private List<List<Integer>> permutations(List<Integer> input)
{
    List<List<Integer>> permutations = new ArrayList<>();
    // if input's size is one, then there is only one permutation to return
    // wrap it as single entry inside permutations and return 
    if (input.size() == 1) {
        permutations.add(input);
        return permutations;
    }

    // if input's size is more than one, then we need to calc permutations
    // we iterate over the input, each time taking out one cell
    // the remaining cells become tree "under" this cell
    for (int i = 0; i < input.size(); i++) {
        List<Integer> remainingCells = new ArrayList<>(input);
        Integer firstElement = remainingCells.remove(i);
        List<List<Integer>> permutationsUnderFirstElement = permutations(remainingCells);
        for (List<Integer> permutation : permutationsUnderFirstElement) {
            permutation.add(0, firstElement);
            permutations.add(permutation);
        }
    }
    return permutations;
}