Коды Грея для перестановок — различия между версиями
(снесён wikitex) |
|||
Строка 1: | Строка 1: | ||
− | |||
− | |||
== Определения == | == Определения == | ||
Строка 12: | Строка 10: | ||
{| border="1" cellpadding="3" | {| border="1" cellpadding="3" | ||
− | | | + | | <tex>n = 2</tex> || <tex>\{1, 2\}</tex> || <tex>\{2, 1\}</tex> |
|- | |- | ||
− | | | + | | <tex>n = 3</tex> || <tex>\{1, 2, 3\}</tex> || <tex>\{1, 3, 2\}</tex> || <tex>\{3, 1, 2\}</tex> || <tex>\{3, 2, 1\}</tex> || <tex>\{2, 3, 1\}</tex> || <tex>\{2, 1, 3\}</tex> |
|} | |} | ||
== Построение кода Грея для перестановок == | == Построение кода Грея для перестановок == | ||
− | Будем строить код Грея для длины | + | Будем строить код Грея для длины <tex>n = k</tex>. Предположим, что нам известен код Грея для перестановок длиной <tex>k - 1</tex>. Возьмем первую перестановку из известного нам кода. Она имеет следующий вид: <tex>\{a_1, a_2, a_3, \dots, a_{k-1}\}</tex> |
− | Сначала запишем | + | Сначала запишем <tex>k</tex> в начало этой перестановки, после чего будем двигать его вправо элементарными транспозициями (подчёркнуты пары переставляемых элементов). |
− | * | + | * <tex>\{\underline{k, a_1}, a_2, a_3, \dots, a_{k-1}\}</tex> |
− | * | + | * <tex>\{a_1, \underline{k, a_2}, a_3, \dots, a_{k-1}\}</tex> |
− | * | + | * <tex>\{a_1, a_2, \underline{k, a_3}, \dots, a_{k-1}\}</tex> |
− | * | + | * <tex>\{a_1, a_2, a_3, \underline{k, \dots}, a_{k-1}\}</tex> |
− | * | + | * <tex>\{a_1, a_2, a_3, \dots, \underline{k, a_{k-1}}\}</tex> |
− | * | + | * <tex>\{a_1, a_2, a_3, \dots, a_{k-1}, k\}</tex> |
− | Получим | + | Получим <tex>k</tex> различных перестановок, отличающихся одной элементарной транспозицией. Возьмем следующую строку из кода Грея для перестановок длиной <tex>n = k - 1</tex>, которая будет выглядеть так (т.к. мы получили, что элемент стоящий на первом месте в перестановке будет "двигаться" вправо, то и во второй перестановке первый элемент "поменяется" со вторым): |
− | + | <tex>\{a_2, a_1, a_3, \dots, a_{k-1}\}</tex> | |
− | Элемент | + | Элемент <tex>k</tex> записываем в конец и начинаем "двигать" его влево: |
− | * | + | * <tex>\{a_2, a_1, a_3, \dots, \underline{a_{k-1}, k}\}</tex> |
− | * | + | * <tex>\{a_2, a_1, a_3, \underline{\dots, k}, a_{k-1}\}</tex> |
− | * | + | * <tex>\{a_2, a_1, \underline{a_3, k}, \dots, a_{k-1}\}</tex> |
− | * | + | * <tex>\{a_2, \underline{a_1, k}, a_3, \dots, a_{k-1}\}</tex> |
− | * | + | * <tex>\{\underline{a_2, k}, a_1, a_3, \dots, a_{k-1}\}</tex> |
− | * | + | * <tex>\{k, a_2, a_1, a_3, \dots, a_{k-1}\}</tex> |
− | Опять получили | + | Опять получили <tex>k</tex> различных перестановок, отличающихся в одной элементарной транспозиции. Далее берем третью строку из кода Грея для перестановок длиной <tex>n = k - 1</tex>, записываем в ее начало элемент <tex>k</tex> и двигаем его вправо, как для первой перестановки и т.д. |
− | Для каждой перестановки длиной | + | Для каждой перестановки длиной <tex>n = k - 1</tex> (всего их <tex>(k - 1)!</tex>) мы получили <tex>k</tex> новых перестановок. Итого <tex>k\cdot(k - 1)! = k!</tex> перестановок. Все они различны, т.к. для любых двух перестановок из нового кода Грея элемент <tex>k</tex> стоит на разных позициях,а если <tex>k</tex> стоит на одной и той же позиции, то эти перестановки образованы от разных перестановок длиной <tex>n = k - 1</tex>. Так же все соседние перестановки отличаются ровно в одной элементарной транспозиции (образованные от одной перестановки различны благодаря построению, от разных перестановок {{---}} имеют <tex>k</tex> на одной и той же позиции, но отличаются в одной элементарной транспозиции, т.к. является перестановками в коде Грея для перестановок длиной <tex>n = k - 1</tex>). Таким образом мы получили <tex>k!</tex> различных перестановок длиной <tex>k</tex>, отличающихся в одной элементарной транспозиции. Алгоритм для построения кодов Грея для перестановок длиной <tex>n</tex> получен. |
== Пример применения алгоритма == | == Пример применения алгоритма == | ||
− | Рассмотрим код Грея для длины | + | Рассмотрим код Грея для длины <tex>n = 2</tex>: |
− | * | + | * <tex>\{2, 1\}</tex> |
− | * | + | * <tex>\{1, 2\}</tex> |
Тогда следуя алгоритму полученный код будет выглядеть так (подчёркнуты пары переставляемых элементов): | Тогда следуя алгоритму полученный код будет выглядеть так (подчёркнуты пары переставляемых элементов): | ||
− | * | + | * <tex>\{\underline{3, 2}, 1\}</tex> {{---}} берем первую перестановку и добавляем в начало тройку |
− | * | + | * <tex>\{2, \underline{3, 1}\}</tex> {{---}} двигаем до последней позиции |
− | * | + | * <tex>\{\underline{2, 1}, 3\}</tex> |
− | * | + | * <tex>\{1, \underline{2, 3}\}</tex> {{---}} берем следующую перестановку и записываем тройку в конец |
− | * | + | * <tex>\{\underline{1, 3}, 2\}</tex> {{---}} двигаем в начало |
− | * | + | * <tex>\{3, 1, 2\}</tex> |
Код Грея получен. | Код Грея получен. | ||
Строка 67: | Строка 65: | ||
== Псевдокод получения Грея == | == Псевдокод получения Грея == | ||
− | Получаем код Грея рекурсивно, в базовом случае ( | + | Получаем код Грея рекурсивно, в базовом случае (<tex>n = 1</tex>) возвращаем список из одной перестановки <tex>\{n\}</tex>. |
gray_code(n): | gray_code(n): | ||
Строка 95: | Строка 93: | ||
== Сведение задачи построения кода Грея для перестановок к графам == | == Сведение задачи построения кода Грея для перестановок к графам == | ||
− | Последовательность перестановок, полученная с помощью данного алгоритма имеет интересную интерпретацию. Так, если рассмотреть граф, вершины которого соответствуют всем перестановкам и в котором две вершины, соответствующие перестановкам | + | Последовательность перестановок, полученная с помощью данного алгоритма имеет интересную интерпретацию. Так, если рассмотреть граф, вершины которого соответствуют всем перестановкам и в котором две вершины, соответствующие перестановкам <tex>f</tex> и <tex>g</tex>, соединены ребром, если <tex>g</tex> образуется из <tex>f</tex> однократной транспозицией соседних элементов, то полученная последовательность является гамильтоновым путем в этом графе. |
== См. также == | == См. также == | ||
Строка 102: | Строка 100: | ||
* [[Гамильтонов путь]] | * [[Гамильтонов путь]] | ||
== Литература == | == Литература == | ||
− | Романовский, И.В. Дискретный Анализ - Санкт-Петербург 2003 стр. 39-41 | + | * Романовский, И.В. Дискретный Анализ - Санкт-Петербург 2003 стр. 39-41 |
Версия 10:06, 12 января 2012
Содержание
Определения
Определение: |
Коды Грея для перестановок — упорядочение перестановок, при котором соседние перестановки отличаются только элементарной транспозицией. Элементарная транспозиция — транспозиция двух соседних элементов. |
Примеры кодов Грея для перестановок
Построение кода Грея для перестановок
Будем строить код Грея для длины
. Предположим, что нам известен код Грея для перестановок длиной . Возьмем первую перестановку из известного нам кода. Она имеет следующий вид:Сначала запишем
в начало этой перестановки, после чего будем двигать его вправо элементарными транспозициями (подчёркнуты пары переставляемых элементов).Получим
различных перестановок, отличающихся одной элементарной транспозицией. Возьмем следующую строку из кода Грея для перестановок длиной , которая будет выглядеть так (т.к. мы получили, что элемент стоящий на первом месте в перестановке будет "двигаться" вправо, то и во второй перестановке первый элемент "поменяется" со вторым):
Элемент
записываем в конец и начинаем "двигать" его влево:Опять получили
различных перестановок, отличающихся в одной элементарной транспозиции. Далее берем третью строку из кода Грея для перестановок длиной , записываем в ее начало элемент и двигаем его вправо, как для первой перестановки и т.д.Для каждой перестановки длиной
(всего их ) мы получили новых перестановок. Итого перестановок. Все они различны, т.к. для любых двух перестановок из нового кода Грея элемент стоит на разных позициях,а если стоит на одной и той же позиции, то эти перестановки образованы от разных перестановок длиной . Так же все соседние перестановки отличаются ровно в одной элементарной транспозиции (образованные от одной перестановки различны благодаря построению, от разных перестановок — имеют на одной и той же позиции, но отличаются в одной элементарной транспозиции, т.к. является перестановками в коде Грея для перестановок длиной ). Таким образом мы получили различных перестановок длиной , отличающихся в одной элементарной транспозиции. Алгоритм для построения кодов Грея для перестановок длиной получен.Пример применения алгоритма
Рассмотрим код Грея для длины
:Тогда следуя алгоритму полученный код будет выглядеть так (подчёркнуты пары переставляемых элементов):
- — берем первую перестановку и добавляем в начало тройку
- — двигаем до последней позиции
- — берем следующую перестановку и записываем тройку в конец
- — двигаем в начало
Код Грея получен.
Псевдокод получения Грея
Получаем код Грея рекурсивно, в базовом случае (
) возвращаем список из одной перестановки .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