如何从具有重复对象的列表中找到具有非重复对象的大小为N的排列?

时间:2017-09-13 12:00:09

标签: algorithm combinations permutation hashset

这是我关于StackOverflow的第一个问题。

我需要找到大小为n的唯一排列,这些排列将具有独特的元素。我已经为此编写了一个逻辑(现在它仅限于3),但它很慢,因为在最坏的情况下,它给出了n * n * n的复杂性。此外,它不适用于超过3的大小。

我应该怎么做才能降低复杂性,并使其适用于任何规模的排列?

例:
输入
ABCD

输出
A B C
A B D
A C D
B C D
(将列表添加到集合中会稍微提高速度,但它不会影响具有较少重复项的列表的时间复杂度)。

这是我的代码:

Set<String> permute(List<String> input, int limit) {
    Set<String> one = new HashSet<>();
    Set<String> two = new HashSet<>();
    Set<String> three = new HashSet<>();

    for (int i = 0; limit > 0 && i < input.size(); i++) {
        one.add(input.get(i));

        for (int j = i + 1; limit > 1 && j < input.size(); j++) {
            String temp = input.get(i) + "-" + input.get(j);
            two.add(temp);

            for (int k = j + 1; limit > 2 && k < input.size(); k++) {
                temp = input.get(i) + "-" + input.get(j) + "-" + input.get(k);
                three.add(temp);
            }
        }
    }

    switch(limit) {
        case 1:
            return one;
        case 2:
            return two;
        case 3:
            return three;
        default:
            return new HashSet<>(); 
    }
}

由于

0 个答案:

没有答案