2013-03-01 4 views
3

Как сгенерировать все перестановки множества, состоящие из k0's и l1's в лексикографическом формате? Я ищу псевдокод или код на C++. Пример:Как сгенерировать все перестановки множества, состоящие из `k```````````` в лексикографическом порядке?

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}) я нашел только способ генерации всех перестановок множества различных элементов.

ответ

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 
4

Начните с наименьшим номером, который имеет l 1 в нем: (1 << l) - 1

Затем примените NextBitPermutation, пока не достигнете наибольшего числа, то есть lowest << k.

2

Начните с перестановки k 0s, за которой следует l 1s. Повторите этот шаг, пока вы можете:

Найти крайний правый участок д 1s (Q > 0), которым предшествует 0 и с последующим г 0s (г > = 0). Замените все на 1, за которым следует (r + 1) 0s, за которым следует (q-1) 1s. Это будет ваша следующая перестановка.

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 

* Благодаря н.м. за то, что я указал на свою ошибку.

+0

Как вы получаете '1001' от' 0011'? –

+0

@ н.м. мой алгоритм будет идти от '0011' до' 0101'. почему вы хотите перейти на '1001' с' 0011'? –

+0

Я не хочу, чтобы он переходил прямо с '0011' на' 1001', я хочу, чтобы он туда поехал. Будет ли это когда-нибудь? –

Смежные вопросы