Стирающий код

Материал из testwiki
Перейти к навигации Перейти к поиску

Стирающий код[1] (Шаблон:Lang-en) — в теории кодирования помехоустойчивый код[1], способный восстановить целые пакеты данных в случае их потери[2]. Такой код позволяет бороться с утечками данных при передаче по каналам связи или работе с памятью. Обычно он используется, когда точная позиция потерянных данных известна априори[3].

Графическое представление процессов кодирования и декодирования.
Графическое представление процессов кодирования и декодирования

Принцип работы

Стирающий код преобразует сообщение из k символов в более длинное сообщение (кодовое слово) из n символов так, что исходное сообщение может быть восстановлено по k любым символам. Такой код называется (n,k) кодом, выражение r=k/n — кодовой долей[4], выражение k/k — эффективностью приёма[5][6].

Стирающий код обычно используется на верхних уровнях стека протоколов каналов передачи и хранения информации[3].

Оптимальный стирающий код

Оптимальный стирающий отличается тем, что любых k из n символов кодового слова достаточно для восстановления исходного сообщения[7], то есть они имеют оптимальную эффективность приёма[5][8].

Проверка чётности

Рассмотрим случай, когда n=k+1. С помощью набора из k значений {vi}1ik вычисляется контрольная сумма и добавляется к k исходным значениям:

vk+1=i=1kvi.

Теперь в набор {vi}1ik+1 из k+1 значений включена контрольную сумму. В случае потери одного из значений ve, его можно будет с лёгкостью восстановить с помощью суммирования оставшихся:

ve=i=1,iek+1vi.

Более сложные комбинации искомых и получаемых значений представляют собой Граф Таннера[4][5].

Линейный код

Важным подклассом стирающего кода является линейный код. Его название связано с тем, что он может быть проанализирован с помощью линейной алгебры. Пусть x=x0xk1 — исходные данные, G — матрица размера n×k, тогда закодированные данные (n,k)- кода могут быть представлены как y=Gx. Предположим, что приёмник получил k компонент вектора y, тогда исходные данные могут быть восстановлены с помощью k уравнений, связанных с известными компонентами вектора y. Пусть матрица G размера k×k соответствует этой системе уравнений. Восстановление возможно, если все эти уравнения линейно независимые и, в общем случае, это означает, что любая матрица размера k×k обратима. Матрица G называется генерирующей матрицей кода, так как любой допустимый y может быть получен как линейная комбинация столбцов матрицы G. Так как её ранг равен k, то любое подмножество из k закодированных элементов должно содержать информацию о всех k исходных данных. Для получения исходных данных необходимо решить линейную систему: y=Gx, где y — подмножество из k элементов вектора y, доступных на приёмнике[9].

Полиномиальная передискретизация

Пример: Неисправная электронная почта (Шаблон:Lang-en)

В случае, когда k=2, избыточные символы могут быть созданы как промежуточные точки на отрезке, соединяющем два исходных символа. Это показано на простом примере, называемом неисправной электронной почтой:

Алиса посчитала значения f(1) и f(2)

Алиса хочет отправить свой телефонный номер (555629) Бобу, используя неисправную электронную почту. Данный вид почты работает так же, как обычная электронная почта, за следующим исключением:

  1. Около половины всех сообщений теряются.
  2. Сообщения длиннее 5 символов запрещены.
  3. Это очень дорого.

Вместо того, чтобы спросить у Боба подтверждения сообщения, которое она отправила, Алиса придумывает следующую схему:

  1. Она разбивает свой телефонный номер на две части a=555,b=629 и отправляет 2 сообщения Бобу — «A=555» и «B=629».
  2. Она строит линейную функцию f(i)=a+(ba)(i1), в этом примере f(i)=555+74(i1). Таким образом f(1)=555 и f(2)=629.
  3. Она считает значения f(3)=703,f(4)=777 и f(5)=851, а затем отправляет три избыточных сообщения: «C=703», «D=777» и «E=851».

Боб знает, что выражение для f(k) следующее f(i)=a+(ba)(i1), где a и b — две части телефонного номера. Теперь предположим, что Боб получает «D=777» и «E=851».

Боб получает два сообщения с f(4) и f(5)

Боб может восстановить телефонный номер Алисы с помощью a и b, используя значения f(4) и f(5), которые он получил. Более того, он может это сделать, используя два любых полученных сообщения. Значит, в этом примере кодовая доля равна 40 %. Заметим, что Алиса не может закодировать свой номер телефона только в одном сообщении такой почты, так как он состоит из 6 символов, а максимальная длина одного сообщения — 5 символов. Если бы она отправляла свой номер телефона по частям, запрашивая подтверждения каждой части от Боба, то было бы отправлено минимум 4 сообщения (два от Алисы и два подтверждения от Боба)[5][10].

Общий случай

Приведённая выше линейная конструкция может быть обобщена до полиномиальной интерполяции. В таком случае точки теперь вычисляются над конечным полем 𝔽2m, где m — число бит в символе. Отправитель нумерует символы данных от 0 до k1 и посылает их. Затем он строит, например, интерполяционный многочлен Лагранжа p(x) степени k, так что p(i) равен i-ому символу данных. Потом он отправляет p(k),,p(n1). С помощью полиномиальной интерполяции получатель сможет восстановить потерянные данные в случае, если он успешно принял k символов[5].

Реализация в реальном мире

Данный процесс реализован в Коде Рида — Соломона с кодовыми словами, сконструированными над конечным полем при использовании определителя Вандермонда[11].

Почти оптимальный стирающий код

Почти оптимальный стирающий код требует (1+ε)k символов, чтобы восстановить сообщение (где ε>0). Величина ε может быть уменьшена за счёт дополнительного времени работы процессора. При использовании таких кодов необходимо решить, что предпочтительнее: сложность вычислений или возможность коррекции сообщений[11]. В 2004 году существовал только один почти оптимальный стирающий код с линейным временем кодирования и декодирования — Шаблон:Не переведено 5[8].

Применение

Стирающие коды применяются в[11]:

Примеры

Здесь приведены некоторые примеры различных кодов.

Почти оптимальные стирающие коды

Оптимальные стирающие коды

Примечания

Шаблон:Примечания

Литература