Опубликован: 19.11.2012 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский университет "Высшая Школа Экономики"
Лекция 6:

Информационные технологии

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Оптимальное кодирование, свойства оптимальных кодов, построение оптимальных кодов методом Хафмена

Для практических целей представляет интерес нахождение для каждого источника префиксного кода с минимальной средней длиной кодирования.

Определение. Префиксное кодирование c_0 называется оптимальным для источника S, если для каждого префиксного кодирования c источника S справедливо неравенство R(c_0,S) \le R(c,S).

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

Пусть буквы алфавита \{a_1, a_2, \dots, a_n\} источника S имеют вероятности появления p_1 p_2 \dots p_n , длины кодовых слов c(a_1), c(a_2), \dots, c(a_n) при использовании кода c равны l_1, l_2, \dots, l_n. Рассмотрим некоторые свойства оптимального кодирования, для того чтобы, опираясь на эти свойства, сформулировать процедуру нахождения оптимального кода.

Свойство 1. Для оптимального кода из p_i > p_j следует, что l_i \le l_j.

Для доказательства предположим противное, т. е. что для оптимального кода существуют p_i и p_j, такие что p_i > p_j и l_i > l_j. Построим новый код, поменяв местами кодовые слова рассматриваемого оптимального кода для i-ой и j-ой букв алфавита. Разность между средней длиной L_0 кодирования оптимальным кодом и средний длиной L построенного кода имеет вид

L_0-L=p_il_i+p_jl_j-p_il_i-p_jl_j=(p_i-p_j)(l_i-l_j) >0

что противоречит оптимальности рассматриваемого кода.

Свойство 2. Существует оптимальный код источника S, для которого

l_1\lel_2\le \dots \le l_{n-l}=l_n

причем два последних слова имеют максимальную длину и отличаются только в последнем знаке.

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

Докажем, что какие-то два слова максимальной длины отличаются только в последнем знаке. Опять предположим противное, то есть любые два слова максимальной длины отличаются не только в последнем знаке. В этой ситуации можно повторить описанную выше процедуру укорачивания одного из слов максимальной длины и получить в результате новый префиксный код с меньшей средней длиной кодирования, что противоречит оптимальности исходного кода.

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

Процедура сжатия источника заключается в переходе от источника S с алфавитом из n знаков а_1, а_2, \dots, а_п упорядоченных в порядке невозрастания соответствующих им вероятностей р(а_1)\ge р(а_2)\ge \dots \ge р(а_n), к источнику S' с алфавитом из n-1 знака а'_1, а'_2, \dots,а'_{n-1} и вероятностями p(a'_i)=p(a_i) при i < n-1 и p(a'_{n-l} =p(a_{k-l})+p(a_k).

Операцию сжатия источника S будем обозначать через S' Фактически, при сжатии первые n-2 знака остаются неизменными, а два последних, наименее вероятных знака заменяются на некоторый новый знак с вероятностью, равной сумме вероятностей двух заменяемых знаков.

\overbrace{
\begin{matrix}
a_1&& a_2&& \ldots&& a_{n-1}&& a_n\\
p_1& \ge & p_2& \ge & \ldots& \ge& p_{n-1}& \ge& p_n
\end{matrix}}^{\mbox{Источник S из n букв}} \xrightarrow{Сжатие}
\overbrace{
\begin{matrix}
a_1&& a_2&& \ldots&& a_{n-2}&& \hat a\\
p_1& \ge& p_2& \ge& \ldots& \ge& p_{n-2}& \ge& p_{n-1}+p_n
\end{matrix}}^{\mbox{Источник S' из n-1 букв}} \xrightarrow{\mbox{Сортировка по p}}

Применяя сжатие к источнику S, получим новый источник S^{(1)}=S', применяя затем процедуру сжатия к S^{(1)} получим S^{(2)}=(S^{(1)})'. Действуя подобным образом n-2 раза, построим последовательность источников S, S^{(1)}, \dots, S^{(n-2)}.

Алфавит источника S^{(n-2)} состоит только из двух знаков, поэтому найти оптимальный код для этого источника не составляет труда. Одно из слов кодируется знаком 0, а другое - знаком 1. Это особенно важно потому, что, используя оптимальный код для источника S^{(n-2)} и последовательность кодов S, S^{(1)}, \dots, S^{(n-2)}, можно найти оптимальный код для исходного источника S.

Для построения оптимального кода источника S^{(i)}, содержащего на один знак больше, чем источник S^{(i+1)}, необходимо выполнить процедуру расщепления кода.

Пусть имеем источник

S^{(i+1)}=\begin{cases}
a_1^{i+1}, a_2^{i+1}, \dots,  \hat a_j^{i+1}, \dots a_{n-i-1}^{i+1}\\
p(a_1^{i+1}), p(a_2^{i+1}),\dots, p(\hat a_j^{i+1}), \dots p(a_{n-i-1}^{i+1})\\
c_0(a_1^{i+1}), c_0(a_2^{i+1}), \dots, c_0(\hat a_j^{i+1}),\dots c_0(a_{n-i-1}^{i+1})
\end{cases}

И оптимальный код p(\hat a_j^{i+1})=p(a_{n-i-1}^i)+p(a_{n-i}^i)

Через \hat a_j обозначен тот знак алфавита источника S^{(i+1)} , который заменил два знака с минимальными вероятностями источника S^{(i) при его сжатии.

Процедура расщепления заключается в использовании оптимального кода c_o^{(i+1)} источника S^{(i+1)} для построения оптимального кода для источника S^{(i)}. Она заключается в следующем: знакам алфавита источника S^{(i)}, перешедшим в S^{(i+1)} без изменения, назначаются кодовые слова совпадающих с ними знаков источника S^{(i+1)}; двум наименее вероятным знакам алфавита источника S^{(i+1)}, замененным в процессе сжатия на знак \hat a_j, сопоставляют кодовые слова с_0^{i+1}(\hat a_j^{i+1})0 и c_0^{i+1}(\hat a_j^{i+1})l.

Слово c_o^{i+1}(\hat a_0^{i+1}) в оптимальном коде источника S^{(i+1)}, содержащем n-i-1 знаков, "расщепляется", путем добавления (конкатенации) знаков 0 и 1, на 2 слова в кодовом множестве для источника S^{(i)}, содержащем n-i знаков.

Средняя длина l' кода источника S^{(i+1)} и средняя длина l кода, полученного из него расщеплением, связаны соотношением l=l'+p. Действительно,

l=l_1p(a_1^{i+1})+\dots+(l_j+1)p(a_{n-i-1}^i)+(l_j+1)p(a_{n-i}^i)+\dots l_{n-i-1}p(a_{n-i-1}^{i+1})=\\
=l_1p(a_1^{i+1})+\dots +l_j(p(a_{j-i-1}^i)+p(a_{n-i}^i))+(p(a_{n-i-1}^i)+p(a_{n-i}^i))+\dots l_{n-i-1}p(a_{n-i-1}^{i+1})=\
=l_1p(a_1^{i+1})+\dots +l_j(p(a_j^i)+\dots l_{n-i-1}p(a_{n-i-1}^{i+1})+(p(a_{n-i-1}^i)+p(a_{n-i}^i))=l'+p

Докажем, что получающийся в результате расщепления код является оптимальным для источника S^{(i)} .

Предположим противное, т. е. что существует другой оптимальный код c'' для того же источника S^{(i)} со средней длиной кодирования l'', меньшей, чем l, т. е. l''<l. В соответствии со свойством 2 оптимальный код содержит два слова максимальной длины, отличающиеся в последнем знаке и соответствующие двум наименьшим вероятностям источника S^{(i)}. Обозначим эти два слова через c''(a_{n-i}) и c''(a_{n-i-1}). Из этого кода для источника S^{(i)} можно построить код c''' для источника S^{(i+1)} , в котором последнее кодовое слово получается отбрасыванием последнего знаки из слов c''(a_{n-i}) и c''(a_{n-i-1}). Средняя длина l''' кода c''' связана со средней длиной l'' кода c'' соотношением l''=l'''+p. Из этого соотношения, из соотношения l=l'+p и из предположения, что l''<l, следует, что l'''<l'. Это противоречит оптимальности кода для источника S^{(i+1)} .

Таким образом, используя процедуру расщепления, строится оптимальный код для источника, который ранее был преобразован процедурой сжатия в более простой источник. Повторяя эту процедуру необходимое количество раз, можно будет найти оптимальный код для исходного источника S.

Описанный метод оптимального кодирования был предложен в 1952 г. Д. Хафменом и называется его именем. В общем случае, когда для кодирования используется алфавит из более чем двух букв, метод Хафмена рассмотрен в [32].

Рассмотрим процесс построения оптимального кода на примере источника из пяти сообщений с вероятностями p_1 = 0,4, p_2 = 0,15, p_3 = 0,15, p_4 = 0,15, p_5 = 0,15. Построение кода показано на следующем рисунке.


Стрелками показаны шаги сжатия источника. В левой части каждого столбца показано распределение вероятностей источника. В правой части каждого столбца, соответствующего одному из источников, показаны кодовые слова. Построение кода начинается с простейшего источника S(3) , который кодируется двумя однобуквенными словами 0 и 1.

В данном случае средняя длина кодирования для оптимального кода, построенного методом Хафмена, составляет 2,2. Это меньше, чем средняя длина кода, построенного ранее методом Фано для того же источника.

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Фахруддин хемракулыев
Фахруддин хемракулыев
Шерхон Давлатов
Шерхон Давлатов

Почему тесты (1,2,3..) не работают. Хочу пройти тест но не получается

Сергей Мазаватов
Сергей Мазаватов
Россия
Лали Лесных
Лали Лесных
Россия, г. Санкт-Петербург