Опубликован: 11.04.2007 | Доступ: свободный | Студентов: 5988 / 2265 | Оценка: 4.37 / 4.24 | Длительность: 11:19:00
Лекция 5:

Сжатие информации

< Лекция 4 || Лекция 5: 12 || Лекция 6 >

Простейшие алгоритмы сжатия информации

Метод Шеннона-Фэно состоит в следующем, значения д.с.в. располагают в порядке убывания их вероятностей, а затем последовательно делят на две части с приблизительно равными вероятностями, к коду первой части добавляют 0, а к коду второй - 1.

Для предшествующего примера получим

\smallskip
\dzero=\hsize \divide\dzero12
\noindent\hskip\dzero\vbox{\offinterlineskip
\halign{&\strut\quad\hfil#\hfil& \vrule#\cr
$\vec X$ && $p$ && $code(\vec X)$\cr
\noalign{\hrule}
00       && 9/16 && 0\cr
01       && 3/16 && 10\cr
10       && 3/16 && 110\cr
11       && 1/16 && 111,\cr}} 

\smallskip

$ML_1(\vec X)=27/32=0.84375$ бит/сим.
\smallskip

Еще один пример. Код составляется после сортировки, т.е. после перестановки значений B и C.

\noindent\hskip\dzero\vbox{\offinterlineskip
\halign{&\strut\quad\hfil#\hfil& \vrule#\cr
$X$&& $p$ && $code(X)$\cr
\noalign{\hrule}
A  && 0.4 && 0\cr
B  && 0.2 && 11\cr
C  && 0.4 && 10,\cr}} 
\vbox{\hbox{$ML(X)=ML_1(X)=1.6$ бит/сим,}
\hbox{$HX=\log_25-0.8\approx1.523$ бит/сим.}}

Метод Хаффмена (Huffman) разработан в 1952 г. Он более практичен и никогда по степени сжатия не уступает методу Шеннона-Фэно, более того, он сжимает максимально плотно. Код строится при помощи двоичного (бинарного) дерева. Вероятности значений д.с.в. приписываются его листьям; все дерево строится, опираясь на листья. Величина, приписанная к узлу дерева, называется весом узла. Два листа с наименьшими весами создают родительский узел с весом, равным сумме их весов; в дальнейшем этот узел учитывается наравне с оставшимися листьями, а образовавшие его узлы от такого рассмотрения устраняются. После постройки корня нужно приписать каждой из ветвей, исходящих из родительских узлов, значения 0 или 1. Код каждого значения д.с.в. - это число, получаемое при обходе ветвей от корня к листу, соответствующему данному значению.

Для методов Хаффмена и Шеннона-Фэно каждый раз вместе с собственно сообщением нужно передавать и таблицу кодов. Например, для случая из примера 2 нужно сообщить, что коду 10 соответствует символ C, коду 0 - A и т.д.

Построим коды Хаффмена для значений д.с.в. из двух предыдущих примеров.

\smallskip
\setbox\bzero=\vbox{\offinterlineskip\halign{&\strut\hfil\ $#$\ \hfil\cr
\noalign{\hrule}
\omit\vrule& \vec X& 00&& 01&& 10&& 11& \omit\vrule height11pt\cr
\omit\vrule& p&      \xfrac9{16}&& \xfrac3{16}&& \xfrac3{16}&& \xfrac1{16}& 
  \omit\vrule\cr
\noalign{\hrule}
\omit\vrule& &       &&  && _0\!\searrow&& \swarrow_1& \omit\vrule\cr
\omit\vrule& &       &&  &&& {4\over16}&& \omit\vrule\cr
\omit\vrule& &       &&  \,_0\!\searrow&& \swarrow_1&&& \omit\vrule\cr
\omit\vrule& &       &&&  {7\over16}&&&& \omit\vrule\cr
\omit\vrule& &       \,_0\!\searrow&& \swarrow_1&&&&& \omit\vrule\cr
\omit\vrule& &       & 1&&&&&& \omit\vrule\cr
\noalign{\hrule}
\omit\vrule& code(\vec X)& 0&& 10&& 110&& 111& \omit\vrule height 11pt\cr
\noalign{\hrule}}}
\setbox\bone=\hbox{ $ML_1(\vec X)=ML(\vec X)/2=27/32=0.84375$ бит/сим.}
\dzero=\wd\bzero \advance\dzero\wd\bone \done=0pt 
\ifdim\hsize<\dzero 
\vbox{
\centerline{\box\bzero}
\break
\centerline{\box\bone}
}
\else \advance\dzero-\hsize \done-\dzero
\noindent\hskip\done\hbox{\box\bzero \box\bone} 
\fi
\bigskip

\setbox\bzero=\vbox{\offinterlineskip\halign{&\strut\hfil\ #\ \hfil\cr
\noalign{\hrule}
\omit\vrule& $X$& A   && B   && C&\omit\vrule\cr
\omit\vrule& $p$& 0.4 && 0.2 && 0.4&\omit\vrule\cr
\noalign{\hrule}
\omit\vrule& &  && $_0\!\searrow$ && $\swarrow_1$&\omit\vrule\cr
\omit\vrule& &  && & 0.6&&\omit\vrule\cr
\omit\vrule& & $\,_0\!\searrow$ &&$\,\swarrow_1$&&&\omit\vrule\cr
\omit\vrule& & &\ 1&&&&\omit\vrule\cr
\noalign{\hrule}
\omit\vrule& $code(X)$& 0&& 10&& 11&\omit\vrule\cr
\noalign{\hrule}}}
\setbox\bone=\hbox{\ $ML_1(X)=ML(X)=1.6$ бит/сим.}
\ifdim\done=0pt \centerline{\box\bzero}\centerline{\box\bone}
\else \noindent\hskip\done\hbox{\box\bzero \box\bone} \fi
\smallskip

Упражнение 18 Вычислить ML_1(\vec X) для блочного кода Хаффмена для X. Длина блока - 2 бита. д.с.в. X берется из последнего примера.

Упражнение 19 Вычислить HX и ML(X) для кодов Хаффмена и Шеннона-Фэно для X. д.с.в. X задается следующим распределением вероятностей:

\bigskip
\centerline{\vbox{\offinterlineskip\halign{&\strut\quad#\cr
X&\omit\ \vrule&           1&        2&        3&        4&       5\cr
\noalign{\hrule}
\omit\quad&\omit\ \vrule height2pt\cr
p&\omit\ \vrule& \xfrac7{18}& \xfrac16& \xfrac16& \xfrac16& \xfrac19.\cr}}}
\bigskip

< Лекция 4 || Лекция 5: 12 || Лекция 6 >