Изменения

Перейти к: навигация, поиск

Код Шеннона

1513 байт добавлено, 15:16, 8 января 2015
Нет описания правки
'''''Код Шеннона''''' — алгоритм [[Кодирование информации#Префиксный код | префиксного кодирования ]] алфавита, предложенный Клодом Шенноном, в котором используется избыточность сообщения, заключённая в неоднородном распределении частот символов первичного алфавита, то есть заменяет коды более частых символов короткими последовательностями, а коды более редких символов — более длинными последовательностями.
'''Вход:''' <tex>A=\{a_{1},a_{2},...\dots,a_{n}\}</tex> — алфавит из <tex>n </tex> различных символов, с вероятностями <tex>WP=\{w_p_{1},w_p_{2},...\dots,w_p_{n}\}</tex> — соответствующий ему набор положительных целых весов.
'''Выход:''' <tex>C=\{c_{1},c_{2},...\dots,c_{n}\}</tex> — набор кодовых слов, соответствующий входным данным.
== Определение ==
{{Определение
|definition=
Пусть <tex>A=\{a_{1},a_{2},...\dots,a_{n}\}</tex> — алфавит из <tex>n</tex> различных символов, с вероятностями <tex>WP=\{w_p_{1},w_p_{2},...\dots,w_p_{n}\}</tex> — соответствующий ему набор положительных целых весов, <tex>s=\sum\limits_{i \in [1, n]}w_{i}</tex>, <tex>b_{x}=\sum\limits_{i \in [1, x - 1]}w_{i}</tex>. Тогда набор бинарных кодов <tex>C=\{c_{1},c_{2},...\dots,c_{n}\}</tex>, такой, что:
1. <tex>c_{i}</tex> не является префиксом для <tex>c_{j}</tex>, при <tex>i \ne j</tex>
2. <tex>c_{i}</tex> представляет собой <tex>\lceil -\log b_p_{i}\rceil</tex> коэффициентов двоичного разложения дроби числа <tex dpi = "160">{\frac{b_{i}}{s}}</tex>
называется '''кодом Шеннона'''.
}}
 
== Алгоритм построения бинарного кода Шеннона ==
Пусть нам даны наборы <tex>A</tex> и <tex>P</tex>, тогда для нахождения кодовых слов необходимо:# Сортируем Отсортировать элементы алфавита по не возрастанию весоввероятности встречи символа.# Элементу <tex>a_{x}</tex> ставим поставить в соответствие число <tex>b_{x}=\sum\limits_{i \in [1, x - 1]}w_p_{i}</tex>, при этом <tex>b_{1}=0</tex>.# Представляем Представить каждое число <tex dpi = "160">{\frac{b_{x}}{s}}</tex>, где <tex>s=\sum\limits_{i \in [1, n]}w_{i}</tex>, в виде двоичной дроби.# В качестве кодового слова для <tex>a_{x}</tex> используем использовать первые <tex>L_{x}=\lceil -\log b_p_{x}\rceil</tex> коэффициентов представления дроби <tex dpi = "160">{\frac{b_{x}}{s}}</tex>. (<tex>\lceil z \rceil</tex> — наименьшее целое число, не меньшее <tex> z </tex>)
=== Пример ===
Для примера возьмём алфавит <tex>A=\{a,b,c,d,e,f\}</tex>, а и набор весов <tex>W=\{5,2,6,1,2\}P</tex>:
{| class="wikitable"
! Символ || a || b || c || d || e|| f
|-
| Вес <tex>p_{x}</tex> || 5 0,10 || 2 0,20 || 6 0,10 || 1 0,10 || 20,35 || 0,15
|}
По алгоритму сортируем элементы алфавита по не возрастанию весов<tex>p_{x}</tex>:
{| class="wikitable"
! Символ || c e || b || a f || b a || e c || d
|-
| Вес <tex>p_{x}</tex> || 6 0,35 || 5 0,20 || 2 0,15 || 2 0,10 || 10,10 || 0,10
|}
{| class="wikitable"
! Символ || c e || b || a f || b a || e c || d
|-
| Вес || 6 || 5 || 2 || 2 || 1|-| <tex>b_{x}</tex> || 0,0 || 6 0,35 || 11 0,55 || 13 0,70 || 150,80 || 0,90
|}
Посчитаем Переведём <tex dpi = "160">\frac{b_{x}}{s}</tex> и переведём в двоичную систему счисления:
{| class="wikitable"
! Символ || c e || b || a f || b a || e c || d
|-
| <tex dpi = "150">\frac{b_{x}}{s}</tex> || <tex>\frac{0}{16}</tex> || <tex>\frac{6}{16}</tex> || <tex>\frac{11}{16}</tex> || <tex>\frac{13}{16}</tex> || <tex>\frac{15}{16}</tex>|} {| class="wikitable"! Символ || c || a || b || e || d|-| <tex dpi = "150">\frac{b_{x}}{s}</tex> ,00000 || 0.0000 ,01010 || 0.0110 ,10001 || 0.1011 ,10110 || 0.1101 ,11001 || 0.1111,11100
|}
{| class="wikitable"
! Символ || c e || b || a f || b a || e c || d
|-
| <tex>L_{x}</tex> || 2 || 2 3 || 3 || 3 4 || 4 || 4
|-
| Код || 00 || 01 010 || 101 100 || 110 1011 || 11111100 || 1110
|}
{{Утверждение|statement=Код Шеннона является префиксным|proof= Декодирование Для доказательства выбираем два произвольных кодовых слова с номерами <tex>i</tex> и <tex>j</tex>, <tex>i</tex><tex><</tex><tex>j</tex>. Кодовое слово <tex>c_{i}</tex> заведомо короче, чем <tex>c_{j}</tex>, поэтому достаточно доказать, что эти слова отличаются в одном из первых <tex>L_{i}</tex> символов. Рассмотрим разность:<tex>b_{j} - b_{i}</tex> =<tex>\sum\limits_{k \in [1, j - 1]}p_{k} - \sum\limits_{k \in [1, i - 1]}p_{k} =\sum\limits_{k \in [i, j - 1]}p_{k} \geqslant p_{i}</tex>.
Для декодирования необходимо последовательно вычислять первые Длина слова и его вероятность связаны соотношением<tex>L_{xi} = \lceil -\log p_{i}\rceil \geqslant -\log p_{i}</tex> цифр двоичной дроби . Поэтому <tex dpi = "160">p_{i} \fracgeqslant 2^{-L_{i}}</tex>. С учётом этого неравенства получаем, что <tex>b_{xj} - b_{i} \geqslant 2^{-L_{i}}</tex>.В двоичной записи числа в правой части мы имеем после запятой <tex>L_{si}- 1</tex> нулей и сравнивать их единицу в позиции с первыми номером <tex>L_{i}</tex>. Поэтому по меньшей мере в одном из <tex>L_{xi}</tex> символами последовательности кодовых разрядов слова <tex>c_{i}</tex> и <tex>c_{j}</tex> отличаются и, следовательно, <tex>c_{i}</tex> не является префиксов для <tex>c_{j}</tex>. Это верно для любой пары слов. Их совпадение определяет символ , так как <tex>i</tex> и <tex>xj</tex>были выбраны произвольно. Значит, код является префиксным.}}== См.также ==* [[Алгоритм Хаффмана]]* [[Арифметическое кодирование]]
== Литература Источники информации ==
* Ю. М. Штарьков, “Обобщенные коды Шеннона”, Пробл. передачи информ., 20:3 (1984), 3—16 — с. 4.
* Б. Д. Кудряшов Теория информации. С.—Пб.: Питер, 2009 — с. 36.
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Алгоритмы сжатия ]]
7
правок

Навигация