Коды Грея
Определение: |
Код Грея (Gray code) — такое упорядочение | -ичных (обычно двоичных) векторов, что соседние вектора отличаются только в одном разряде.
Код назван в честь Фрэнка Грея, который в 1947-ом году получил патент на "отражённый двоичный код".
Алгоритм построения
Существует несколько видов кода Грея, самый простой из них — так называемый зеркальный двоичный код Грея. Строится он так:
Для получения кода длины
производится шагов. На первом шаге код имеет длину и состоит из двух векторов и . На каждом следующем шаге в конец списка заносятся все уже имеющиеся вектора в обратном порядке, и затем к первой половине получившихся векторов дописывается , а ко второй . С каждым шагом длина векторов увеличивается на , а их количество — вдвое. Таким образом, количество векторов длины равноПсевдокод
buildCode(n): GrayCode[1, n] = 0 GrayCode[2, n] = 1 // Построение кода длины 1 p = 2 // Где p — количество уже имеющихся кодов for i = 2 to n t = p p = p * 2 for k = (p / 2 + 1) to p GrayCode[k] = GrayCode[t] // Отражение имеющихся кодов GrayCode[t, n + 1 - i] = 0 GrayCode[k, n + 1 - i] = 1 // Добавление 0 и 1 в начало t--
|
Доказательство правильности работы алгоритма
По индукции:
- на первом шаге код отвечает условиям
- предположим, что код, получившийся на -ом шаге, является кодом Грея
- тогда на шаге : первая половина кода будет корректна, так как она совпадает с кодом с шага за исключением добавленного последнего бита . Вторая половина тоже соответствует условиям, так как она является зеркальным отражением первой половины, только добавлен везде бит . На стыке: первые бит совпадают в силу зеркальности, последние различны по построению.
Таким образом, этот код — код Грея. Индукционное предположение доказано, алгоритм работает верно.
Этот алгоритм можно обобщить и для
-ичных векторов. Также известен алгоритм преобразования двоичного кода в код Грея.Существует ещё несколько видов кода Грея — сбалансированный код Грея, код Баркера-Грея, одноколейный код Грея.[1] Кроме того, коды Грея используются для упорядочения перестановок.
Явная формула для получения зеркального двоичного кода Грея
Теорема: |
В двоичном зеркальном коде Грея -ый код может быть получен по формуле при нумерации кодов с нуля. |
Доказательство: |
Для кода длиной бит утверждение проверяется непосредственно.Пусть существует зеркальный двоичный код Грея длины , для которого выполнено, что для любогоОбозначим за код длины , полученный из описанным выше алгоритмом. Тогда:Для любого Для любого , где , то есть
Таким образом, шаг индукции доказан, следовательно, теорема верна. |
Специальные типы кодов Грея
Сбалансированный код Грея
Несмотря на то, что зеркальный двоичный код Грея полезен во многих случаях, он не является оптимальным в некоторых ситуациях из-за отсутствия "однородности". В сбалансированном коде Грея, количество изменений в различных координатных позициях сделаны максимально приближенными настолько, насколько это возможно. Чтобы показать это точнее, пусть
— это -ичный полный цикл Грея, имеющий последовательность перехода ; отсчёты переходов (спектры) являются наборами целых чисел, определенных как . Код Грея является однородным или равномерно сбалансированным, если все его отсчёты переходов равны, и в этом случае у нас есть для всех . Ясно, что при , такие коды существуют только при . В противном случае, если не делится на равномерно, то можно построить сбалансированные коды Грея, где каждый отсчёт перехода либо либо . Коды Грея также могут быть экспоненциально сбалансироваными, если все их отсчеты переходов являются смежными степеням двойки, и такие коды существуют для каждой степени двойки.Однодорожечный код Грея
Еще один вид кода Грея — это однодорожечный код Грея. Разработан Спеддингом и уточнен Хильтгеном, Патерсоном и Брандестини. Однодорожечный код Грея является циклическим списком уникальных двоичных кодировок длины
так, что два последовательных слова отличаются ровно в одной позиции, и когда список рассматривается как матрица, каждая колонка — это циклический сдвиг первого столбца. Название происходит от их использования датчиками вращения, где количество дорожек в настоящее время измеряется с помощью контактов, в результате для каждой дорожки на выход подаётся или . Чтобы снизить уровнень шума различных контактов не переключаясь в тот же момент времени, один датчик предпочтительно устанавливает дорожки так, что выход данных от контактов находится в коде Грея. Чтобы получить высокую угловую точность, нужно много контактов; для достижения точности хотя бы в градус нужно, по крайней мере, различных позиций на оборот, который требует минимум бит данных, и тем самым такое же количество контактов.Применение
Фрэнк Грей изобрел метод для преобразования аналоговых сигналов в отраженные двоичные кодовые группы с использованием аппарата на основе вакуумной трубки. Способ и устройство были запатентованы в 1953 году, а код получил название код Грея. "PCM трубка" — аппарат, запатентованный Греем, был сделан Раймондом У. Сирсом из Bell Labs, работая с Греем и Уильямом М. Гудоллом.
- В технике коды Грея используются для минимизации ошибок при преобразовании аналоговых сигналов в цифровые (например, в датчиках-энкодерах). В частности, коды Грея и были открыты в связи с этим применением. (Код Грея — это код преобразования бинарных символов в -арные, такие, что двоичные последовательности, соответствующие соседним символам (сдвигам фаз), отличаются только одним битом. Обычная бинарная кодировка сравнивается с кодировкой Грея. При появлении ошибки в -арном символе наиболее вероятными являются ближайшие соседние символы, отличающиеся от переданного лишь одним битом, если используется кодировка Грея. Таким образом, высока вероятность того, что при кодировании с помощью кода Грея в случае возникновения ошибки ошибочным будет только один из переданных битов.)
- Коды Грея используются для кодирования номера дорожек в жёстких дисках.
- Код Грея можно использовать также и для решения задачи о Ханойских башнях:
Задача: |
Пусть | — количество дисков. Начнём с кода Грея длины , состоящего из одних нулей (т.е. ), и будем двигаться по кодам Грея (от переходить к ). Поставим в соответствие каждому -ому биту текущего кода Грея -ый диск (причём самому младшему биту соответствует наименьший по размеру диск, а самому старшему биту — наибольший). Поскольку на каждом шаге изменяется ровно один бит, то мы можем понимать изменение бита как перемещение -го диска. Заметим, что для всех дисков, кроме наименьшего, на каждом шаге имеется ровно один вариант хода (за исключением стартовой и финальной позиций). Для наименьшего диска всегда имеется два варианта хода, однако имеется стратегия выбора хода, всегда приводящая к ответу: если нечётно, то последовательность перемещений наименьшего диска имеет вид (где — стартовый стержень, — финальный стержень, — оставшийся стержень), а если чётно, то
- Коды Грея широко применяются в теории генетических алгоритмов для кодирования генетических признаков, представленных целыми числами.
- Коды Грея используются в Картах Карно (при передаче в карту переменные сортируются в код Грея).