Коды Грея — различия между версиями
Gromak (обсуждение | вклад) (Предлагаю такой конечный вариант конспекта. Без большой таблицы, создающей множество проблем.) |
Gromak (обсуждение | вклад) (Исправление недочётов) |
||
Строка 13: | Строка 13: | ||
Существует несколько видов Кода Грея, самый простой из них {{---}} так называемый зеркальный двоичный Код Грея. Строится он так: | Существует несколько видов Кода Грея, самый простой из них {{---}} так называемый зеркальный двоичный Код Грея. Строится он так: | ||
− | Для получения кода длины <tex>n</tex> производится <tex>n</tex> шагов. На первом шаге код имеет длину 1 и состоит из двух векторов (0) и (1). На каждом следующем шаге в конец списка заносятся все уже имеющиеся вектора в обратном порядке, и затем к первой половине получившихся векторов дописывается "0", а ко второй | + | Для получения кода длины <tex>n</tex> производится <tex>n</tex> шагов. На первом шаге код имеет длину 1 и состоит из двух векторов (0) и (1). На каждом следующем шаге в конец списка заносятся все уже имеющиеся вектора в обратном порядке, и затем к первой половине получившихся векторов дописывается "0", а ко второй "1". С каждым шагом длина векторов увеличивается на 1, а их количество {{---}} вдвое. |
Таким образом, количество векторов длины <tex>n</tex> равно <tex>2^n.</tex> | Таким образом, количество векторов длины <tex>n</tex> равно <tex>2^n.</tex> | ||
Строка 19: | Строка 19: | ||
{| border="0" | {| border="0" | ||
|align="left" colspan="4"| | |align="left" colspan="4"| | ||
+ | GrayCode {{---}} двухмерный массив, в котором GrayCode[a, b] {{---}} <tex>b</tex>-ый бит в <tex>a</tex>-ом коде Грея. | ||
<font size=3> | <font size=3> | ||
buildCode(n): | buildCode(n): | ||
GrayCode[1, n] = 0 | GrayCode[1, n] = 0 | ||
− | GrayCode[2, n] = 1 | + | GrayCode[2, n] = 1 {построение кода длины 1} |
− | p = 2 | + | p = 2 {p {{---}} количество уже имеющихся кодов} |
for (i = 2, i <= n, i++): | for (i = 2, i <= n, i++): | ||
− | + | p = p * 2 | |
for (k = i + 1, k <= 2 * i, k++): | for (k = i + 1, k <= 2 * i, k++): | ||
− | GrayCode[k] = GrayCode[p + 1 - k] | + | GrayCode[k] = GrayCode[p + 1 - k] {отражение имеющихся кодов} |
− | GrayCode[k, n + 1 - i] = 1 | + | GrayCode[k - i, n + 1 - i] = 0 |
+ | GrayCode[k, n + 1 - i] = 1 {добавление 0 и 1 в начало} | ||
</font> | </font> | ||
|} | |} | ||
Строка 50: | Строка 52: | ||
|id = th1. | |id = th1. | ||
|statement = | |statement = | ||
− | В двоичном зеркальном коде Грея <tex>i</tex>-ый код может быть получен по формуле <tex>G_i = i \oplus (i \ | + | В двоичном зеркальном коде Грея <tex>i</tex>-ый код может быть получен по формуле <tex>G_i = i \oplus (\lfloor i / 2 \rfloor)</tex> при нумерации кодов с нуля. |
|proof = | |proof = | ||
− | Для кода длиной 1 бит утверждение | + | Для кода длиной 1 бит утверждение проверяется непосредственно. |
− | Пусть существует зеркальный двоичный код Грея <tex>M</tex> длины <tex>n</tex>, для которого выполнено <tex> | + | |
+ | Пусть существует зеркальный двоичный код Грея <tex>M</tex> длины <tex>n</tex>, для которого выполнено, что для любого <tex>i \enskip M_i = i \oplus (\lfloor i / 2 \rfloor)</tex> | ||
Обозначим за <tex>L</tex> код длины <tex>n + 1</tex>, полученный из <tex>M</tex> описанным выше алгоритмом. Тогда: | Обозначим за <tex>L</tex> код длины <tex>n + 1</tex>, полученный из <tex>M</tex> описанным выше алгоритмом. Тогда: | ||
− | <tex> | + | Для любого <tex>x < 2^n \enskip L_x = 0M_x = 0(x_{n-1}x_{n-2}...x_{0} \oplus 0x_{n-1}x_{n-2}...x_{1}) =</tex> |
− | <tex> 0x_{n-1}x_{n-2}...x_{0} \oplus 00x_{n-1}x_{n-2}...x_{1} = x \oplus (x \ | + | <tex> 0x_{n-1}x_{n-2}...x_{0} \oplus 00x_{n-1}x_{n-2}...x_{1} = x \oplus (\lfloor x / 2 \rfloor)</tex> |
− | <tex> | + | Для любого <tex>x \geq 2^n \enskip L_x = 1M_y</tex>, где <tex>y = 2^{n+1} - 1 - x = \neg x</tex>, то есть |
<tex>L_x = 1(\neg x_{n-1} \neg x_{n-2}... \neg x_{0} \oplus 0 \neg x_{n-1} \neg x_{n-2}... \neg x_{1}) =</tex> | <tex>L_x = 1(\neg x_{n-1} \neg x_{n-2}... \neg x_{0} \oplus 0 \neg x_{n-1} \neg x_{n-2}... \neg x_{1}) =</tex> | ||
Строка 67: | Строка 70: | ||
<tex>= 1(x_{n-1}x_{n-2}...x_{0} \oplus 1x_{n-1}x_{n-2}...x_{1}) = 1x_{n-1}x_{n-2}...x_{0}</tex> | <tex>= 1(x_{n-1}x_{n-2}...x_{0} \oplus 1x_{n-1}x_{n-2}...x_{1}) = 1x_{n-1}x_{n-2}...x_{0}</tex> | ||
<tex> \oplus 01x_{n-1}x_{n-2}...x_{1} = x_{n}x_{n-1}x_{n-2}...x_{0} \oplus 0x_{n}x_{n-1}x_{n-2}...x_{1} =</tex> | <tex> \oplus 01x_{n-1}x_{n-2}...x_{1} = x_{n}x_{n-1}x_{n-2}...x_{0} \oplus 0x_{n}x_{n-1}x_{n-2}...x_{1} =</tex> | ||
− | <tex> x \oplus (x \ | + | <tex> x \oplus (\lfloor x / 2 \rfloor)</tex> |
− | Таким образом, | + | Таким образом, шаг индукции доказан, следовательно, теорема верна. |
}} | }} | ||
Строка 76: | Строка 79: | ||
Код Грея применяется в: | Код Грея применяется в: | ||
− | * датчиках-энкодерах ( устройства, преобразующие угол поворота вала в электрический сигнал ) | + | * датчиках-энкодерах (устройства, преобразующие угол поворота вала в электрический сигнал) |
− | * как способ решения задачи о Ханойских башнях ( дано три стержня, на первом из них нанизано 8 колец разного размера в виде пирамиды; цель {{---}} перенести пирамиду на другой стержень, сохранив упорядоченность ); | + | * как способ решения задачи о Ханойских башнях (дано три стержня, на первом из них нанизано 8 колец разного размера в виде пирамиды; цель {{---}} перенести пирамиду на другой стержень, сохранив упорядоченность); |
− | * в генетических алгоритмах | + | * в генетических алгоритмах |
− | * в Картах Карно ( при передаче в карту переменные сортируются в Код Грея ) | + | * в Картах Карно (при передаче в карту переменные сортируются в Код Грея) |
− | * в кодах, исправляющих ошибки | + | * в кодах, исправляющих ошибки |
* для связи систем с различной частотой работы. | * для связи систем с различной частотой работы. | ||
Версия 03:25, 7 ноября 2011
Содержание
Определение
Определение: |
Код Грея (Gray code) — такое упорядочение | -ичных (обычно двоичных) векторов, что соседние вектора отличаются только в одном разряде.
Код назван в честь Фрэнка Грея, который в 1947-ом году получил патент на "отражённый двоичный код". Изначально он предназначался для избавления от паразитных состояний в электромеханических переключателях, однако сейчас область его применения гораздо шире.
Алгоритм построения
Существует несколько видов Кода Грея, самый простой из них — так называемый зеркальный двоичный Код Грея. Строится он так: Для получения кода длины
производится шагов. На первом шаге код имеет длину 1 и состоит из двух векторов (0) и (1). На каждом следующем шаге в конец списка заносятся все уже имеющиеся вектора в обратном порядке, и затем к первой половине получившихся векторов дописывается "0", а ко второй "1". С каждым шагом длина векторов увеличивается на 1, а их количество — вдвое. Таким образом, количество векторов длины равноПсевдокод
GrayCode — двухмерный массив, в котором GrayCode[a, b] — -ый бит в -ом коде Грея.buildCode(n): GrayCode[1, n] = 0 GrayCode[2, n] = 1 {построение кода длины 1} p = 2 {p — количество уже имеющихся кодов} for (i = 2, i <= n, i++): p = p * 2 for (k = i + 1, k <= 2 * i, k++): GrayCode[k] = GrayCode[p + 1 - k] {отражение имеющихся кодов} GrayCode[k - i, n + 1 - i] = 0 GrayCode[k, n + 1 - i] = 1 {добавление 0 и 1 в начало}
|
Доказательство правильности работы алгоритма
По индукции:
- на первом шаге код отвечает условиям
- предположим, что код, получившийся на -ом шаге, является Кодом Грея
- тогда на шаге : первая половина кода будет корректна, так как она совпадает с кодом с шага за исключением добавленного последнего бита 0. Вторая половина тоже соответствует условиям, так как она является зеркальным отражением первой половины, только добавлен везде бит 1. На стыке: первые бит совпадают в силу зеркальности, последние различны по построению.
Таким образом, этот код — Код Грея. Индукционное предположение доказано, алгоритм работает верно.
Этот алгоритм можно обобщить и для
-ичных векторов. Также известен алгоритм преобразования двоичного кода в Код Грея.Существует ещё несколько видов Кода Грея — сбалансированный Код Грея, код Беккета-Грея, одноколейный Код Грея.
Явная формула для получения зеркального двоичного кода Грея
Теорема: |
В двоичном зеркальном коде Грея -ый код может быть получен по формуле при нумерации кодов с нуля. |
Доказательство: |
Для кода длиной 1 бит утверждение проверяется непосредственно. Пусть существует зеркальный двоичный код Грея длины , для которого выполнено, что для любогоОбозначим за код длины , полученный из описанным выше алгоритмом. Тогда:Для любого Для любого , где , то есть
Таким образом, шаг индукции доказан, следовательно, теорема верна. |
Применение
Код Грея применяется в:
- датчиках-энкодерах (устройства, преобразующие угол поворота вала в электрический сигнал)
- как способ решения задачи о Ханойских башнях (дано три стержня, на первом из них нанизано 8 колец разного размера в виде пирамиды; цель — перенести пирамиду на другой стержень, сохранив упорядоченность);
- в генетических алгоритмах
- в Картах Карно (при передаче в карту переменные сортируются в Код Грея)
- в кодах, исправляющих ошибки
- для связи систем с различной частотой работы.