Коды Грея для перестановок
Содержание
Определения
Определение: |
Коды Грея для перестановок — упорядочение перестановок, при котором соседние перестановки отличаются только элементарной транспозицией. Элементарная транспозиция — транспозиция двух соседних элементов. |
Примеры кодов Грея для перестановок
Построение кода Грея для перестановок
Будем строить код Грея для длины
. Предположим, что нам известен код Грея для перестановок длиной . Возьмем первую перестановку из известного нам кода. Она имеет следующий вид:Сначала запишем
в начало этой перестановки, после чего будем двигать его вправо элементарными транспозициями (подчёркнуты пары переставляемых элементов).Получим
различных перестановок, отличающихся одной элементарной транспозицией. Возьмем следующую строку из кода Грея для перестановок длиной , которая будет выглядеть так (т.к. мы получили, что элемент стоящий на первом месте в перестановке будет "двигаться" вправо, то и во второй перестановке первый элемент "поменяется" со вторым):
Элемент
записываем в конец и начинаем "двигать" его влево:Опять получили
различных перестановок, отличающихся в одной элементарной транспозиции. Далее берем третью строку из кода Грея для перестановок длиной , записываем в ее начало элемент и двигаем его вправо, как для первой перестановки и т.д.Для каждой перестановки длиной
(всего их ) мы получили новых перестановок. Итого перестановок. Все они различны, т.к. для любых двух перестановок из нового кода Грея элемент стоит на разных позициях,а если стоит на одной и той же позиции, то эти перестановки образованы от разных перестановок длиной . Так же все соседние перестановки отличаются ровно в одной элементарной транспозиции (образованные от одной перестановки различны благодаря построению, от разных перестановок — имеют на одной и той же позиции, но отличаются в одной элементарной транспозиции, т.к. является перестановками в коде Грея для перестановок длиной ). Таким образом мы получили различных перестановок длиной , отличающихся в одной элементарной транспозиции. Алгоритм для построения кодов Грея для перестановок длиной получен.Пример применения алгоритма
Рассмотрим код Грея для длины
:Тогда следуя алгоритму полученный код будет выглядеть так (подчёркнуты пары переставляемых элементов):
- — берем первую перестановку и добавляем в начало тройку
- — двигаем до последней позиции
- — берем следующую перестановку и записываем тройку в конец
- — двигаем в начало
Код Грея получен.
Псевдокод получения Грея
Получаем код Грея рекурсивно, в базовом случае (
) возвращаем список из одной перестановки .gray_code(n): if n == 1: return = [{1}] else: result = [] perms = gray_code(n - 1) backward = false for perm in perms: if backward: current = concat(perm, {n}) result.append(current) for (i = n; i > 1; i--): swap(current[i - 1], current[i]) result.append(current) else: current = concat({n}, perm) result.append(current) for (i = 1; i < n; i++): swap(current[i], current[i + 1]) result.append(current) backward = !backward return result
Сведение задачи построения кода Грея для перестановок к графам
Последовательность перестановок, полученная с помощью данного алгоритма имеет интересную интерпретацию. Так, если рассмотреть граф, вершины которого соответствуют всем перестановкам и в котором две вершины, соответствующие перестановкам
и , соединены ребром, если образуется из однократной транспозицией соседних элементов, то полученная последовательность является гамильтоновым путем в этом графе.См. также
Литература
- Романовский, И.В. Дискретный Анализ - Санкт-Петербург 2003 стр. 39-41