[Все темы по перестановкам]
Теория:
1. Окулов. Программирование в алгоритмах. 2004.
2. Липский. Комбинаторика для программистов. 1988
3. Кнут. Том 4. Выпуск 2. Генерация всех кортежей и перестановок. 2008
Рассмотрим две задачи:
1) Генерация следующей перестановки в лексикографическом порядке
2) Генерация всех перестановок с помощью транспозиции двух соседних элементов.
В книге Липского описан алгоритм, генерирующий все перестановки с помощью транспозиций двух элементов(не обязательно соседних).
Практика:
Как и в первой части будем решать задачу 2B-Перестановки
1) Генерация следующей перестановки в лексикографическом порядке(next_permutation).
Данный подход очень хорошо описан в книге Окулова, а также его подробное описание можно найти в книге Кнута(алгоритм L).
- bool next_permutation(string &a) {
-
- int j = n-2;
- while (j!=-1 && a[j] > a[j+1]) j--;
- if (j == -1)
- return false; // a - last permutation
- int k = n - 1;
- while (a[j] > a[k]) k--;
-
- swap(a[j],a[k]);
-
- // reverse back [j+1, n-1]
- int l = j + 1, r = n - 1;
- while (l<r)
- swap(a[l++],a[r--]);
- return true;
- }
* This source code was highlighted with Source Code Highlighter.
Отметим тот факт, что изначально перестановка a должна быть минимальной, т.е. необходимо отсортировать элементы перестановки в порядке возрастания.
[Решение]
2)Генерация всех перестановок с помощью транспозиции двух соседних элементов
Опять же направляю в книгу Окулова, в котором имеется превосходное описание данного алгоритма на основе таблицы инверсий:
Комментариев нет:
Отправить комментарий