Опубликован: 08.04.2009 | Доступ: свободный | Студентов: 485 / 0 | Длительность: 17:26:00
Специальности: Программист
Лекция 12:

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

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

12.4. Код Шеннона-Фано

Мы видели, как можно построить оптимальный код (имеющий минимальную среднюю длину) для данного набора частот. Однако эта конструкция не дает никакой оценки для средней длины оптимального кода (как функции от частот p_i ). Следующие задачи указывает такую оценку (с абсолютной погрешностью не более 1 ).

12.4.1. Показать, что для любых положительных частот p_1,\ldots,p_k (в сумме равных единице) существует код средней длиной не более H(p_1,\ldots,p_k)+1, где функция H (называемая энтропией Шеннона ) определяется формулой

H(p_1,\ldots,p_n)= p_1 (- log_2 p_1)+\ldots + p_k (- log_2 p_k)

Решение. Если частоты p_i представляют собой целые (отрицательные) степени двойки, то это утверждение почти очевидно. Положим n_i=- log p_i (здесь и далее все логарифмы двоичные). Тогда 2^{-n_i}=p_i и потому для чисел n_i выполнено неравенство Крафта-Макмиллана. По задаче 12.2.3. можно построить префиксный код с длинами кодовых слов n_1,\ldots,n_k, и средняя длина этого кода будет равна H(p_1,\ldots,p_k) (и даже единицу добавлять не надо).

Эта единица пригодится, если log p_i не целые. В этом случае надо взять наименьшее n_i, при котором 2^{-n_i}
\le p_i. Для таких n_i выполняется неравенство Крафта Макмиллана, и они больше - log p_i не более чем на единицу (потому и после усреднения ухудшение будет не более чем не единицу.

Построенный на основе этой задачи код называется кодом Шеннона-Фано. Это построение легко извлекается из решения задачи 12.2.3.: рассматривая числа n_i=-\lfloor\ log p_i\rfloor (наименьшие целые числа, для которых 2^{-n_i}\le p_i ) в порядке убывания, мы отводим для каждого из них кодовое слово и соответствующий участок отрезка [0,1] слева направо.

При этом мы проигрываем в длине кода (по сравнению с оптимальным кодом) не более единицы: как мы сейчас увидим, средняя длина любого (в том числе и оптимального) кода не меньше H(p_1,\ldots,p_k).

12.4.2. (Для знакомых с математическим анализом) Доказать, что (при данных положительных частотах, в сумме дающих единицу) средняя длина любого (однозначного) кода не меньше H(p_1,\ldots,p_k).

Решение. Имея в виду неравенство Крафта-Макмиллана, мы должны доказать такой факт: если

2^{-n_1}+\ldots 2^{-n_k} \le 1,
то
p_1 n_1 + \ldots + p_k n_k \ge H(p_1,\ldots,p_k).
Это верно для любых n_i, не обязательно целых. Удобно перейти от n_i к величинам q_i=2^{-n_i} ; интересующее нас утверждение тогда гласит, что если p_1,\ldots,p_k и q_1,\ldots,q_k - два набора положительных чисел, и сумма чисел в каждом равна единице, то
p_1 (-log q_1) +\ldots +p_k (-log q_k) \ge
p_1 (-log p_1) +\ldots +p_k (-log p_k).
Другими словами, выражение
p_1 (-log q_1) +\ldots +p_k (-log q_k)
(рассматриваемое при фиксированных p_i как функция на множестве всех положительных q_1,\ldots,q_k, в сумме равных единице) достигает минимума при q_i=p_i. Область определения этой функции есть внутренность симплекса (треугольника при n=3, тетраэдра при n=4 и т.д.) и при приближении к границе одно из q_i становится малым, а его минус логарифм уходит в бесконечность. Значит, минимум функции достигается внутри области. В точке минимума градиент (-p_1/q_1,\ldots,-p_n/q_n) должен быть перпендикулярен плоскости, на которой функция определена (иначе сдвиг вдоль этой плоскости уменьшал бы функцию), то есть все p_i/q_i равны. Поскольку \sum p_i=\sum q_i=1, то это означает, что p_i=q_i.

Другое объяснение: функция log выпукла вверх, поэтому для любых неотрицательных коэффициентов \alpha_i, в сумме равных единице, и для любых точек x_i из области определения логарифма выполняется неравенство

log \left(\sum \alpha_i x_i\right) \ge \sum \alpha_i log x_i.
Остается положить \alpha_i=p_i, x_i=q_i/p_i ; в левой части будет логарифм единицы, то есть нуль, а \sum p_i \log
(q_i/p_i) есть как раз разность между левой и правой частями доказываемого неравенства.

Велика ли экономия от использования кодов, описанных в этом разделе? Это, конечно, зависит от частот букв: если они все одинаковые, то никакой экономии не будет. Легко заметить, что в русском языке разные буквы имеют разную частоту. Если, скажем, в текстах (TeX-файлах) этого курса (на момент эксперимента) оставить только 33 строчные русские буквы от "а" до "я", а все остальные символы не учитывать, то самой частой буквой будет буква "о" (частота 0{,}105 ), а самой редкой - твердый знак (частота 0{,}00019 ). Значение энтропии Шеннона при этом будет равно 4{,}454 (сравните с 5 битами, необходимыми для кодирования 32 букв). Выигрыш не так велик. Он будет больше, если учитывать также и другие символы (прописные буквы, знаки препинания и др.), которые встречаются в тексте гораздо реже или вовсе не встречаются. Наконец, можно кодировать не буквы, а двухбуквенные комбинации или еще что-нибудь. Именно так поступают популярные программы сжатия информации (типа zip), которые позволяют сократить многие тексты в полтора-два раза (а некоторые другие файлы данных - и в большее число раз).

12.4.3. Компания M. утверждает, что ее новая программа суперсжатия файлов позволяет сжать любой файл длиной больше 100\,000 байтов по крайней мере на 10\% без потери информации (можно восстановить исходный файл по его сжатому варианту). Доказать, что она врет.

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