如何按字典顺序生成由`k``0's`和`l``1'组成的集合的所有排列?

时间:2013-03-01 14:26:54

标签: algorithm permutation

如何按字典顺序生成由k 0'sl 1's组成的集合的所有排列?我正在寻找伪代码或C ++代码。 示例:

000111
001011
001101
001110
010011
010101
010110
011001
011010
011100
100011
100101
100110
101001
101010
101100
110001
110010
110100
111000

函数next_perm01应该像这样运行:next_perm01(permutation_{i})=next_perm01(permutation_{i-1})我发现只有生成不同元素集的所有排列的方法。

5 个答案:

答案 0 :(得分:4)

从其中包含l 1的最小数字开始:(1 << l) - 1

然后应用NextBitPermutation,直到达到最高编号lowest << k

答案 1 :(得分:2)

以k 0s的排列开始,然后是l 1s。 尽可能重复此步骤:

找到前面带有0的q 1s(q> 0)的最右边段,然后是r 0(r> = 0)。全部替换为1,然后是(r + 1)0s,然后是(q-1)1s。这将是你的下一个排列。

答案 2 :(得分:1)

如果我理解正确,那么字符串的通用算法可能是:

nextPermutation string =
scan string from right to left
replace first occurrence of "01" with "10"
move all "1"'s that are on the right of the "01" to the string end*
return replaced string

*感谢n.m.指出我的错误。

答案 3 :(得分:1)

D.E.Knuth的

Generating All Permutations

参见第一章开头的算法L(词典排列生成)

答案 4 :(得分:0)

这是Java,但您可以将其视为伪代码:

public static boolean nextPermutation (int [] permutation)
{
    int l = permutation.length;
    if (l < 2) return false;
    else
    {
        int i = l - 1;
        while (i >= 0 && permutation [i] == 0)
            i--;

        int j = 0;
        while (i >= 0 && permutation [i] == 1)
        {
            i--;
            j++;
        }

        if (i < 0) return false;
        else
        {
            permutation [i] = 1;

            Arrays.fill (permutation, i + 1, l - j + 1, 0);
            Arrays.fill (permutation, l - j + 1, l, 1);

            return true;
        }
    }
}

public static void main(String[] args) {
    int [] permutation = new int [] {0, 0, 0, 1, 1, 1, 1};
    do
    {
        for (int i: permutation)
            System.out.print(i);
        System.out.println();
    } while (nextPermutation(permutation));
}

我的输出是:

0001111
0010111
0011011
0011101
0011110
0100111
0101011
0101101
0101110
0110011
0110101
0110110
0111001
0111010
0111100
1000111
1001011
1001101
1001110
1010011
1010101
1010110
1011001
1011010
1011100
1100011
1100101
1100110
1101001
1101010
1101100
1110001
1110010
1110100
1111000