Алфавитное кодирование

Алфавитное кодирование — вид кодирования слов некоторого алфавита при помощи замены каждой буквы некоторым словом того же или какого-либо другого алфавита[1]. Основоположником этого направления в России[прояснить] считается математик из Нижнего Новгорода Александр Александрович Марков[2]. В алфавитном кодировании преимущественно используются[прояснить] префиксные коды, так как свойство префикса гарантирует однозначную декодируемость[3].

Описание

Пусть заданы конечный алфавит (множество) и конечный алфавит .

Схемой[4] алфавитного кодирования называется отображение , где — множество всех непустых слов алфавита . Слова называются элементарными кодами схемы . Множество слов называется кодирующей системой слов. Алфавитным кодированием называется отображение , определяемое следующим образом:

[1]

Слово называется кодом слова [5]. Также термином «код» часто обозначают множество всех элементарных кодов[5]. Иногда кодируемый алфавит считают упорядоченным и кодом называют кортеж из соответствующих элементарных кодов. Такой код может содержать повторения и, по сути, полностью определяет алфавитное кодирование[6].

Термином побуквенное кодирование некоторые авторы называют схему алфавитного кодирования[7], а некоторые само алфавитное кодирование[8].

Взаимо-однозначное кодирование

Алфавитное кодирование называется взаимо-однозначным, если у отображения существует обратное[9]. Также используются термины разделимый код[7] и однозначно-декодируемый код[10].

Равномерное кодирование

Простейший пример взаимо-однозначного алфавитного кодирования — равномерное кодирование. Равномерное кодирование — такое алфавитное кодирование, при котором элементарные коды для разных символов различны и имеют одинаковую длину[5]. Минимальная длина элементарных кодов при равномерном кодировании для заданных кодируемого алфавита и кодирующего алфавита равна , где [11].

Равномерное кодирование за счёт использования слов одинаковой длины позволяет очень легко декодировать слова, а также легко находить нужную позицию оригинального слова в закодированном слове. Однако такое кодирование может быть довольно неэкономичным, многие неравномерные кодирования позволяют получить более короткие коды для тех же слов[12]. Примеры равномерных кодирований в информатике: ASCII, UTF-32.

Префиксное и постфиксное кодирование

Алфавитное кодирование называется префиксным, если для него выполняется следующее условие, называемое (прямым) условием Фано: для любых двух символов кодируемого алфавита ни один из их элементарных кодов не является префиксом другого[10].

Алфавитное кодирование называется постфиксным, если для него выполняется следующее условие, называемое обратным условием Фано: для любых двух символов кодируемого алфавита ни один из их элементарных кодов не является постфиксом другого[13].

Префиксное и постфиксное кодирование являются взаимо-однозначными[13]. Равномерное кодирование является частным случаем как префиксного, так и постфиксного кодирования. Префиксный код называется полным, если для каждого префикса элементарного кода и для каждого символа существует элементарный код с префиксом . Постфиксный код называется полным, если для каждого постфикса элементарного кода и для каждого символа существует элементарный код с постфиксом [14].

Если для набора длин существует взаимо-однозначное алфавитное кодирование со схемой , элементарные коды которого имеют указанные длины, то есть , то тогда существует префиксное (постфиксное) кодирование, элементарные коды которого имеют указанные длины. Поэтому, задачу о существовании взаимо-однозначного кодирования с заданными длинами элементарных кодов можно свести к задаче о существование префиксного (постфиксного) кодирования с заданными длинами элементарных кодов[15].

Примеры префиксных и постфиксных кодов (одновременно) в информатике: UTF-8, UTF-16.

Кодовое дерево

Для префиксных (постфиксных) кодов существует способ представлять их графически в виде дерева. Такое дерево называется кодовым деревом. Каждой дуге дерева приписывается символ кодирующего алфавита, причём из одной вершины может выходить только одна дуга с определённым символом. Такое дерево задаёт множество элементарных кодов префиксного (постфиксного) кодирования следующим образом. Каждой листовой вершине соответствует элементарный код, который определяется по пути от корня до этой вершины: он получается приписыванием символов дуг этого пути от корня до листа (от листа до корня). Каждый префиксный (постфиксный) код можно представить в виде такого дерева и каждое такое дерево задаёт префиксный (постфиксный) код. Схема кодирования (а значит и само алфавитное кодирование) задаётся приписыванием к каждой из листовых вершин соответствующего символа кодируемого алфавита[16].

Вершины кодового дерева, по сути, соответствуют префиксам (постфиксам) элементарных кодов, который можно получить тем же способом, что и элементарный код, соответствующий листовой вершине. Корневой вершине соответствует пустое слово.

Неконцевая вершина кодового дерева называется насыщенной, если из неё выходит ровно дуг, где — количество символов кодирующего алфавита. Кодовое дерево называется полным, если каждая неконцевая вершина является насыщенной. Префиксный (постфиксный) код является полным тогда и только тогда, когда его кодовое дерево полно. Кодовое дерево называется насыщенным, если все неконцевые вершины насыщенные, кроме, возможно, одной, лежащей в предпоследнем ярусе дерева, количество дуг, исходящих из которой, равно . Такая вершина называется исключительной. Если у насыщенного дерева нет исключительной вершины, то считается равным . однозначно определяется, по количеству символов алфавитов [17][18].

Критерий взаимной однозначности

Теорема, доказанная Александром Марковым, позволяет свести вопрос о взаимной однозначности кодирования всех слов алфавита к вопросу о взаимной однозначности кодирования некоторого конечного множества слов алфавита . Для её формулировки понадобится ввести предварительные обозначения:

  • — длина кода слова , где — все символы алфавита ;
  • для каждого элементарного кода рассматриваются разложения вида , отличные от разложения вида , где — другие элементарные коды, , а — произвольные слова в алфавите , отличные от элементарных кодов. Тогда определяется как максимум по всем таким разложениям.

Теорема Маркова в этих обозначениях формулируется так:

существует такое , что проблема взаимной однозначности кодирования сводится к проблеме взаимной однозначности кодирования слов, длины не более, чем N[19].

В оригинальном докладе Маркова определялась следующим образом:

,

где для чётных равна , а для нечётных [1].

Теорема позволяет алгоритмически решить проблему взаимной однозначности алфавитного кодирования простым перебором всех слов длины до , однако даже для довольно простых кодирований количество слов, которое нужно перебрать, может оказаться настолько огромным, что алгоритм будет неприменим на практике[20].

Алгоритм проверки однозначности декодирования

Более эффективный алгоритм проверки взаимной-однозначности кодирования был сформулирован Марковым на языке теории графов.

  1. Рассматриваются все разложения кодовых слов вида , отличные от разложения вида , где — другие элементарные коды, , а — произвольные слова в алфавите , отличные от элементарных кодов.
  2. Строится ориентированный граф следующим образом. В качестве вершин берутся все слова такие, что входит и в некоторое разложение в качестве , и в некоторое разложение (возможно другое) в качестве . Также к множеству вершин обязательно добавляется пустое слово. Из вершины исходит дуга в вершину тогда и только тогда, когда существует разложение с .
  3. Алфавитное кодирование является взаимно-однозначным тогда и только тогда, когда построенный граф не содержит ориентированных циклов, проходящих через вершину, являющуюся пустым словом[22].

Неравенство Крафта — Макмиллана

Для взаимо-однозначных кодирований выполняется Неравенство Крафта — Макмиллана:

,

где есть длина элементарного кода [23]. Неравенство Крафта — Макмиллана является необходимым и достаточным условием того, что для и заданного набора длин ( и могут совпадать для ) существует взаимо-однозначное (и даже префиксное) кодирование, для которого — длина элементарного кода [24].

Оптимальное кодирование

Пусть на кодируемом алфавите задано распределение вероятностей, то есть каждому символу сопоставлено число так, что . Средней длиной[25] элементарного кода или стоимостью[7] кодирования называется математическое ожидание длины элементарного когда:

Для заданных и распределении вероятностей на взаимо-однозначное кодирование называется оптимальным[26] или кодированием с минимальной избыточностью[11], если оно имеет минимальную среднюю длину элементарного кода среди всех взаимо-однозначных алфавитных кодирований . Оптимальное кодирование существует для любых , и даже существует префиксное и постфиксное оптимальное кодирование. Пример оптимального префиксного кодирования для заданных код Хаффмана[26]. Некоторые авторы называют кодом Хаффмана любое оптимальное кодирование[11].

Для двух символов кодируемого алфавита таких, что , в оптимальном кодирование выполняется . В кодовом дереве оптимального префиксного кодирования вероятности символов кодируемого алфавита, приписанные листовым вершинам меньшего яруса не больше, чем вероятности символов, приписанные листовым вершинам большего яруса[27]. Среди оптимальных кодов существует префиксный код с насыщенным кодовым деревом[28].

Приведённым кодом называется оптимальный префиксный код, дерево которого насыщенно и листовых вершин, соответствующих минимальных вероятностей, присоединены к исключительной вершине (а если исключительной вершины нет, то таких листовых вершин присоединены к одной произвольной вершине предпоследнего яруса; она и будет считаться исключительной вершиной для приведённого кода). Среди оптимальных кодов существует приведённый код[29].

Код Хаффмана

Идея построения кода Хаффмана строится на следующей теореме об оптимальных префиксных кодах. Для её формулировки нужно будет ввести дополнительные термины.

Пусть кодовое дерево префиксного кода получается из кодового дерева префиксного кода следующим образом:

  1. Берётся некоторая концевая вершина , к которой приписана вероятность .
  2. К дереву добавляется какое-то количество новых концевых вершин, к которым ведутся дуги из .
  3. Новым вершинам ставятся в соответствие некоторые вероятности , удовлетворяющие условию .

Тогда говорят, что префиксный код получен из префиксного кода путём замены концевой вершины пучком рёбер[30].

Если оптимальный префиксный код получен из префиксного кода путём замены концевой вершины пучком рёбер, то код — тоже оптимальный. Если префиксный код получен из оптимального префиксного кода путём замены концевой вершины пучком из рёбер и вероятности добавленных вершин являются наименьшими вероятностями в дереве , то тоже оптимален[31]. Это свойство позволяет сформулировать алгоритм построения оптимального префиксного кода:

  1. Пока это возможно проводится замена списка вероятностей на более меньший. Делается это так: на первой итерации берётся наименьших вероятностей и складывается, на последующих шагах берётся наименьших вероятностей и складывается. Затем, вероятности, использованные в сумме, убираются из списка, а полученная сумма добавляется в нужную позицию этого списка так, чтобы упорядоченность списка не нарушалась.
  2. Когда вероятностей в списке осталось слишком мало, чтобы продолжать их замену, строится кодовое дерево префиксного кода для полученного списка вероятностей. Это дерево состоит из корня и листовых вершин; к каждой из листовых вершин проведена дуга из корня и каждой приписана одна вероятность из списка. Очевидно, это является оптимальным кодированием для нового списка вероятностей.
  3. Далее замены списка вероятностей начинают выполняться в обратную сторону. При каждой итерации происходит замена листовой вершины, соответствующей заменяемой вероятности из списка, пучком рёбер, количество и вероятности новых концевых вершин которого соответствуют добавленным вероятностям в список.
  4. Так происходит до того, как будет достигнут оригинальный список вероятностей. Кодовое дерево искомого оптимального префиксного кода построено[32].

Код, полученный в результате этого алгоритма, называется кодом Хаффмана.

Примечания

  1. 1 2 3 Марков, 1960, с. 521.
  2. Дергач П. С. Алфавитное кодирование регулярных языков с полиномиальной функцией роста : [арх. 29 января 2023] // Московский государственный университет им. М.В.Ломоносова. Диссертация на соискание ученой степени кандидата физико-математических наук. — 2016.
  3. Корабельщикова С.Ю., Мельников Б.Ф. Максимальные префиксные коды и подклассы класса контекстно-свободных языков // Arctic Environmental Research. — 2015. — С. 121—129. — УДК 519.713.
  4. Яблонский, 2008, с. 257-258.
  5. 1 2 3 Яблонский, 2008, с. 258.
  6. Васильев, 1974, с. 211-212.
  7. 1 2 3 Чашкин, 2007, с. 180.
  8. Васильев, 1974, с. 211.
  9. Яблонский, 2008, с. 260.
  10. 1 2 Поляков, 2012, с. 17.
  11. 1 2 3 Яблонский, 2008, с. 277.
  12. Поляков, с. 17.
  13. 1 2 Поляков, 2012, с. 18.
  14. Чашкин, 2007, с. 182.
  15. Яблонский, 2008, с. 275.
  16. 1 2 Яблонский, 2008, с. 278.
  17. Яблонский, 2008, с. 278-279.
  18. Чашкин, 2007, с. 181-182.
  19. Яблонский, 2008, с. 263-264.
  20. Яблонский, 2008, с. 268.
  21. Яблонский, 2008, с. 271.
  22. Яблонский, 2008, с. 268-269.
  23. Яблонский, 2008, с. 272.
  24. Яблонский, 2008, с. 274-275.
  25. Яблонский, 2008, с. 276.
  26. 1 2 Чашкин, 2007, с. 183.
  27. Яблонский, 2008, с. 279.
  28. Яблонский, 2008, с. 280.
  29. Яблонский, 2008, с. 282.
  30. Яблонский, 2008, с. 282-283.
  31. Яблонский, 2008, с. 283.
  32. Яблонский, 2008, с. 285.

Литература

  • Яблонский С. В. Введение в дискретную математику. — 5-е изд. — М.: Высшая школа, 2008. — 384 с. — ISBN 978-5-06-005943-4.
  • Васильев Ю. Л., Ветухновский Ф. Я., Глаголев В. В., Журавлёв Ю. И., Левеншейн В. И., Яблонский С. В. Дискретная математика и математические вопросы кибернетика. Том 1. — М.: Наука, 1974. — 312 с.
  • Марков А. А. Об алфавитном кодировании : [арх. 29 января 2023] // Доклады Академии наук СССР. — 1960. — Т. 132, № 3. — С. 521–523.
  • К. Ю. Поляков. Ещё раз про однозначное декодирование // Информатика : Журнал. — 2012. — 1 декабря (№ 11). — С. 16-20.
  • Чашкин А. В. Лекции по дискретной математике. — М., 2007. — 261 с.
  • Марков А. А. Вопросы взаимной однозначности и сложности в алфавитном кодировании : Автореф. дис. … д-ра физ.-мат. наук. — М., 1983. — 17 с.
  • Марков А. А. Кодирование алфавитное // Математическая энциклопедия. — М.: Советская энциклопедия, 1979. — Т. 2. — С. 935—937.