Коды Грея для перестановок
Содержание
Определения
| Определение: | 
| Коды Грея для перестановок — упорядочение перестановок, при котором соседние перестановки отличаются только элементарной транспозицией. Элементарная транспозиция — транспозиция двух соседних элементов. | 
Примеры кодов Грея для перестановок
Построение кода Грея для перестановок
Будем строить код Грея для длины . Предположим, что нам известен код Грея для перестановок длиной . Возьмем первую перестановку из известного нам кода. Она имеет следующий вид:
Сначала запишем в начало этой перестановки, после чего будем двигать его вправо элементарными транспозициями (подчёркнуты пары переставляемых элементов).
Получим различных перестановок, отличающихся одной элементарной транспозицией. Возьмем следующую строку из кода Грея для перестановок длиной , которая будет выглядеть так (т.к. мы получили, что элемент стоящий на первом месте в перестановке будет "двигаться" вправо, то и во второй перестановке первый элемент "поменяется" со вторым):
Элемент записываем в конец и начинаем "двигать" его влево:
Опять получили различных перестановок, отличающихся в одной элементарной транспозиции. Далее берем третью строку из кода Грея для перестановок длиной , записываем в ее начало элемент и двигаем его вправо, как для первой перестановки и т.д.
Для каждой перестановки длиной (всего их ) мы получили новых перестановок. Итого перестановок. Все они различны, т.к. для любых двух перестановок из нового кода Грея элемент стоит на разных позициях,а если стоит на одной и той же позиции, то эти перестановки образованы от разных перестановок длиной . Так же все соседние перестановки отличаются ровно в одной элементарной транспозиции (образованные от одной перестановки различны благодаря построению, от разных перестановок — имеют на одной и той же позиции, но отличаются в одной элементарной транспозиции, т.к. является перестановками в коде Грея для перестановок длиной ). Таким образом мы получили различных перестановок длиной , отличающихся в одной элементарной транспозиции. Алгоритм для построения кодов Грея для перестановок длиной получен.
Пример применения алгоритма
Рассмотрим код Грея для длины :
Тогда следуя алгоритму полученный код будет выглядеть так (подчёркнуты пары переставляемых элементов):
- — берем первую перестановку и добавляем в начало тройку
- — двигаем до последней позиции
- — берем следующую перестановку и записываем тройку в конец
- — двигаем в начало
Код Грея получен.
Псевдокод получения кода Грея
Получаем код Грея рекурсивно, в базовом случае () возвращаем список из одной перестановки .
 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
