Jump to content

Алгоритм Штейнхауса – Джонсона – Троттера

Гамильтонов цикл в графе Кэли симметрической группы, порожденный алгоритмом Штейнхауза–Джонсона–Троттера.
Колесная диаграмма всех перестановок длины генерируется с помощью алгоритма Штейнхауса-Джонсона-Троттера, где каждая перестановка имеет цветовую кодировку (1 = синий, 2 = зеленый, 3 = желтый, 4 = красный).

Алгоритм Штейнхауса -Джонсона-Троттера или алгоритм Джонсона-Троттера , также называемый простыми изменениями , представляет собой алгоритм, названный в честь Хьюго Стейнхауса , Сельмера М. Джонсона и Хейла Ф. Троттера генерирует все перестановки , который элементы. Каждые две соседние перестановки в результирующей последовательности отличаются заменой двух соседних перестановочных элементов. Аналогично, этот алгоритм находит гамильтонов цикл в пермутоэдре — , многограннике вершины которого представляют перестановки, а ребра — перестановки.

Этот метод был известен уже английским звонарям 17-го века , и Роберт Седжвик называет его «возможно, самым известным алгоритмом перебора перестановок». [ 1 ] Версия алгоритма может быть реализована таким образом, чтобы среднее время на перестановку было постоянным. Помимо простоты и эффективности вычислений, этот алгоритм имеет то преимущество, что последующие вычисления сгенерированных перестановок можно ускорить за счет сходства между последовательными перестановками. [ 1 ]

Алгоритм

[ редактировать ]

Последовательность перестановок, сгенерированная алгоритмом Штейнхауса-Джонсона-Троттера, имеет естественную рекурсивную структуру, которую можно сгенерировать с помощью рекурсивного алгоритма. Однако реальный алгоритм Штейнхауса-Джонсона-Троттера не использует рекурсию, а вместо этого вычисляет одну и ту же последовательность перестановок простым итеративным методом. Более позднее улучшение позволяет ему работать с постоянным средним временем на каждую перестановку.

Рекурсивная структура

[ редактировать ]

Последовательность перестановок для заданного числа можно составить из последовательности перестановок поставив номер в каждую возможную позицию в каждой из более коротких перестановок. Алгоритм Штейнхауса – Джонсона – Троттера следует этой структуре: генерируемая им последовательность перестановок состоит из блоков перестановок так, чтобы внутри каждого блока перестановки согласовывали порядок чисел от 1 до и различаются только положением . Сами блоки упорядочиваются рекурсивно, по алгоритму Штейнгауза-Джонсона-Троттера на один элемент меньше. Внутри каждого блока позиции, на которых размещаются либо в порядке убывания, либо в порядке возрастания, и блоки чередуются в этих двух порядках: размещение в первом блоке — по убыванию, во втором — по возрастанию, в третьем — по убыванию и так далее. [ 2 ]

Таким образом, из единственной перестановки на одном элементе

1

можно поместить число 2 в каждую возможную позицию в порядке убывания, чтобы сформировать список из двух перестановок двух элементов,

1 2
2 1

Затем можно поместить число 3 в каждую из трех разных позиций для этих двух перестановок: в порядке убывания для первой перестановки 1 2, а затем в порядке возрастания для перестановки 2 1:

1 2 3
1 3 2
3 1 2
3 2 1
2 3 1
2 1 3

Та же схема размещения, чередование нисходящего и восходящего размещения , применяется для любого большего значения . [ 2 ] В последовательностях перестановок с этой рекурсивной структурой каждая перестановка отличается от предыдущей либо движением по одной позиции за раз. , или заменой двух меньших чисел, унаследованных от предыдущей последовательности более коротких перестановок. В любом случае эта разница представляет собой просто перестановку двух соседних элементов. Когда первый и конечный элементы последовательности также различаются только двумя соседними элементами (положением чисел и ), что можно доказать по индукции.

Эта последовательность может быть сгенерирована с помощью рекурсивного алгоритма , который создает последовательность меньших перестановок, а затем выполняет все возможные вставки наибольшего числа в рекурсивно сгенерированную последовательность. [ 2 ] Тот же порядок перестановок можно эквивалентно описать как порядок, генерируемый следующим жадным алгоритмом. [ 3 ] Начните с перестановки идентичности . Теперь повторно транспонируйте самую большую возможную запись, расположив ее слева или справа, так, чтобы на каждом шаге создавалась новая перестановка, которая раньше не встречалась в списке перестановок. Например, в случае последовательность начинается с , затем переворачивается со своим левым соседом, чтобы получить . С этого момента переворачивание со своим правым соседом даст начальную перестановку , поэтому последовательность вместо этого переворачивается со своим левым соседом и прибывает в и т. д. Направление транспонирования (влево или вправо) в этом алгоритме всегда определяется однозначно. Однако реальный алгоритм Штейнхауса-Джонсона-Троттера не использует рекурсию и не требует отслеживания перестановок, с которыми он уже столкнулся. Вместо этого он вычисляет одну и ту же последовательность перестановок простым итеративным методом .

Оригинальная версия

[ редактировать ]

По описанию Джонсона, алгоритм генерации следующей перестановки из заданной перестановки выполняет следующие действия.

  • Для каждого от 1 до , позволять быть положением, где значение помещается в перестановку . Если порядок чисел от 1 до в перестановке определяет четную перестановку , пусть в противном случае, пусть .
  • Найдите наибольшее число для чего определяет допустимую позицию в перестановке который содержит число меньше, чем . Поменяйте значения местами и .

Когда нет номера можно найти удовлетворяющим условиям второго шага алгоритма, то алгоритм достиг конечной перестановки последовательности и завершает работу. Данная процедура может быть реализована в время на перестановку. [ 4 ]

Троттер предлагает альтернативную реализацию итерационного алгоритма для той же последовательности в слегка комментированной нотации АЛГОЛА 60 . [ 5 ]

Поскольку этот метод генерирует перестановки, которые попеременно являются четными и нечетными, его можно легко модифицировать для генерации только четных или только нечетных перестановок: чтобы сгенерировать следующую перестановку той же четности из заданной перестановки, просто примените одну и ту же процедуру дважды. . [ 6 ]

Ускорение Эвена

[ редактировать ]

Последующее усовершенствование Шимона Эвена обеспечивает улучшение времени работы алгоритма за счет сохранения дополнительной информации для каждого элемента в перестановке: его позиции и направления (положительного, отрицательного или нулевого), в котором он движется в данный момент (по сути, это та же самая информация, вычисленная с использованием четности перестановки в версии алгоритма Джонсона). Изначально направление числа 1 равно нулю, а все остальные элементы имеют отрицательное направление:

1 −2 −3

На каждом шаге алгоритм находит наибольший элемент с ненулевым направлением и меняет его местами в указанном направлении:

1 −3 −2

Если это приводит к тому, что выбранный элемент достигает первой или последней позиции в перестановке, или если следующий элемент в том же направлении больше выбранного элемента, направление выбранного элемента устанавливается равным нулю:

3 1 −2

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

+3 2 1

Остальные два шага алгоритма являются:

2 +3 1
2 1 3

Когда все числа становятся немаркированными, алгоритм завершает работу. [ 7 ]

Этот алгоритм требует времени за каждый шаг, на котором наибольшее число ходов равно . Таким образом, обмены, включающие число брать только постоянное время; поскольку эти свопы составляют все, кроме часть всех перестановок, выполняемых алгоритмом, среднее время на каждую генерируемую перестановку также является постоянным, хотя небольшое количество перестановок займет больше времени. [ 1 ]

Более сложная без цикла версия той же процедуры , подходящая для функционального программирования, позволяет выполнять ее за постоянное время для каждой перестановки в каждом случае; однако модификации, необходимые для устранения циклов в процедуре, на практике делают ее медленнее. [ 8 ]

[ редактировать ]

Пермутоэдр

[ редактировать ]

Множество всех перестановок предметы могут быть геометрически представлены пермутоэдром , многогранником , образованным из выпуклой оболочки векторы, перестановки вектора . Хотя такое определение дано в многомерное пространство, на самом деле это -мерный многогранник; например, пермутоэдр на четырех элементах — это трехмерный многогранник, усеченный октаэдр . Если каждая вершина пермутоэдра помечена перестановкой, обратной перестановке, определенной координатами ее вершины, результирующая маркировка описывает граф Кэли симметрической группы перестановок на элементы, генерируемые перестановками, которые меняют местами соседние пары элементов. Таким образом, каждые две последовательные перестановки в последовательности, генерируемой алгоритмом Штейнгауза–Джонсона–Троттера, соответствуют таким образом двум вершинам, образующим концы ребра в пермутоэдре, а вся последовательность перестановок описывает гамильтонов путь в пермутоэдре: путь, проходящий через каждую вершину ровно один раз. Если последовательность перестановок завершается добавлением еще одного ребра из последней перестановки к первому в последовательности, результатом будет гамильтонов цикл. [ 9 ]

Коды Грея

[ редактировать ]

Код Грея для чисел в заданном основании представляет собой последовательность, которая содержит каждое число до заданного предела ровно один раз, таким образом, что каждая пара последовательных чисел отличается на единицу одной цифрой. перестановки числа от 1 до могут быть помещены в личную переписку с числа от 0 до путем объединения каждой перестановки с последовательностью чисел которые подсчитывают количество позиций в перестановке, находящихся справа от значения и которые содержат значение меньше, чем (то есть количество инверсий , для которых — большее из двух перевернутых значений), а затем интерпретировать эти последовательности как числа в факториальной системе счисления , то есть смешанной системе счисления с последовательностью счисления Например, перестановка дал бы значения , , , , и . Последовательность этих значений, , дает число Последовательные перестановки в последовательности, сгенерированной алгоритмом Штейнхауса-Джонсона-Троттера, имеют количество инверсий, отличающееся на единицу, образуя код Грея для факториальной системы счисления. [ 10 ]

В более общем смысле исследователи комбинаторных алгоритмов определили код Грея для набора комбинаторных объектов как порядок объектов, в котором каждые два последовательных объекта отличаются минимально возможным образом. В этом обобщенном смысле алгоритм Штейнхауса-Джонсона-Троттера генерирует код Грея для самих перестановок. [ 11 ]

Этот метод был известен на протяжении большей части своей истории как метод сменного звона в церковные колокола: он дает процедуру, с помощью которой набор колоколов можно перезвонить через все возможные перестановки, изменяя порядок только двух колоколов за смену. Эти так называемые «простые перемены» или «простая охота» были известны примерно в 1621 году из-за четырех колоколов. [ 12 ] а общий метод был прослежен до неопубликованной рукописи Питера Манди 1653 года . [ 6 ] В книге Фабиана Стедмана 1677 года перечислены решения для шести колоколов. [ 13 ] Совсем недавно звонари смены соблюдали правило, согласно которому ни один колокол не может оставаться в одном и том же положении в течение трех последовательных перестановок; это правило нарушается простыми изменениями, поэтому были разработаны другие стратегии, в которых заменяется несколько колоколов за одно изменение. [ 14 ]

Алгоритм назван в честь Хьюго Штайнхауса , Сельмера М. Джонсона и Хейла Ф. Троттера . Джонсон и Троттер заново открыли алгоритм независимо друг от друга в начале 1960-х годов. [ 15 ] Книга Штейнхауса 1958 года, переведенная на английский язык в 1964 году, описывает похожую невозможную загадку создания всех перестановок системой частиц, каждая из которых движется с постоянной скоростью вдоль линии и меняет местами, когда одна частица догоняет другую. [ 16 ] В статье Ху и Бьена 1976 года Штейнхаузу приписывается формулировка алгоритмической проблемы генерации всех перестановок: [ 17 ] и к 1989 году его книга была (ошибочно) признана одной из оригинальных публикаций алгоритма. [ 18 ]

См. также

[ редактировать ]

Примечания

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 03f4e0e92bc47cbf0780b81171ce5f96__1704071940
URL1:https://arc.ask3.ru/arc/aa/03/96/03f4e0e92bc47cbf0780b81171ce5f96.html
Заголовок, (Title) документа по адресу, URL1:
Steinhaus–Johnson–Trotter algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)