Россия, Пошатово |
Оптимальное кодирование
12.4. Код Шеннона-Фано
Мы видели, как можно построить оптимальный код (имеющий
минимальную среднюю длину) для данного набора частот.
Однако эта конструкция не дает никакой оценки для средней
длины оптимального кода (как функции от частот ).
Следующие задачи указывает такую оценку (с абсолютной
погрешностью не более
).
12.4.1.
Показать, что для любых положительных частот (в сумме равных единице) существует код
средней длиной не более
, где
функция
(называемая энтропией Шеннона )
определяется формулой

Решение. Если частоты представляют собой целые (отрицательные) степени двойки, то это утверждение почти
очевидно. Положим
(здесь и далее все
логарифмы двоичные). Тогда
и потому для
чисел
выполнено неравенство Крафта-Макмиллана. По
задаче 12.2.3. можно построить префиксный код
с длинами кодовых слов
, и средняя длина
этого кода будет равна
(и даже единицу
добавлять не надо).
Эта единица пригодится, если не целые. В этом
случае надо взять наименьшее
, при котором
. Для таких
выполняется неравенство Крафта
Макмиллана, и они больше
не более чем на
единицу (потому и после усреднения ухудшение будет не более
чем не единицу.
Построенный на основе этой задачи код называется кодом Шеннона-Фано.
Это построение легко извлекается из решения
задачи 12.2.3.: рассматривая числа (наименьшие целые числа, для которых
) в порядке убывания, мы отводим для каждого из
них кодовое слово и соответствующий участок отрезка
слева направо.
При этом мы проигрываем в длине кода (по сравнению с оптимальным
кодом) не более единицы: как мы сейчас увидим, средняя длина
любого (в том числе и оптимального) кода не меньше .
12.4.2.
(Для знакомых с математическим анализом) Доказать, что (при
данных положительных частотах, в сумме дающих единицу) средняя
длина любого (однозначного) кода не меньше .
Решение. Имея в виду неравенство Крафта-Макмиллана, мы должны доказать такой факт: если



















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




Велика ли экономия от использования кодов, описанных в этом
разделе? Это, конечно, зависит от частот букв: если они все
одинаковые, то никакой экономии не будет. Легко заметить,
что в русском языке разные буквы имеют разную частоту.
Если, скажем, в текстах (TeX-файлах) этого курса (на
момент эксперимента) оставить только строчные русские
буквы от "а" до "я", а все остальные символы не
учитывать, то самой частой буквой будет буква "о"
(частота
), а самой редкой - твердый знак (частота
). Значение энтропии Шеннона при этом будет
равно
(сравните с
битами, необходимыми для кодирования
букв). Выигрыш не так велик. Он будет
больше, если учитывать также и другие символы (прописные
буквы, знаки препинания и др.), которые встречаются
в тексте гораздо реже или вовсе не встречаются.
Наконец, можно кодировать не буквы, а двухбуквенные
комбинации или еще что-нибудь. Именно так поступают
популярные программы сжатия информации (типа zip),
которые позволяют сократить многие тексты в полтора-два
раза (а некоторые другие файлы данных - и в большее число
раз).
12.4.3.
Компания M. утверждает, что ее новая программа суперсжатия
файлов позволяет сжать любой файл длиной больше байтов по крайней мере на
без потери
информации (можно восстановить исходный файл по его сжатому
варианту). Доказать, что она врет.