Опубликован: 08.04.2009 | Уровень: для всех | Доступ: платный
Лекция 12:

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

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

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

Зачем вообще нужны коды с разной длиной кодовых слов? Дело в том, что на практике разные символы алфавита встречаются с разной частотой, и выгодно закодировать частые символы короткими словами. (Это соображение, кстати, учитывалось при составлении азбуки Морзе.)

Пусть для каждой буквы a алфавита A фиксирована ее частота p(a) - положительное число, причем суммы частот всех букв равны единице. Тогда для любого кода \alpha можно определить среднюю длину этого кода как сумму

E = \sum p(a) |\alpha(a)|
по всем буквам a\in A, где |\alpha(a)| - длина кодового слова \alpha(a) буквы a. (Смысл этого определения: если в слове длины N буква a встречается с частотой p(a), то таких букв будет Np(a) и на их кодирование уйдет Np(a)|\alpha(a)| битов; общая длина кода будет \sum
Np(a)|\alpha(a)| и в среднем на кодирование каждой буквы уйдет E битов.)

Теперь возникает задача: для данных частот построить однозначный код минимальной средней длины. Теоретически это можно сделать перебором (если в коде есть хотя бы одно очень длинное кодовое слово, то его средняя длина велика, поэтому такие коды можно не рассматривать; остается конечное число вариантов). Но можно обойтись и без перебора, и в этом разделе мы научимся это делать.

Для начала поймем, что мешает нам выбирать кодовые слова короткими. Оказывается, что есть ровно одно препятствие: длины n_1,\ldots,n_k кодовых слов должны удовлетворять неравенству

2^{-n_1} + 2^{-n_2} + \ldots + 2^{-n_k} \le 1,
называемому в теории кодирования неравенством Крафта Макмиллана.

12.2.1. Проверить, что оно выполнено для рассмотренных выше примеров однозначных кодов.

12.2.2. Доказать, что для всякого префиксного кода выполняется неравенство Крафта-Макмиллана.

Решение. Отрезок [0,1] можно разбить на две половины. Назовем левую I_0, а правую I_1. Каждую из них разобьем пополам: отрезок I_0 разделится на левую половину I_{00} и правую I_{01}, аналогично I_1 делится на I_{10} и I_{11}. И так далее: любому двоичному слову x соответствует отрезок I_x. Длина этого отрезка есть 2^{-|x|}, где |x| - длина слова x. Если слово x является началом слова y, то отрезок I_x содержит отрезок I_y ; если ни одно из слов x и y не является началом другого, то отрезки I_x и I_y не перекрываются (на том знаке, где x и y впервые расходятся, I_x и I_y попадают в разные половины).

Рассмотрим теперь отрезки, соответствующие словам префиксного кода. Они не перекрываются. А значит, сумма их длин не больше единицы, что и дает неравенство Крафта-Макмиллана.

12.2.3. Пусть даны k целых положительных чисел n_1,\ldots,n_k, удовлетворяющие неравенству Крафта-Макмиллана. Доказать, что можно построить префиксный код для k -буквенного алфавита с длинами кодовых слов n_1,\ldots,n_k.

Решение. И здесь полезно использовать соответствие между словами и отрезками и представлять себе дело так: у нас есть единичный отрезок [0,1], и мы выделяем его части пользователям по требованию. Если пользователь приходит с числом n_i, то это значит, что ему надо выдать в пользование один из отрезков длиной 2^{-n_i}, соответствующих кодовым словам длины n_i. (Тем самым годятся не любые отрезки такой длины, а лишь " правильно расположенные".) Код должен быть префиксным, это значит, что отрезки разных пользователей не должны перекрываться. Нам дано, что суммарная длина всех требований не больше единицы. Как их удовлетворить? Можно отводить место слева направо, при этом рассматривать требования в порядке убывания длин (тогда более короткие отрезки будут правильно расположены после предыдущих более длинных).

12.2.4. Показать, что выделять кодовые слова (место на отрезке) можно и в порядке поступления требований (как иногда говорят, в "режиме on-line"): пользователь приходит с числом n_i и уходит с правильно расположенным отрезком длины 2^{-n_i}, причем если выполнено неравенство Крафта Макмиллана, то никто не уйдет обиженным (всем хватит места, и перераспределять его не придется).

Указание. Нужно поддерживать свободное пространство как объединение правильно расположенных отрезков попарно различных длин, выделяя каждому пользователю кусок из кратчайшего подходящего отрезка и доразбивая остаток.

12.2.5. Показать, что неравенство Крафта-Макмиллана выполняется не только для любого префиксного кода, но и вообще для любого однозначного кода. (Именно это доказал Макмиллан; Крафт доказал неравенство для префиксных кодов.)

Решение. Есть разные способы решить эту задачу; мы приведем простое и красивое, хотя и несколько загадочное, решение. Пусть имеется однозначный код с k кодовыми словами P_1,\ldots,P_k. Нам надо доказать, что их длины n_i=|P_i| удовлетворяют неравенству Крафта-Макмиллана. Представим себе, что вместо нулей и единиц используются символы a и b (какая разница, из чего составлять коды?). Запишем формально сумму всех кодовых слов как алгебраическое выражение

P_1 + P_2 + \ldots + P_k
(многочлен от a и b, в котором одночлены записаны как произведения переменных a и b, без возведения в степень). Теперь (еще более странное на первый взгляд действие) возведем это выражение в степень N (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах:
(P_1+P_2+\ldots+P_k)^N=\text{сумма одночленов}.
Например, для кода со словами 0, 10, 11 (которые теперь записываются как a,ba,bb ) и для N=2 получаем
\begin{multiline*}
(a+ba+bb)^2= (a+ba+bb)(a+ba+bb) = {} \\
{} = aa + aba + abb + baa +baba+ babb + bba + bbba + bbbb.
        \end{multiline*}
В этом примере все одночлены в правой части различны (если не переставлять переменные), и это не случайно: так будет для любого однозначного кода. В самом деле, по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов.

Теперь подставим a=b=1/2 в наше равенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится

(2^{-n_1} + 2^{-n_2} + \ldots + 2^{-n_k})^N
(в скобке как раз выражение из неравенства Крафта Макмиллана). Правую часть мы оценим сверху, сгруппировав слова по длинам: имеется не более 2^l слагаемых длины l, каждое из которых равно 2^{-l}, и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть N\max n_i. Итак, получаем, что
(2^{-n_1} + 2^{-n_2} + \ldots + 2^{-n_k})^N  < N max n_i,
и это верно при любом N. Если основание степени в левой части больше единицы, то при больших N это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому для однозначного кода выполняется неравенство Крафта-Макмиллана.

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Татьяна Новикова
Татьяна Новикова
Россия, Пошатово
Artem Bardakov
Artem Bardakov
Россия