3

辞書式順序でk 0's構成されるセットのすべての順列を生成するにはどうすればよいですか?l 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})異なる要素のセットのすべての順列を生成する方法しか見つかりませんでした。

4

5 に答える 5

4

l1が含まれる最小の数字から始めます。(1 << l) - 1

次に、最大数である に達するまでNextBitPermutationlowest << kを適用します。

于 2013-03-01T14:34:12.307 に答える
2

k 個の 0 の順列から始まり、その後に l 個の 1 が続きます。次のことができるまで、この手順を繰り返します。

q 1 (q > 0)の右端のストレッチを見つけます。前に 0 があり、その後に r 0 (r >= 0) が続きます。すべてを 1 に置き換え、その後に (r+1) 0 と (q-1) 1 を続けます。それが次の順列になります。

于 2013-03-01T14:42:20.627 に答える
1

DEKnuthによるすべての順列の生成

最初の章の冒頭にあるアルゴリズムL(辞書式順列の生成)を参照してください。

于 2013-03-01T17:32:15.637 に答える
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

*私の間違いを指摘してくれたnmに感謝します。

于 2013-03-01T15:38:20.610 に答える
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
于 2013-03-01T14:30:34.460 に答える