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

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

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

12.3. Код Хаффмена

Теперь задача о коде минимальной средней длины приобретает такую форму: для данных положительных p_1,\ldots,p_k, равных в сумме единице, найти целые положительные n_1,\ldots,n_k, для которых выполнено неравенство Крафта-Макмиллана, а сумма

\sum_{i=1}^k p_i n_i
является минимально возможной (среди наборов n_1,\ldots,n_k, удовлетворяющих неравенству). Задача 12.2.5. показывает, что средняя длина однозначного кода не меньше этого минимума, а задача 12.2.3. говорит, что этот минимум достигается, причем даже для префиксного кода. Как же найти числа n_1,\ldots,n_k, доставляющие этот минимум?

12.3.1. Доказать, что для двух букв оптимальный код состоит из двух слов длины 1, независимо от частот букв.

Чтобы решить задачу в общем случае, начнем с нескольких простых замечаний.

12.3.2. Пусть частоты расположены в убывающем порядке: p_1 >
p_2 > \ldots > p_k. Доказать, что тогда длины слов оптимального кода идут в неубывающем порядке: n_1\le n_2\le \ldots\le n_k.

Решение. Если бы более редкая буква имела бы более короткое кодовое слово, то, обменяв кодовые слова, мы сократили бы среднюю длину кода.

12.3.3. Останется ли утверждение предыдущей задачи в силе, если частоты расположены в невозрастающем порядке (возможны равные)?

Решение. Нет: если, скажем, имеются три буквы с частотой 1/3, то оптимальный код будет иметь длины слов 1,2,2 (если бы два кодовых слова имели длину 1, то на третье уже не осталось бы места), и они могут идти в любом порядке.

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

12.3.4. Пусть частоты расположены в невозрастающем порядке ( p_1\ge p_2\ge\ldots \ge p_k ), а длины слов в оптимальном коде расположены в неубывающем порядке n_1\le n_2\le\ldots\le n_k. Доказать, что n_{k-1}=n_k (при k\ge 2 ).

Решение. Предположим, что это не так, и что есть единственное самое длинное кодовое слово длины n_k. Тогда неравенство Крафта-Макмиллана не может обращаться в равенство, поскольку все слагаемые, кроме наименьшего (последнего), кратны удвоенному последнему слагаемому. Значит, в этом неравенстве есть запас, причем не меньший последнего слагаемого. А тогда можно уменьшить n_k на единицу, не нарушая неравенства, что противоречит предположению об оптимальности исходного кода.

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

12.3.5. Как свести задачу отыскания длин кодовых слов оптимального кода для k частот

p_1\ge p_2\ge \ldots\ge p_{k-2}\ge p_{k-1} \ge p_k
к задаче поиска длин оптимального кода для k-1 частот
p_1, p_2, \ldots, p_{k-2}, p_{k-1}+p_k
(частоты двух самых редких букв объединены)?

Решение. Мы уже знаем, что можно рассматривать лишь коды с n_{k-1}\hm=n_k. Неравенство Крафта-Макмиллана тогда запишется как

\begin{multiline*}
2^{-n_1}+2^{-n_2}+\ldots+2^{-n_{k-2}}+2^{-n_{k-1}}+2^{-n_k}=\\
=2^{-n_1}+2^{-n_2}+\ldots+2^{-n_{k-2}}+2^{-n} \le 1,
        \end{multiline*}
если положить n_{k-1}=n_k=n+1. Таким образом, числа n_1,\ldots,n_{k-2},n должны удовлетворять неравенству Крафта Макмиллана для k-1 букв. Средняя длины этих двух кодов будут связаны:
\begin{multiline*}
p_1 n_1+\ldots+p_{k-2} n_{k-2}+ p_{k-1} n_{k-1}+ p_k n_k =  {}\\
{}= p_1 n_1+\ldots+p_{k-2} n_{k-2}+ (p_{k-1}+p_k)n + [p_{k-1}+p_k].
        \end{multiline*}
Последнее слагаемое (квадратная скобка) не зависит от выбираемого кода, поэтому минимизировать надо остальное, то есть как раз среднюю длину кода с длинами слов n_1,\ldots,n_{k-2},n для частот p_1,p_2,\hm\ldots,p_{k-2},p_{k-1}+p_k. После этого надо положить n_{k-1}=n_k=n+1, и это даст оптимальный код для исходной задачи.

Используя эту задачу, несложно составить рекурсивную программу для отыскания длин кодовых слов. С каждым вызовом число букв будет уменьшаться, пока мы не сведем задачу к случаю двух букв, когда оптимальный код состоит из слов 0 и 1. Затем можно найти и сами кодовые слова (согласно задаче 12.2.3.). Но проще объединить эти действия и сразу искать кодовые слова: ведь замена числа n на два числа n+1 соответствует замене кодового слова P на два слова P0 и P1 на единицу большей длины (и эта последняя замена сохраняет префиксность кода).

Код, построенный таким методом, называется кодом Хаффмена. Мы доказали, что он имеет минимальную среднюю длину среди всех кодов (для данных частот букв). В следующей задаче оценивается число операций, необходимых для построения кода Хаффмена.

12.3.6. Показать, что можно обработать частоты p_1,\ldots,p_k, сделав O(k \log k) операций, после чего i -ое кодовое слово можно указать за время, пропорциональное его длине.

Указание. Заметим, что оценка времени довольно сильная: только на сортировку чисел p_i уже уходит O(k \log k) действий. Поэтому, применяя предыдущую задачу, нужно использовать результаты сортировки k чисел при сортировке меньшего количества чисел. Это можно сделать с помощью очереди с приоритетами, вынимая два минимальных числа и добавляя их сумму за O(\log k) действий. Это позволяет определить, какие две буквы надо соединять в одну на каждом шаге. Параллельно с соединением букв можно строить дерево кодов, проводя ребра (помеченные 0 и 1 ) от соединенной буквы к каждой из ее половинок. При этом требуется O(1) действий на каждом шаге. После завершения построение прослеживать код любой буквы можно символ за символом.

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