Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект.docx
Скачиваний:
35
Добавлен:
28.05.2022
Размер:
2.46 Mб
Скачать
      1. Приложение: программа перебора сочетаний

Приведем код программы, которая перебирает все (0,1)-вектора длины n

с k единицами (а значит все сочетания из n по k).

#include<iostream.h>

const n=7, m=4;

void main()

{

cout << "Перебор сочетаний из " << n << " по " << m << ":"

<< endl << endl ;

int i,j,k;

int x[m];// Вектор номеров позиций единиц int c[n];// (0,1)-вектор текущего сочетания.

// Вспомогательный массив для вывода на печать.

// Исходная инициализация for(i=0;i<m;i++)

x[i]=i;

///////////////////////////////

// Стандартный шаг алгоритма // do {

////////////////////

// Вывод на экран //

// Инициализируем массив c[] for(i=0; i<n; i++)

c[i]=0;

for(i=0; i<m; i++) c[x[i]]=1;

// Выведем его на экран for(i=0; i<n; i++)

cout << c[i]; cout << endl;

/////////////////////////////////////////

// Очередной шаг модификации сочетания //

k=m-1; // номер позиции самой последней единицы,

// которую можно сдвинуть. while( (k>=0) && (x[k]==n-m+k) ) k--;

///////////////////////////////

// Если позиция k существует //

if(k>=0)

{

// Увеличиваем номер позиции k-той единицы

// и выстраиваем все следующие единицы за ней x[k]++;

for(i=k+1; i<m; i++) x[i]=x[k]+(i-k);

}

}

while(k>=0);

}

Результатом работы будут все возможные (0,1)-вектора длины семь с четырьмя единицами:

1111000

1100011

1001011

1110100

1011100

1000111

1110010

1011010

0111100

1110001

1011001

0111010

1101100

1010110

0111001

1101010

1010101

0110110

1101001

1010011

0110101

1100110

1001110

0110011

1100101

1001101

0101110

0101101

0101011

0100111

0011110

0011101

0011011

0010111

0001111

Замечание 1.5.3 . Покскольку, как показано в параграфе 1.5.7, существует взаимнооднозначное соответствие между (0,1)- векторами и мультимножествами, приведенную программу легко представить и как программу перебора мультимножеств.

    1. Перестановки

      1. Понятие перестановки

Определение 1.6.1 . Перестановкой на множестве {1, ..., n}

называется инъективная функция

π : {1, ..., n} {1, ..., n}.

Число n называется порядком перестановки π.

Замечание 1.6.1 . Как любая инъективная на конечном множестве функция, перестановка является биективной.

Замечание 1.6.2 . В общем случае, перестановкой произвольного множества X называют биекцию

π : X X.

Обозначим σn множество всех перестановок порядка n. Очевидно, что

|σn| = n!

Существует несколько способов задания перестановки. Явное задание

перестановки

1 2 ... n

π = π(1) π(2) ... π(n) .

В записи выше первая строка всегда одинакова. Для задания перестановки достаточно второй строки

π = π(1)π(2)...π(n).

Также можно задать перестановку перечислением ее циклов, о чем мы скажем позже.

Определение 1.6.2 . Пусть π1, π2 σn. Произведением перестановок

π2 и π1 называют композицию этих функций: π2 π1(i) = π2(π1(i)),

i = 1, n.

Докажем, что произведение перестановок есть перестановка. Очевидно, что π2 π1 : {1, ..., n} {1, ..., n}. Покажем инъективность.

Пусть i, j {1, ..., n} и i /= j. Поскольку π1 инъективна, π1(i) /= π1(j), а поскольку инъективна π2, π2(π(i)) /= π2(π1(j)). Следовательно,

π2 π1(i) = π2(π1(i)) /= π2(π1(j)) = π2 π1(j).

То есть π2 π1 - инъективна, а значит является перестановкой.

Соседние файлы в предмете Дискретная математика