"Информатика (базовый и углублённый уровень)", Гейн А.Г., Сенокосов А.И.
При передаче или хранении сообщения отдельные биты могут измениться. Чтобы заметить искажение или восстановить исходные данные, к ним добавляют контрольные символы: это увеличивает длину сообщения, но делает его надёжнее. Кодовое слово с такими символами проверяют по заранее заданным правилам или сравнивают с допустимыми словами. Возможности кода определяет расстояние Хэмминга: оно показывает, сколько ошибок код способен обнаружить и исправить.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Ошибка передачи — изменение одного или нескольких символов исходного сообщения при хранении или передаче. Например, вместо бита 0 может быть получен бит 1. Этот термин нужен, чтобы отличать сбой в канале или памяти от ошибки при составлении самого сообщения.
Кодовое слово — последовательность символов, полученная после кодирования сообщения и предназначенная для передачи. В неё могут входить как исходные данные, так и добавленные для контроля разряды. Кодовые слова нужны, чтобы задавать правила, по которым получатель проверяет сообщение.
Контрольный разряд — символ, добавленный к данным для проверки заранее установленного условия, например чётности числа единиц. Получатель пересчитывает значение условия и сравнивает его с требуемым. Такой разряд помогает заметить часть ошибок, хотя сам по себе не всегда показывает, где именно возникло искажение.
Расстояние Хэмминга — число позиций, в которых различаются два кодовых слова. Например, у слов 101 и 111 расстояние равно единице: различается только вторая позиция. Минимальное расстояние между всеми допустимыми словами позволяет оценить, сколько ошибок код обнаруживает и сколько способен исправить.
Избыточные символы добавляют потому, что по одним только исходным данным часто невозможно понять, изменился ли бит: полученное слово может выглядеть вполне допустимым. Дополнительные разряды задают связи между битами, которые должны выполняться у правильного слова. Если после передачи связь нарушилась, получатель замечает искажение; если код содержит достаточно проверочной информации, можно также определить верный вариант. За надёжность приходится платить увеличением длины сообщения.
В коде с повторением каждый символ передают несколько раз: например, 0 становится 000, а 1 — 111. При декодировании группу делят на тройки и выбирают значение, встретившееся чаще, потому что одна случайная перемена бита не меняет большинство. Для троек это исправляет одиночную ошибку в каждой группе. Однако объём данных утраивается, а при двух искажениях из трёх голосование уже может выбрать неправильный бит.
Для проверки на чётность к данным приписывают разряд так, чтобы общее число единиц стало чётным; можно заранее договориться и о нечётном числе. Получатель пересчитывает единицы, поскольку одиночное изменение бита меняет чётность и выдаёт ошибку. Если изменились два бита, чётность может снова оказаться прежней: изменения взаимно сохраняют общий признак. Поэтому такая проверка обнаруживает любое нечётное число ошибок, но не гарантирует обнаружение чётного.
Возможности кода связаны с минимальным расстоянием d — наименьшим расстоянием между любыми двумя разными допустимыми словами. Если искажено меньше d разрядов, принятое слово не может превратиться в другое допустимое слово, поэтому можно обнаружить до d − 1 ошибок. Для исправления нужно выбрать ближайшее допустимое слово; оно определяется однозначно, если число ошибок не больше ⌊(d − 1)/2⌋. Например, при d = 3 код обнаруживает до двух ошибок и исправляет одну.
В семибитном коде Хэмминга контрольные разряды занимают позиции 1, 2 и 4 — степени двойки; остальные позиции отводятся данным. Каждая проверка включает те разряды, в номере позиции которых соответствующий двоичный разряд равен 1. Полученные результаты собирают в синдром: его значение указывает номер ошибочной позиции, если произошла одиночная ошибка. Тогда достаточно изменить бит в указанной позиции; нулевой синдром означает, что проверки не выявили ошибки.
| Характеристика | Код с повторением | Код с проверкой чётности | Код Хэмминга |
|---|---|---|---|
| Как создаётся избыточность | Каждый бит повторяется несколько раз | Добавляется разряд чётности | Добавляются контрольные разряды для групп позиций |
| Какие ошибки обнаруживает | Для троек — до двух ошибок в группе | Любое нечётное число ошибок | В стандартном коде — до двух ошибок при отдельном обнаружении |
| Какие ошибки исправляет | Для троек — одну ошибку в группе | Не исправляет | Одну ошибку |
| Минимальное расстояние между кодовыми словами | 3, если каждый бит повторён трижды | 2 | 3 для стандартного кода (7,4) |
| Основной способ декодирования | Голосование большинства | Проверка чётности | Вычисление синдрома |
| Преимущество | Простое исправление одиночного сбоя | Мало контрольных данных | Исправляет одиночную ошибку при умеренной избыточности |
| Ограничение | Сильно увеличивает объём передачи | Не указывает позицию ошибки и может пропустить чётное число ошибок | Одиночное исправление не гарантирует правильный результат при нескольких ошибках |
Сравнивайте код не только по числу контрольных разрядов, но и по его минимальному расстоянию: именно оно задаёт пределы обнаружения и исправления. Строки о способе декодирования показывают, как получатель использует добавленную информацию. Для стандартных вариантов указаны типичные свойства; другие версии кода могут иметь иные параметры.
Задача 1. Для сообщения 101 сформировать код с проверкой чётности при условии, что общее число единиц должно быть чётным. Определить, обнаружит ли получатель искажение одного разряда. Здесь сначала нужно посчитать единицы в данных, а затем подобрать контрольный разряд так, чтобы после добавления правило выполнялось.
Ответ: кодовое слово — 1010. Искажение одного разряда проверка обнаружит, потому что чётность изменится. Само правило при этом не сообщает, какой именно разряд нужно исправить.
Задача 2. Сообщение 10 передали кодом повторения: каждый бит заменили тремя одинаковыми битами. Получено слово 101000. Нужно восстановить исходное сообщение. При решении важно сначала отделить группы, относящиеся к разным исходным битам, и лишь затем выбирать значение большинства в каждой группе.
Ответ: восстановленное сообщение — 10. Первая тройка содержит одиночное искажение, которое не изменило большинство. Во второй тройке искажения нет.
Задача 3. В принятом семибитном кодовом слове Хэмминга результаты контрольных проверок образовали двоичное число 101. Определить позицию ошибки и исправить слово. Позиции контрольных битов — 1, 2 и 4, поэтому синдром читают как номер позиции в двоичной записи; здесь подразумевается обычный порядок разрядов, в котором 101 означает пять.
Ответ: ошибочен разряд 5; исправленное слово получается заменой его пятого бита на противоположный. Конкретную семибитную запись после исправления нельзя назвать без самого принятого слова, но место и действие определяются однозначно.
Считать, что контрольный разряд всегда исправляет ошибку. Его нередко принимают за универсальное средство, потому что он позволяет проверить сообщение. Но обычная проверка чётности только сообщает, что условие нарушено, и не показывает, какой бит изменить. Проверяйте себя вопросом: указано ли в коде, как определить позицию ошибки?
Утверждать, что проверка чётности обнаруживает любое количество ошибок. Это кажется правдоподобным, если рассматривать только одиночный сбой. Однако при изменении чётного числа битов общая чётность может сохраниться. Для проверки возьмите пример с двумя изменёнными битами и пересчитайте число единиц.
Путать число контрольных разрядов с числом исправляемых ошибок. Большее число добавленных битов само по себе не говорит, сколько сбоев можно исправить: имеют значение правила кода и расстояние между допустимыми словами. Ошибку допускают, когда оценивают код только по длине контрольной части. Сначала определите минимальное расстояние d, затем примените формулу ⌊(d − 1)/2⌋.
Автоматически заменять принятое слово ближайшим допустимым. При небольшом числе ошибок такой выбор может быть правильным, поэтому метод кажется универсальным. Но если искажений больше, ближайшее слово может оказаться не исходным, а несколько вариантов могут быть одинаково близки. Перед исправлением проверьте, укладывается ли число ошибок в исправляющую способность кода и единственен ли ближайший вариант.
Для работы с кодами ошибок нужны двоичная система счисления и понимание операций с битами. Тема также связана с передачей сообщений по каналу, где возможны искажения. В теории информации избыточность рассматривают как плату за достоверность: контрольные данные не несут новых сведений о сообщении, но помогают проверить его или восстановить. Такие методы применяют в сетевых протоколах, памяти компьютеров, QR-кодах, на дисках, в спутниковой и мобильной связи.
Почему нельзя просто повторять каждый бит много раз?
Повторение помогает исправлять ошибки голосованием, но заметно увеличивает объём данных и время передачи. Кроме того, если в одной группе изменится слишком много битов, большинство может оказаться неправильным. Поэтому для больших сообщений применяют более экономные коды.
Чем обнаружение ошибки отличается от её исправления?
Обнаружение означает, что проверка показывает: принятое слово не соответствует правилам кода. Исправление требует ещё и определить, каким должно быть правильное слово. Для исправления нужна большая избыточность или более сильные свойства кода.
Почему проверка чётности может не заметить две ошибки?
При изменении двух битов общее число единиц меняется на чётное число, поэтому чётность может остаться прежней. Проверка тогда не отличит искажённое слово от правильного. Она гарантированно обнаруживает нечётное число ошибок, но не любое искажение.
Как по минимальному расстоянию определить возможности кода?
Если минимальное расстояние между допустимыми кодовыми словами равно d, код обнаруживает до d − 1 ошибок. Он исправляет до ⌊(d − 1)/2⌋ ошибок, потому что принятое слово должно оставаться ближе к исходному кодовому слову, чем к любому другому.
Почему в коде Хэмминга контрольные разряды ставят именно в позициях 1, 2, 4, 8 и далее?
Это степени двойки, поэтому номера позиций можно представить как набор двоичных разрядов. Каждая проверка отвечает за один разряд такого номера, и вместе результаты проверок указывают позицию ошибки. Так место одиночной ошибки можно определить без отдельной проверки каждой позиции.
§ 17. Коды, обнаруживающие и исправляющие ошибки