Коды Грея для перестановок — различия между версиями
ZeRoGerc (обсуждение | вклад) (→Литература) |
ZeRoGerc (обсуждение | вклад) (→Примеры кодов Грея для перестановок) |
||
Строка 2: | Строка 2: | ||
== Примеры кодов Грея для перестановок == | == Примеры кодов Грея для перестановок == | ||
− | + | <tex> | |
− | { | + | \renewcommand{\arraystretch}{1.8} |
− | + | \renewcommand{\tabcolsep}{0.8cm} | |
− | + | \begin{tabular}{|c|c|c|c|c|c|c|} | |
− | + | \hline | |
− | + | n = 2 & \multicolumn{3}{|c|}{\{1, 2\}} & \multicolumn{3}{|c|}{\{2, 1\}}\\ | |
+ | \hline | ||
+ | n = 3 & \{1, 2, 3\} & \{1, 3, 2\} & \{3, 1, 2\} & \{3, 2, 1\} & \{2, 3, 1\} & \{2, 1, 3\}\\ | ||
+ | \hline | ||
+ | \end{tabular} | ||
+ | </tex> | ||
== Построение кода Грея для перестановок == | == Построение кода Грея для перестановок == |
Версия 21:40, 6 декабря 2014
Коды Грея для перестановок(англ. Gray code for permutation) — упорядочение перестановок, при котором соседние перестановки отличаются только элементарной транспозицией.
Содержание
Примеры кодов Грея для перестановок
Построение кода Грея для перестановок
Будем строить код Грея для длины
. Предположим, что нам известен код Грея для перестановок длиной . Возьмем первую перестановку из известного нам кода. Она имеет следующий вид:Сначала запишем число
в начало этой перестановки, после чего будем двигать его вправо элементарными транспозициями (подчёркнуты пары переставляемых элементов).Получим
различных перестановок, отличающихся одной элементарной транспозицией. Возьмем следующую перестановку из кода Грея для перестановок длины и припишем в конце число . Эта перестановка отличается на одну элементарную транспозицию (последние элементы совпадают, а префиксы длины отличаются на элементарную транспозицию). Пусть она имеет следующий вид:
Элемент
записываем в конец и начинаем "двигать" его влево:Продолжаем аналогично. Для каждой перестановки дописываем
в один конец (поочерёдно), и с помощью элементарных транспозиций двигаем в другой конец, при этом добавляя каждую промежуточную перестановку в список.Таким образом получаем для каждой перестановки длиной
(всего штук) по новых перестановок, в сумме перестановок. Все они различны, так как для любых двух перестановок из нового кода Грея элемент стоит на разных позициях,а если стоит на одной и той же позиции, то эти перестановки образованы от разных перестановок длиной . Так же все соседние перестановки отличаются ровно в одной элементарной транспозиции. Итого, мы получили список из различных перестановок длиной , причём соседние отличаются в одной элементарной транспозиции.Пример применения алгоритма
Рассмотрим код Грея для длины
:Тогда следуя алгоритму полученный код будет выглядеть так (подчёркнуты пары переставляемых элементов):
- — берем первую перестановку и добавляем в начало тройку
- — двигаем до последней позиции
- — берем следующую перестановку и записываем тройку в конец
- — двигаем в начало
Код Грея получен.
Псевдокод получения кода Грея
Получаем код Грея рекурсивно, в базовом случае (
) возвращаем список из одной перестановки .gray_code(n): if n == 1: return [{1}] // возращаем список из одной перестановки else: result = [] // пустой список perms = gray_code(n - 1) // perms — перестановки из n - 1 элемента backward = false // переменная которая говорит с какой стороны заполнять перестановку for perm in perms: // perm — текущая перестановка if backward: current = concat(perm, {n})// дописываем {n} в конец perm result.append(current)// добавляем в ответ перестановку current for (i = n; i > 1; i--): swap(current[i - 1], current[i])//переставляем n result.append(current) //добавляем в ответ перестановку current else: current = concat({n}, perm) // дописываем {n} в начало perm result.append(current) //добавляем в ответ перестановку current for (i = 1; i < n; i++): swap(current[i], current[i + 1]) //переставляем n result.append(current) //добавляем в ответ перестановку current backward = !backward //меняем состояние backward return result //возвращаем ответ в виде списка
Сведение задачи построения кода Грея для перестановок к графам
Последовательность перестановок, полученная с помощью данного алгоритма имеет интересную интерпретацию. Так, если рассмотреть граф, вершины которого соответствуют всем перестановкам и в котором две вершины, соответствующие перестановкам
и , соединены ребром, если образуется из однократной транспозицией соседних элементов, то полученная последовательность является гамильтоновым путем в этом графе.См. также
Литература
- Романовский И.В. Дискретный Анализ - "Санкт-Петербург", 2003. - стр. 39-41 - ISBN 5-94157-330-8