Первая страница / Визуализаторы / Комбинаторика /

Перебор перестановок

Голосование: 360, 246

Эта программа демонстрирует два алгоритма перебора перестановок: перебор в лексикографическом порядке и перебор методом рекурсии. С помощью кнопки «Шаг» программа совершает очередной шаг построения следующей перестановки, с помощью кнопки «Перестановка» программа сразу переходит к следующей перестановке. Кнопкой «Авто» программа переключается в автоматический режим. Кнопки «Быстрее» и «Медленнее» позволяют варьировать скорость работы программы в автоматическом режиме. С помощью кнопки «Сброс» алгоритм инициализируется для работы. До того, как совершен хотя бы один шаг можно изменить количество элементов

Перебор перестановок в лексикографическом порядке

Каждая следующая перестановка строится следующим образом:

  1. На первом шаге программы, двигаясь с конца массива, сравниваем соседние элементы, если предыдущий (по расположению в массиве) элемент больше следующего, двигаемся дальше, если меньше, останавливаемся и запоминаем его номер (m), этот элемент будет изменен (на этом шаге он отмечается красным треугольником снизу, а потом просто красным цветом).
  2. Элементы, стоящие слева от m-го, не изменяем (они станут окрашенными в серый цвет). Среди элементов, стоящих справа, нужно выбрать элемент (k), который должен встать на место m-го. Это минимальный элемент среди тех, которые больше m-го (отмечается синим треугольником, потом просто синим цветом).
  3. Меняем m-ый и k-ый элементы.
  4. Осталось упорядочить по возрастанию элементы, стоящие справа от нового m-го элемента, но т.к. они упорядочены по убыванию, достаточно их обернуть (оборачиваемая часть обозначена стрелками).

Запустить визуализатор

Перебор перестановок методом рекурсии

Основная идея метода состоит в следующем: для того, чтобы построить все перестановки для n элементов, построим все перестановки для n-1 элементов и добавим к каждой из них n-ый элемент всеми возможными n способами. Например к перестановке 2431 элемент 5 добавим следующими способами: 24315, 24351, 24531, 25431, 52431. Можно заметить, что 5 как бы двигается по массиву. Для построения следующей перестановки подвинется 4, после чего снова будет двигаться 5. На протяжении всего процесса хранится информация о том, в каком направлении двигается каждый элемент (показано стрелками над квадратиками с элементами).

При построении следующей перестановки на первом шаге рассматривается наибольший элемент (отмечен красным треугольником). Если в направлении его движения еще есть, куда двигаться, передвигаем на одну позицию, это и будет следующей перестановкой. Если двигаться больше некуда (элемент стоит на краю массива и направление его движения — к краю), то меняем его направление движения, после чего «забываем» про этот элемент и строим следующую перестановку для оставшейся части массива, для этого находим в ней наибольший элемент и т.д. (повторяем все снова).

Запустить визуализатор

Автор визуализатора: Михалев Евгений


Митя / 2008-02-21 01:04:09

Изучаю защиту данных, создавал перебор ключей, алгоритм "Перебор перестановок в лексикографическом порядке" подошел супер! Особенно для ситуаций с одинаковыми буквами (нет копий). Большое спасибо за наглядную иллюстрацию, без нее не справился бы так быстро!

Marbo / 2008-06-14 13:56:14

Большое спасибо, отличные описание и визуализация.

Alex / 2008-06-23 18:14:09

Спасибо за визуализацию, с ней все гораздо понятнее

Дамир / 2008-09-27 03:57:42

Первая программа бажная. Случай когда элементов 4. Идут перестановки 1234 1243 1342 а дальше программа глючит и превращает эту перестановку в 1324.

WC / 2009-04-13 13:45:52

Спасибо, но есть два вопроса:

1. Будет ли добавлена опция переборов с вырожденными перестановками, когда несколько элементов одинаковы?

Нет. Визуализатор разработан только для множеств, а не для мультимножеств.

2. Какой из представленных алгоритмов переборов работает быстрее?

См. соответствующие статьи на нашем сайте.

Игорь / 2009-09-10 21:26:47

Супер сайт!!!

SL / 2010-01-16 23:50:52

Большое спасибо, все просто и понятно. Даже я сразу разобрался.

Виталий (НУ ЛП, UA) / 2010-10-23 16:24:08

Спасибо :)

Андрей / 2012-11-21 10:59:11

Среди элементов, стоящих справа, нужно выбрать элемент (k), который должен встать на место m-го. Это минимальный элемент среди тех, которые больше m-го (отмечается синим треугольником, потом просто синим цветом).

Если элемент(к) не определяется однозначно, то есть несколько равных элементов претендуют на его место, то какой из них следует выбрать? Пример: 123455, какую из 5рок надо поменять с 4кой?

См. выше --- реплику на вопрос от 2009-04-13.<>

Андрей / 2012-11-22 10:00:17

См. выше --- реплику на вопрос от 2009-04-13.

Тот ответ про визуализатор, мой вопрос про был алгоритм.

Алгоритм рассчитан на обработку МНОЖЕСТВА (см. описание над окном визуализатора), а не МУЛЬТИМНОЖЕСТВА. Во втором случае необходима некоторая модификация.

Серый / 2013-12-29 18:31:44

Спасибо! Кучу сайтов облазил и только тут разобрался.

Ваше имя
Email
Текущий день недели (строчными буквами)
Комментарий