打印两个给定集的排列

时间:2014-11-12 21:25:12

标签: java algorithm

给定的是具有一些元素的集合M,例如M={a, b}和另一组F,其中的特定数字代表M排列中的数量。例如F={3, 1},因此对于此示例,排列为:P={(a, a, a, b), (a, a, b, a), (a, b, a, a), (b, a, a, a)}

我想打印那些但是在摆弄了递归之后我仍然无法让它发挥作用。 我目前的代码如下:

void printPermutations(Map<Integer, String> m, List<Integer> f, List<Integer> cf, int size, int depth, int index, int innerindex, List<String> toPrint)
{
    if(depth == size)
    {
        System.out.println("");
        for(String a : toPrint)
            System.out.print(a + " ");
        System.out.println("");
    }
    else
    {
        for(int i = index + 1; i < m.size(); ++i)
        {   
            if(f.get(innerindex).compareTo(Integer.valueOf(1)) < 0)
                ++innerindex;

            toPrint.add(m.get(innerindex));

            f.set(innerindex, f.get(innerindex) - Integer.valueOf(1));
            printPermutations(m, f, f, size, depth + 1, i, innerindex, toPrint);
            f.set(innerindex, f.get(innerindex) + Integer.valueOf(1));

            toPrint.remove(m.get(innerindex));

            if(f.get(innerindex).compareTo(cf.get(innerindex)) == 0 && innerindex > 0)
                --innerindex;
        }
    }
}

//call
//asume some cool elements in f and mAsSet
//    f.size() == mAsSet.size()

List<String> toPrint = new ArrayList<String>();
Map<Integer, String> m = new HashMap<Integer, String>(mAsSet.size());
int counter = 0;
for(String a : m)
    m.put(Integer.valueOf(counter++), a);
int size = 0;
for(Integer i : f)
    size += i;
printPermutations(m, f, f, size, 0, -1, 0, toPrint);

我真的没有看到这里的错误,它什么都没打印。当然我调试了这个,但我真的没有任何其他的想法来实现我想要的东西。

1 个答案:

答案 0 :(得分:1)

看看big boys are handling permutations是怎样的。如果您正在处理的代码可以包含第三方库而不是guava。这将导致类似:

final ImmutableList<String> m = ImmutableList.of("a", "b");
final ImmutableList<Integer> f = ImmutableList.of(3, 1);

final ImmutableList<String> values = FluentIterable.from(m).
  transformAndConcat(new Function<String, Iterable<String>>() {

    int c = 0;

    public Iterable<String> apply(String input) {
        return Collections.nCopies(f.get(c++), input);
    }
}).toList();

final ImmutableSet<List<String>> permutations = ImmutableSet.copyOf(Collections2.permutations(values));
System.out.println(Joiner.on("\n").join(permutations));

Collections2.permutations将生成重复输出(即[a,a,a,b]将多次出现,但由于排列是作为Iterator实现的,因此不使用额外的内存,因为生成的ImmutableSet仅包含单个值。迭代运行值!(阶乘)时间。