Коды Грея для перестановок — различия между версиями
Niko (обсуждение | вклад) (→Сведение задачи построение кода Грея для перестановок к графам) |
Niko (обсуждение | вклад) (→Построения Кода Грея для перестановок) |
||
Строка 55: | Строка 55: | ||
Построение. Кроме рабочей перестановки <tex>r</tex> и её номера в факториальной системе <tex>t</tex> (младший разряд - последний) потребуется иметь массив <tex>d</tex>, задающий текущее направления движения всех элементов. Удобно еще иметь массив, сопоставляющий каждому элементу <tex>i</tex> то место <tex>p_i</tex>, на котором стоит <tex>i</tex> стоит в перестановке <tex>r</tex>. | Построение. Кроме рабочей перестановки <tex>r</tex> и её номера в факториальной системе <tex>t</tex> (младший разряд - последний) потребуется иметь массив <tex>d</tex>, задающий текущее направления движения всех элементов. Удобно еще иметь массив, сопоставляющий каждому элементу <tex>i</tex> то место <tex>p_i</tex>, на котором стоит <tex>i</tex> стоит в перестановке <tex>r</tex>. | ||
− | Начальное состояние. | + | ''Начальное состояние.'' |
<tex> r = (1, 2, ..., k); </tex> | <tex> r = (1, 2, ..., k); </tex> | ||
<tex> p = (1, 2, ..., k); </tex> | <tex> p = (1, 2, ..., k); </tex> | ||
<tex> t = (0, 0, ..., 0); </tex> | <tex> t = (0, 0, ..., 0); </tex> | ||
<tex> d = (-1, -1, ..., -1); </tex> | <tex> d = (-1, -1, ..., -1); </tex> | ||
+ | |||
+ | ''Стандартный шаг.'' Увеличить вектор <tex>t</tex> на 1. При этом несколько младших разрядов получат нулевые значения, а в одном из разрядов, <tex>j</tex>-м, значение увеличится на 1 (при <tex>j = 1</tex> процесс заканчивается). Сменить направление движения всех элементов младше <tex>j</tex>-го, т.е. положить <tex>d_i</tex> для <tex>i > j </tex>. Поменять местами <tex>j</tex>-й элемент и соседний и соседний с ним (если <tex>d_j = -1</tex> - левый, иначе - правый). | ||
+ | [[Файл:123.png]] | ||
+ | Элемент <tex>j</tex> стоит на месте <tex>s = p_i</tex>. Это значит, что <tex>r_s = j</tex>. Соседнее место - это <tex>s' = p_i + d_j</tex>. На нем стоит какой-то элемент <tex>j' = r_s' </tex>. Поменять местами в перестановке элементы <tex>j</tex> и <tex>j'</tex> означает поменять местами содержимое <tex>p_i</tex> и <tex>p_j'</tex>, a также <tex>r_s</tex> и <tex>r_s'</tex>. | ||
== '''Сведение задачи построение кода Грея для перестановок к графам''' == | == '''Сведение задачи построение кода Грея для перестановок к графам''' == |
Версия 23:17, 9 декабря 2010
код Грея для перестановки при n = 2
1 2 2 1 |
код Грея для перестановки при n = 3
1 2 3 2 1 3 2 3 1 3 2 1 3 1 2 1 3 2 |
код Грея для перестановки при n = 4
1 2 3 4 2 1 3 4 2 3 1 4 2 3 4 1 3 2 4 1 3 2 1 4 3 1 2 4 1 3 2 4 1 3 4 2 3 1 4 2 3 4 1 2 3 4 2 1 4 3 2 1 4 3 1 2 4 1 3 2 1 4 3 2 1 4 2 3 4 1 2 3 4 2 1 3 4 2 3 1 2 4 3 1 2 4 1 3 2 1 4 3 1 2 4 3 |
Содержание
Определение
Коды Грея для перестановок - называют такое упорядочение перестановок, что соседние перестановки отличаются только элементарной транспозицией.
Построения Кода Грея для перестановок
Строим из рекурсивных соображений. При фиксированной перестановки из
элемента можно перебрать все вариантов добавления к этой перестановке элемента , и этот перебор можно осуществить передвигая элемент каждый раз на соседнее место, Например3652147 -> 3652174 -> 3652714 -> 3657214 и т. д.
На фоне перебора позиций
-го элемента должны проводиться переборы перестановок меньшего порядка, к которым применяется тот же принцип, т.е., например в нашем случае после получения набора 7365214 требуется сдвинуть влево или вправо элемент 6.Действовать будем так. Каждые
итерации будем давать команду на сдвиг -го элемента, а затем менять направление движения его на противоположное и будем давать команду на сдвиг элемента с меньшим номером; для этих выделенных итераций нужно делать то же самое: на из них двигать -й элемент, а на -й итерации сменить ему направление движения, и т.д.Построение. Кроме рабочей перестановки
и её номера в факториальной системе (младший разряд - последний) потребуется иметь массив , задающий текущее направления движения всех элементов. Удобно еще иметь массив, сопоставляющий каждому элементу то место , на котором стоит стоит в перестановке .Начальное состояние.
Стандартный шаг. Увеличить вектор
на 1. При этом несколько младших разрядов получат нулевые значения, а в одном из разрядов, -м, значение увеличится на 1 (при процесс заканчивается). Сменить направление движения всех элементов младше -го, т.е. положить для . Поменять местами -й элемент и соседний и соседний с ним (если - левый, иначе - правый).Элемент
стоит на месте . Это значит, что . Соседнее место - это . На нем стоит какой-то элемент . Поменять местами в перестановке элементы и означает поменять местами содержимое и , a также и .Сведение задачи построение кода Грея для перестановок к графам
Последовательность перестановок, полученная с помощью данного алгоритма имеет интересную интерпретацию. Так, если рассмотреть граф, вешины которого соответствуют всем перестановкам и в котором две вершины, соответствующие перестановкам
и , соединены ребром, если образуется из однократной транспозицией соседних элементов, то полученная последовательность является гамильтоновым путем в этом графе. На рисунке изображен граф последовательности для = 3, 4.