Сжатие информации
Простейшие алгоритмы сжатия информации
Метод Шеннона-Фэно состоит в следующем, значения д.с.в. располагают в порядке убывания их вероятностей, а затем последовательно делят на две части с приблизительно равными вероятностями, к коду первой части добавляют 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](/sites/default/files/tex_cache/2820fc3d88d79990cf3146fac0480fbf.png)
Еще один пример. Код составляется после сортировки, т.е. после перестановки значений 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$ бит/сим.}}](/sites/default/files/tex_cache/73ff56d14233bb2c56713580d0848632.png)
Метод Хаффмена (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](/sites/default/files/tex_cache/3d7ea884f2e47009c3ed7cfb43e43a09.png)
Упражнение 18
Вычислить для блочного кода Хаффмена для
. Длина блока - 2 бита. д.с.в.
берется из последнего примера.
Упражнение 19
Вычислить и
для кодов Хаффмена и
Шеннона-Фэно для
.
д.с.в.
задается следующим распределением вероятностей:
![\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](/sites/default/files/tex_cache/bba232a90640269fac4f91f7f0066840.png)