Re: Алгоритм перестановок
От: Кодт Россия  
Дата: 03.10.11 18:18
Оценка:
Здравствуйте, fanpilot, Вы писали:

F>Подскажите вариант реализации без использования обобщённых функций.


Вариант без обобщённых функций состоит в том, чтобы скопипастить определение next_permutation (и всё, от чего он зависит) из <algorithm> и убрать оттуда слово template

А сама идея алгоритма (Д.Кнута, кстати) проста, как сибирский валенок — или как wellington boot.
Пусть перед очередной итерацией наш массив заполнен так: [q,w,e,...,r,M,Z,Y,X,...,C,B,A]
То есть, существует нестрого-убывающий хвост Z >= Y >= ... >= B >= A, отделённый от произвольной головы q,w,e... элементом M, строго меньшим Z.
(Был бы M==Z, — принадлежал бы нестрого-убывающему хвосту M>=Z>=...)

Какая перестановка будет следующей в порядке лексикографического возрастания (как если бы мы переставляли буквы в слове)?
Очевидно, что любые варианты вида [q,w,e,...,r,M]+permute{Z,Y,X,...,C,B,A} — окажутся меньше-или-равны текущему — т.к. голова у них совпадает, а любая перестановка невозрастающего подмассива (хвоста) даст меньший-или-равный подмассив.
Также очевидно, что нужно сохранить как можно более длинную голову неизменной. То есть, вовлечь в перестановку только элемент M.
Получаем [q,w,e,...,r]+minimal_permutation{M,Z,Y,X,...,C,B,A}
Наименьшая перестановка — это массив, отсортированный по возрастанию. То есть, [A,B,C,...,M,...,X,Y,Z]

next_permutation останавливается, когда весь массив оказывается отсортирован по убыванию.

Отсюда план работ
0) если длина массива 0 или 1 — то всё.

1) находим позицию im элемента M, начиная с len-2 и убывая, так, что arr[im]<arr[im+1].
Если поиск закончился неуспешно (im<0) — то всё.

2) переворачиваем подмассив arr[im+1]..arr[len-1]
(это требует аккуратности в работе с индексами)

3) находим положение ins для вставки arr[im] в arr[im+1..len-1], так, что arr[ins]>arr[im]
4) вставляем элемент arr[im] на это место, сдвигая arr[im+1..ins] влево на одну позицию
5) и говорим "не всё!"

Закодировать алгоритм — упражнение для первокурсника %)
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.