Коды Грея — различия между версиями
Gromak (обсуждение | вклад) м  | 
				Gromak (обсуждение | вклад)   (Небольшие косметические изменения и добавление псевдокода)  | 
				||
| Строка 35: | Строка 35: | ||
  1000  |   1000  | ||
|}  | |}  | ||
| − | '''Код Грея''' - такое упорядочение <tex>k</tex>-ичных (обычно двоичных) векторов, что соседние вектора отличаются только в одном разряде.    | + | == Определение ==  | 
| − | Код назван в честь Фрэнка Грея, который в 1947 году получил патент на "  | + | |
| + | {{Определение  | ||
| + | |neat = 1  | ||
| + | |definition =  | ||
| + | '''Код Грея (Gray code)''' {{---}} такое упорядочение <tex>k</tex>-ичных (обычно двоичных) векторов, что соседние вектора отличаются только в одном разряде. }}  | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | Код назван в честь Фрэнка Грея, который в 1947-ом году получил патент на "отражённый двоичный код". Изначально он предназначался для избавления от паразитных состояний в электромеханических переключателях, однако сейчас область его применения гораздо шире.  | ||
== Алгоритм построения ==    | == Алгоритм построения ==    | ||
| − | Существует несколько видов Кода Грея, самый простой из них {{---}} так называемый зеркальный двоичный Код Грея  | + | Существует несколько видов Кода Грея, самый простой из них {{---}} так называемый зеркальный двоичный Код Грея. Строится он так:    | 
| − | Для получения кода длины <tex>n</tex> производится <tex>n</tex> шагов. На первом шаге код имеет длину 1 и состоит из двух векторов (0) и (1). На каждом следующем шаге в конец списка заносятся все уже имеющиеся вектора в обратном порядке, и затем к первой половине получившихся векторов дописывается "0", а ко второй - "1". С каждым шагом длина векторов увеличивается на 1,   | + | Для получения кода длины <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>  | ||
| Строка 50: | Строка 60: | ||
* на первом шаге код отвечает условиям    | * на первом шаге код отвечает условиям    | ||
| − | * предположим, что получившийся   | + | * предположим, что код, получившийся на <tex>i</tex>-ом шаге, является Кодом Грея  | 
* тогда на шаге <tex>i + 1</tex>: первая половина кода будет корректна, так как она совпадает с кодом с шага <tex>i</tex> за исключением добавленного последнего бита 0. Вторая половина тоже соответствует условиям, так как она является зеркальным отражением первой половины, только добавлен везде бит 1. На стыке: первые <tex>i</tex> бит совпадают в силу зеркальности, последние различны по построению.    | * тогда на шаге <tex>i + 1</tex>: первая половина кода будет корректна, так как она совпадает с кодом с шага <tex>i</tex> за исключением добавленного последнего бита 0. Вторая половина тоже соответствует условиям, так как она является зеркальным отражением первой половины, только добавлен везде бит 1. На стыке: первые <tex>i</tex> бит совпадают в силу зеркальности, последние различны по построению.    | ||
Таким образом, этот код {{---}} Код Грея. Индукционное предположение доказано, алгоритм работает верно.    | Таким образом, этот код {{---}} Код Грея. Индукционное предположение доказано, алгоритм работает верно.    | ||
| + | === Псевдокод ===   | ||
| + | |||
| + | <font size=3>  | ||
| + |   buildCode(n):  | ||
| + |     GrayCode[1, n] = 0  | ||
| + |     GrayCode[2, n] = 1  | ||
| + |     p = 2  | ||
| + |     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, n + 1 - i] = 1  | ||
| + | </font>  | ||
Этот алгоритм можно обобщить и для <tex>k</tex>-ичных векторов. Также известен алгоритм преобразования двоичного кода в Код Грея.    | Этот алгоритм можно обобщить и для <tex>k</tex>-ичных векторов. Также известен алгоритм преобразования двоичного кода в Код Грея.    | ||
Версия 02:47, 31 октября 2011
 2-битный код Грея
00 01 11 10  | 
 3-битный код Грея
000 001 011 010 110 111 101 100  | 
 4-битный код Грея
0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000  | 
Определение
Код назван в честь Фрэнка Грея, который в 1947-ом году получил патент на "отражённый двоичный код". Изначально он предназначался для избавления от паразитных состояний в электромеханических переключателях, однако сейчас область его применения гораздо шире.
Алгоритм построения
Существует несколько видов Кода Грея, самый простой из них — так называемый зеркальный двоичный Код Грея. Строится он так: Для получения кода длины производится шагов. На первом шаге код имеет длину 1 и состоит из двух векторов (0) и (1). На каждом следующем шаге в конец списка заносятся все уже имеющиеся вектора в обратном порядке, и затем к первой половине получившихся векторов дописывается "0", а ко второй — "1". С каждым шагом длина векторов увеличивается на 1, а их количество — вдвое. Таким образом, количество векторов длины равно
Доказательство правильности работы алгоритма
По индукции:
- на первом шаге код отвечает условиям
 - предположим, что код, получившийся на -ом шаге, является Кодом Грея
 - тогда на шаге : первая половина кода будет корректна, так как она совпадает с кодом с шага за исключением добавленного последнего бита 0. Вторая половина тоже соответствует условиям, так как она является зеркальным отражением первой половины, только добавлен везде бит 1. На стыке: первые бит совпадают в силу зеркальности, последние различны по построению.
 
Таким образом, этот код — Код Грея. Индукционное предположение доказано, алгоритм работает верно.
Псевдокод
 buildCode(n):
   GrayCode[1, n] = 0
   GrayCode[2, n] = 1
   p = 2
   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, n + 1 - i] = 1
Этот алгоритм можно обобщить и для -ичных векторов. Также известен алгоритм преобразования двоичного кода в Код Грея.
Существует ещё несколько видов Кода Грея — сбалансированный Код Грея, код Беккета-Грея, одноколейный Код Грея.
Применение
Код Грея применяется в:
- датчиках-энкодерах ( устройства, преобразующие угол поворота вала в электрический сигнал );
 
- как способ решения задачи о Ханойских башнях ( дано три стержня, на первом из них нанизано 8 колец разного размера в виде пирамиды; цель — перенести
 
пирамиду на другой стержень, сохранив упорядоченность );
- в генетических алгоритмах;
 
- в Картах Карно ( при передаче в карту переменные сортируются в Код Грея );
 
- в кодах, исправляющих ошибки;
 
- для связи систем с различной частотой работы.