Алгоритм получения перестановки, непосредственно следующей за данной 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Алгоритм получения перестановки, непосредственно следующей за данной

Поиск

Akn =Nk.

Сочетания (выборки)

Другой классической задачей комбинаторики является задача о числе выборок: сколькими способами можно выбрать k из N различных предметов?

Сочетание можно определить как подмножество из k различных натуральных чисел, принадлежащих множеству чисел из интервала от 1 до N. Наборы отличаются лишь составом элементов, порядок элементов роли не играет. Пусть N = 5, k = 3. Перечислим все сочетания:
 (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5). Каждому сочетанию соответствует k! размещений. Число сочетаний вычисляется по формуле   

                              Сkn = N! / (k! * (N - k)!)


Перестановки с повторениями*

       Имеется N предметов k различных типов. Сколько перестановок можно сделать из N1 предметов первого типа, N2 – второго…, Nk – k-того типа (N1+N2+…+Nk=N)?

       Выше рассмотрены перестановки из различных предметов. В том случае, когда некоторые переставляемые предметы одинаковы, часть перестановок совпадает друг с другом. Перестановок становится меньше.

       Общая формула для подсчета перестановок c повторениями имеет вид:

P (N1, N2, …, Nk)=N!/(N1!*N2!*…*Nk!), где N= N1+N2+…+Nk- общее число элементов. Она следует из P (N1, N2, …, Nk) =

 

Сочетания с повторениями*

Имеются предметы N различных типов. Сколько существует расстановок длины k, если не различать порядок элементов в расстановке (различные расстановки должны различаться хотя бы одним предметом)?

Пусть N=4 и k=7. Закодируем расстановку с помощью последовательности из нулей и единиц. Запишем столько единиц, сколько предметов первого типа, затем нуль, а затем столько единиц, сколько предметов второго типа, и т.д. Суммарное количество единиц в последовательности равно 7, количество нулей – N-1 или 3, т.е. длина равна 10. Количество таких последовательностей определяется количеством способов записи 3 нулей на 10 мест, или С310=120.

Или перестановки 7 единиц и 3 нулей: СkN = 10!/(3!*7!)

Общая формула для подсчета числа сочетаний с повторениями имеет вид

       СkN= СN-1N+k-1= СkN+k-1

или

СkN= (N+k-1)!/(k!*(n-1)!)

 

Разбиения*

           Требуется подсчитать число разбиений конечного множества предметов S, где
|S|=N (количество предметов), на k различных подмножеств S=S1ÈS2ÈS3È…ÈSk, попарно не пересекающихся, |Si|=ni, i=1,2, …, k и n1+n2+…+nk=N.

       S1 можно сформировать  способами, S2 -  способами ,… Sk -  способами. Таким образом, число разбиений равно , или N!/(N1!*N2!*…*Nk!).

 

 


  1.  Алгоритм генерации всех перестановок N-элементного множества

Задача. Необходимо перечислить все перестановки для заданного значения N. Обязательное условие – отношение порядка на множестве перестановок. Предполагаем, что перестановка хранится в массиве P длины N.

       Лексикографический порядок на множестве всех перестановок определяется следующим образом: Р12 тогда и только тогда, когда существует такое t>=1, что P1[t]<=P2[t] и P1[i]=P2[i] для всех i<t. При решении данной задачи решается и задача получения следующей в лексикографическом порядке перестановки.

Пример (N=3).

 

Лексикографический

           

 

  1. Имеется P= (p1, p2, …, pn). Будем просматривать числа p1, p2, …, pn  с конца и остановимся, когда впервые найдем pi<pi+1 . Если такого элемента нет, то перестановка уже имеет вид

(N, N-1, …,2,1) и является последней.

  1. Итак, у нас имеется последовательность p1<p2… <pi < pi+1> pi+2 > pi+3…>pn.. Будем просматривать последовательность pi+1 > pi+2 > pi+3…> pn с конца и найдем первый pj, больший pi и поменяем их местами. Т.е. из последовательности:

 p1<p2… <pi<pi+1> pi+2>pi+3…> pj>…>pn  получим последовательность

 p1<p2… <pj<pi+1> pi+2>pi+3…pi>…>pn.

  1. Переставим элементы pi+1> pi+2>pi+3…pi>…>pn в возрастающем порядке.

 

Пример. Перестановка 11,8,5,1,7,4,10,9,6,3,2. Какая следующая перестановка идет в лексикографическом порядке?

 

· Находим «скачок» - 4 меньше 10.

· Затем «в хвосте» перестановки находим первый элемент с конца перестановки, больший значения 4. Это значение 6.

· Меняем местами элементы 4 и 6

· «хвост» перестановки ухудшаем максимально, т.е. расставляем элементы в порядке возрастания (переворачиваем).

 

 Получаем перестановку 11,8,5,1,7,6,2,3,4,9,10.

 


  1. Все K-элементные подмножества N-элементного множества (0 < K, N £ 16).
     Задан целочисленный массив A(N). Среди элементов массива нет равных (проверять массив на наличие равных элементов не нужно). Необходимо распечатать все K-элементные подмножества N-элементного множества. (N и K вводятся с клавиатуры).

Массив С(K) содержит индексы элементов массива A(N), входящих в сочетание, в лексикографическом порядке.

Пример. Перечислим все сочетания из 5-элементного множества по 3 элемента в лексикографическом порядке: 1 2 3, 1 2 4, 1 2 5, 1 3 4, 1 3 5, 1 4 5, 2 3 4, 2 3 5, 2 4 5, 3 4 5.

Начальное сочетание 12..k, последнее – (N-k+1)(N-k+2)..N.

Переход от текущего сочетания к следующему осуществляется по алгоритму:

1) Просматриваем сочетание справа налево и находим первый элемент, который можно увеличить (последний k-й элемент сочетания для этого должен быть меньше или равен N, предпоследний – меньше или равен N-1 и т.д.).

2) Увеличиваем этот элемент на 1.

3) Часть сочетания (от этого элемента до конца) формируем из чисел натурального ряда, следующих за ним.

  1. Все подмножества N-элементного множества (0 < N £ 16).
    Задан целочисленный массив A(N). Среди элементов массива нет равных (проверять массив на наличие равных элементов не нужно).
    Необходимо получить все подмножества данного N-элементного множества.

 

Способ 1. Будем перебирать K (0 < K £ 16) и находить все K- элементные подмножества N-элементного множества (см. задачу 3).

Способ 2.

Пример. Пусть определен массив char A[3] =(4, 2, 7); int N=3.

 

Двоичный код

Подмножество

 

 

 

 

 

 

 

 

 

 

 

 

 

Для работы с двоичным кодом числа понадобятся операции

N >> 1 – сдвиг вправо на один бит всего числа; 

N << 1 – сдвиг влево на один бит всего числа; при этом крайний левый бит вытесняется за сетку, крайний правый становится равным 0;

N & А – логическое произведение над целыми числами выполняется поразрядно над двоичным представлением числа, результат - число; например: N & 1 =1, когда в правом бите 1.

1112=2n-1=710

 



Поделиться:


Последнее изменение этой страницы: 2024-06-17; просмотров: 61; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.007 с.)