Изменения

Перейти к: навигация, поиск

Коды Грея для перестановок

301 байт убрано, 03:58, 13 декабря 2011
Нет описания правки
{| border="1"
| n=2 || n=3
|-
| {1, 2} || {1, 2, 3}
== Построение кода Грея для перестановок ==
Чтобы построить код Грея для перестановки длиной $n$, будем использовать код Грея для перестановки длиной $n - 1$.Для $n = 1$ код Грея выглядит так: <font size = '2'>{ 1 }</font> Будем строить код Грея для перестановок длины $n = k$. Предположим, что нам известен код Грея для перестановок длиной $n = k - 1$. Возьмем первую перестановку из известного нам кода. Пусть она выглядит так:
{a<sub>1</sub>, a<sub>2</sub>, a<sub>3</sub>, ..., a<sub>k-1</sub>} ,где $a_{i}$ при $i = 1, 2, 3, ..., k$ {{---}} элементы перестановки.
Будем "двигать" этот элемент $a_{k}$ вправо, меняя его с соседним(жирным выделены элементы, которые поменялись):
*{a<sub>k</sub>, a<sub>1</sub>, a<sub>2</sub>, a<sub>3</sub>, ..., a<sub>k - 1</sub>} (1)
*{'''a<sub>k1</sub>''', '''a<sub>1k</sub>''', a<sub>2</sub>, a<sub>3</sub>, ..., a<sub>k - 1</sub>} (12)
*{'''a<sub>1</sub>''', '''a<sub>k2</sub>''', '''a<sub>2k</sub>''', a<sub>3</sub>, ..., a<sub>k - 1</sub>} (2)
*{a<sub>1</sub>, '''a<sub>2</sub>''', '''a<sub>k3</sub>''', '''a<sub>3k</sub>''', ..., a<sub>k - 1</sub>}
{a<sub>1</sub>, a<sub>2</sub>, '''a<sub>3</sub>''', '''a<sub>k</sub>''', *$..., a<sub>k - 1</sub>}.......................$
$*{a<sub>1</sub>, a<sub>2</sub>, a<sub>3</sub>, ..........................$, '''a<sub>k</sub>''', a<sub>k - 1</sub>}
{a<sub>1</sub>, a<sub>2</sub>, a<sub>3</sub>, ..., '''a<sub>k</sub>''', a<sub>k - 1</sub>} *{a<sub>1</sub>, a<sub>2</sub>, a<sub>3</sub>, ..., '''a<sub>k - 1</sub>''', '''a<sub>k</sub>'''} (3)
Получим $k$ различных перестановок, отличающихся в одной транспозиции. Возьмем следующую строку из кода Грея для перестановок длиной $n = k - 1$, которая будет выглядеть так (т.к. мы получили, что элемент стоящий на первом месте в перестановке будет "двигаться" вправо см. (1), (2), то и во второй перестановке первый элемент "поменяется" со вторым):
Элемент $a_{k}$ записываем в конец и начинаем "двигать" влево, меняя его с правостоящим:
*{a<sub>2</sub>, a<sub>1</sub>, a<sub>3</sub>, ..., a<sub>k - 1</sub>, a<sub>k</sub>} (4) *{a<sub>2</sub>, a<sub>1</sub>, a<sub>3</sub>, ..., '''a<sub>k</sub>''', '''a<sub>k - 1</sub>'''} *.......................... *{a<sub>2</sub>, a<sub>1</sub>, a<sub>3</sub>, '''a<sub>k</sub>''', ..., a<sub>k - 1</sub>} *{a<sub>2</sub>, a<sub>1</sub>, '''a<sub>k</sub>''', '''a<sub>3</sub>''', ..., a<sub>k - 1</sub>} *{a<sub>2</sub>, '''a<sub>k</sub>''', '''a<sub>1</sub>''', a<sub>3</sub>, ..., a<sub>k - 1</sub>} *{'''a<sub>k</sub>''', '''a<sub>2</sub>''', a<sub>1</sub>, a<sub>3</sub>, ..., a<sub>k - 1</sub>}
Опять получили $k$ различных перестановок, отличающихся в одной транспозиции. Далее берем третью строку из кода Грея для перестановок длиной $n = k - 1$, записываем в ее начало элемент $a_{k}$ и двигаем его вправо, как для первой перестановки и т.д.
{1, 2}
Тогда следуя алгоритму полученный код будет выглядеть так(жирным выделены элементы, которые поменялись):
* {3, 2, 1} берем первую перестановку и добавляем в начало тройку
== Псевдокод получения следующего кода Грея ==
Пусть нам известен код Грея для длины $n-1$, записанный в массив pred_perest[i](j), где $i$ - номер перестановки, $j$ - номер элемента этой перестановки (номерация начинается с единицы).
t := false; {булевская переменная отвечающая за порядок перебора true: от начала к концу false: от конца к началу}
94
правки

Навигация