Изменения

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

Коды антигрея

4919 байт добавлено, 10:14, 13 сентября 2018
Псевдокод
== Определение ==
 
{{Определение
|definition=
'''Код антигрея ''' (англ. ''Anti-Gray Code)''' ) {{---}} такое упорядочивание <tex>k</tex>-ичных векторов, что [[расстояние Хэмминга]] между двумя соседними векторами максимально.
}}
Код антигрея может использоваться для обнаружения неисправностей в устройстве при переходе в соседнее состояние. Часто используется в приборах, устанавливающихся на улице. Такое кодирование позволяет вовремя выявить поломку или какое-то загрязнение и своевременно устранить неисправность.
== Двоичный код антигрея ==
{{Определение
|definition=
'''Двоичный код антигрея''' (англ. ''Binary Anti-Gray Code'') {{---}} такое упорядочивание двоичных векторов длины <tex>n</tex>, что соседние отличаются не менее, чем в <tex>n-1</tex> битах.
}}
 Заметим: упорядочивание векторов такое, что соседние отличаются во всех битах, возможно только для <tex>n > 2= 1</tex> невозможно такое упорядочивание двоичных векторов, что соседние отличаются во всех битах. Объясняется это Это объясняется тем, что для двоичного вектора существует ровно один вектор, отличающийся во всех битах. А , а в последовательности их , где <tex>n > 1</tex>, таких векторов должно быть 2два.
=== Пример ===
=== Псевдокод ===
  '''function''' genBinAntiGray(n: '''int'''): '''for ''' i = 1 '''to ''' 2^** (n-1)
v = getMirrorGray(i, n)
print(v)
inverseBits(v)
print(v)
 
=== Доказательство корректности алгоритма ===
 
Обозначим за <tex>G_i</tex> — <tex>i</tex>-ый вектор в зеркальном коде Грея, <tex>\overline G_i</tex> — его инверсию.
Тогда вектора будут располагаться в таком порядке:
:<tex>\dots</tex> <br>
:<tex>G_i</tex> <br>
:<tex>\overline G_i</tex> <br>
:<tex>G_{i+1}</tex> <br>
:<tex>\overline G_{i+1}</tex> <br>
:<tex>G_{i+2}</tex> <br>
:<tex>\dots</tex>
<tex>G_i</tex> и <tex>\overline G_i</tex> отличаются во всех битах. <br>
Если <tex>G_i</tex> и <tex>G_{i+1}</tex> отличаются в <tex>k</tex>-ом бите, то инверсия <tex>G_i</tex> совпадает с <tex>G_{i+1}</tex> только в <tex>k</tex>-ом бите. То есть <tex>\overline G_i</tex> и <tex>G_{i+1}</tex> отличаются во всех позициях, кроме <tex>k</tex>-ой.
== Троичный код антигрея ==
{{Определение
|definition=
'''Троичный код антигрея''' (англ. ''Ternary Anti-Gray Code'') {{---}} такое упорядочивание троичных векторомвекторов, что соседние отличаются во всех разрядах.
}}
В отличие от двоичного кода антигрея, здесь мы не сталкиваемся с проблемой однозначности "соседа" и можем привести такой код, соседние элементы которого будут отличаться во всех разрядах.
 
=== Алгоритм генерации ===
 
Упорядочим все троичные вектора лексикографически. Тогда для первых <tex>3^{n-1}</tex> векторов будем выводить сначала сам этот вектор, потом <tex>2</tex> его поразрядных циклических сдвига (каждый отдельный бит увеличиваем на <tex>1</tex>).
<br>Например, если мы имеем вектор <tex>021</tex>, то вы выведем: <tex>021</tex>, <tex>102</tex>, <tex>210</tex>.
 
Утверждается, что выполняя эти действия мы получим троичный код антигрея.
В отличие от двоичного кода антигрея, здесь мы не сталкиваемся с проблемой однозначности === Псевдокод ===<code> '''function''' genTernAntiGray(n: '''int'''): '''for''' v = <000..0> '''to''' <022..2> <span style="соседаcolor:Green" и можем привести такой код>// троичные вектора длины <tex>n</tex> </span> '''for''' i = 0 '''to''' 2 print(v) digitCircleShift(v)</code>Заметим, соседние элементы которого будут отличаться во всех разрядахчто данный алгоритм можно обобщить на случай <tex>k</tex>-ичного кода антигрея.
=== Пример Примеры работы алгоритма ===
{| class="wikitable"
!stylecolspan="width:45px2" align="center"| n = 1 !stylecolspan="width:45px2" align="center"| n = 2 !colspan="3" align="center" style="width:135px"| n = 3
|-
!align="center"| 0 Первые <tex>3^{n-1}</tex><br>векторов !align="center"|Коды антигрея !align="center"| 00 Первые <tex>3^{n-1}</tex><br>векторов !align="center"|Коды антигрея !align="center"| 000 Первые <tex>3^{n-1}</tex><br>векторов !colspan="2" align="center"|| 010 || 020Коды антигрея
|-
| 1 '''0''' || 11 '''0''' || 111 '''00''' || 121 '''00''' || 101'''000''' || '''000''' || 200
|-
| 2 || 22 1 || 222 '''01''' || 202 11 || 212'''001''' || 111 || '''012'''
|-
| || 01 2 || 001 '''02''' || 011 22 || 021'''002''' || 222 || 120
|-
| || 12 || 112 || 122 '''01''' || 102'''010''' || '''001''' || 201
|-
| || 20 || 220 || 200 12 || 210'''011''' || 112 || '''020'''
|-
| || 02 || 002 || 20 || '''012 ''' || 220 || 022101
|-
| || 10 || 110 || 120 '''02''' || 100'''020''' || '''002''' || 212
|-
| || || || 10 || '''021''' || 110 || '''021'''|-| || || || 21 || '''022''' || 221 || 201 102|-| || || || || || '''010''' || 210|-| || || || || || 121 || '''022'''|-| || || || || || 202 || 100|-| || || || || || '''011''' || 211|-| || || || || || 122 ||
|}
=== Алгоритм генерации Доказательство корректности алгоритма === Упорядочим все троичные вектора лексикографически. Тогда для первых <tex>3^{n-1}</tex> векторов будем выводить все его поразрядные циклические сдвиги.
УтверждаетсяОбозначим <tex>i</tex>-ый троичный вектор как <tex>G_i^0</tex>, что выполняя эти действия мы получим троичный код антигреяего первый и второй циклический сдвиги как <tex>G_i^1</tex> и <tex>G_i^2</tex> соответственно.Получаем вектора в следующем порядке::<tex>\dots</tex> <br>=== Псевдокод ===:<tex>G_i^0</tex> <br>:<tex>G_i^1</tex> <br>:<tex>G_i^2</tex> <br>:<tex>G_{i+1}^0</tex> <br> genTernAntiGray(n):<tex>\dots</tex> for v = <tex >G_i^000..0</tex> to и <022tex>G_i^1</tex>, равно как <tex>G_i^1</tex> и <tex>G_i^2</tex>, отличаются во всех битах..2<br> digitCircleShift(v) while(v[Если говорить о векторах как о троичных числах, то <tex>G_{i+1}^0</tex> получено из <tex>G_i^0] != </tex> прибавлением единицы, это значит, что у <tex>G_{i+1}^0) print</tex> несколько разрядов справа на единицу больше (vпо модулю <tex>3</tex>) digitCircleShift, чем у <tex>G_i^0</tex> (vпо правилам сложения в столбикЗаметим. С другой стороны <tex>G_{i}^2</tex> получено из <tex>G_{i}^0</tex> двумя циклическими сдвигами вперёд, что данный алгоритм равносильно одному циклическому сдвигу назад. Таким образом, в числе <tex>G_{i+1}^0</tex> некоторые биты такие же, как в <tex>G_{i}^0</tex>, остальные на единицу больше; в числе <tex>G_{i}^2</tex> все биты на один меньше по сравнению с <tex>G_{i}^0</tex>, значит <tex>G_{i}^2</tex> и <tex>G_{i+1}^0</tex> различны во всех битах.Подобные рассуждения можно обобщить на случай провести для любого <tex>k</tex>-ичного кода антигрея, где <tex>k \geqslant 3</tex>.
== См. также ==
*[[Цепные коды]]
== Источники информации == *[http://en.wikipedia.org/wiki/Gray_code Wikipedia {{---}} Gray code] [[Категория: Дискретная математика и алгоритмы]]
*[http://en.wikipedia.org/wiki/Talk%3AGray_code#Anti-Gray_Codes.3F Talk[Категория:Gray Code - Wikipedia, the free encyclopediaКомбинаторика]]
Анонимный участник

Навигация