Изменения

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

Неравенство Крафта

3285 байт добавлено, 19:43, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Предварительные определения ==
{{Определение
|definition=
'''Кодом''' для алфавита <tex>A</tex> называется функция(таблица) <tex>C(X)</tex>, которая для каждого символа <tex>x</tex> из <tex>A</tex> указывает слово <tex>C(x)</tex>, кодирующее этот символ.}}
{{Определение
|definition=
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}
В качестве кодирующего алфавита часто рассматривается множество <tex>\{0, 1\}</tex> — так называемый двоичный или бинарный алфавит.
{{Определение |definition=Код называется '''разделимым''' (или ''однозначно декодируемым''), если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.}}{{Определение |definition='''Префиксным кодом''' называется алфавитный код, в котором ни одно из Рассматриваемое ниже неравенство Крафта показывает для каких длин кодовых слов не является префиксом никакого другого кодового словасуществует префиксный код.}}
== Введение ==
Зачем нужны коды с разной длиной кодовых символов? Дело в том, что чаще всего разные символы встречаются с разной частотой и иногда выгодно закодировать часто встречающиеся символы как можно меньшим количеством кодовых символов. Но что мешает нам выбирать кодовые слова короткими? Оказывается, для того чтобы код был разделимым, требуется чтобы длины кодовых символов удовлетворяли неравенству Крафта.
== Неравенство Крафта ==
{{Теорема
|about=неравенство Крафта
|statement=
Пусть у нас есть <tex>C(X)n</tex> <tex>-</tex> префиксный код[[Основные определения, связанные со строками|символов]], отображающий произвольный алфавит <tex>A_x</tex> на двоичный алфавит кодовые слова которых имеют длины <tex> l_1 \leqslant l_2 \leqslant \{0,1ldots \} leqslant l_n </tex> , тогда для того чтобы код был разделимым, длины его кодовых слов должны удовлетворять неравенству:.
Тогда необходимое и достаточное условие существования префиксного кода в <tex>r</tex>-ичном алфавите для данных символов, состоит в выполнении неравенства: <center><tex> \sum\limits_{i = 1}^{In} 2r ^{-l_i} \le leqslant 1 , </tex></center>где <tex>|A_x| = I</tex> , а <tex>l_i</tex> {{---}} длины кодовых слов.
|proof=
Рассмотрим отрезок [[file:Treeforkraft.jpg|thumb|250px|Иллюстрация к доказательству индукционного перехода]] '''Необходимость:''' Напомним, что префиксный код можно представить в виде <tex>r</tex>-ичного корневого дерева, рёбра которого соответствуют символам алфавита, а листья соответствующим кодам. Неравенство Крафта будем доказывать по [0;1[Математическая индукция|индукции]].  Для простоты рассмотрим сначала случай двоичного алфавита, то есть <tex>r = 2</tex> .  '''База:''' Если максимальная длина пути на числовой прямойдереве равна <tex>1</tex>, то в дереве есть одно или два ребра длины <tex>1</tex>. Таким образом, либо <tex> \dfrac{1}{2} \leqslant 1 </tex> — для одного символа источника, либо <tex> \dfrac{1}{2} + \dfrac{1}{2} \leqslant 1 </tex> — для двух символов источника.
Разделим его пополам'''Переход:''' Предположим далее, причем левую половину обозначим что неравенство Крафта справедливо для всех деревьев высоты меньше <tex>M_0n - 1</tex>. Докажем, а правую что оно справедливо и для всех деревьев высоты меньше <tex>M_1n</tex>. Для данного дерева максимальной высоты <tex>n</tex> ребра из первой вершины ведут к двум поддеревьям, высоты которых не превышают <tex>n - 1</tex>; для этих поддеревьев имеем неравенства <tex>K_1 \leqslant 1</tex> и <tex>K_2 \leqslant 1</tex>, где <tex>K_1, K_2</tex> — значения соответствующих им сумм. Каждая длина <tex>l_i</tex> в поддереве увеличивается на <tex>1</tex>, когда поддерево присоединяется к основному дереву, поэтому возникает дополнительный множитель <tex>\dfrac{1}{2}</tex>. Таким образом, имеем <tex>\dfrac{1}{2} K_1 + \dfrac{1}{2} K_2 \leqslant 1</tex>.
Затем поделим <tex>M_0</tex> пополам и обозначим его левую половину <tex>M_{00}</tex>, а правую <tex>M_{01}</tex>, и, проделав то же самое с <tex>M_1</tex>, получим <tex>M_{10}</tex>, а левую <tex>M_{11}</tex>.
Будем выполнять эти действия, пока длина индекса полученного отрезка В случае произвольного недвоичного основания <tex>M_jr</tex> имеется не превосходит более <tex>max(l_1r</tex> ребер, l_2исходящих из каждой вершины, то есть не более <tex>r</tex> поддеревьев; каждое из них присоединяется к основному дереву,давая дополнительный множитель <tex>\ldots,l_I)dfrac{1}{r}</tex>. Отсюда снова следует утверждение теоремы.
Заметим, что'''Достаточность:*любому кодовому слову <tex>C_j</tex> сопоставлен свой отрезок <tex>M_{C_j}</tex> (Например, кодовому слову <tex>1011</tex> соответствует отрезок <tex>M_{1011}</tex>);*длина отрезка <tex>M_{C_i}</tex> равна <tex>2^{-l_i}</tex> (Например, <tex>M_0</tex> имеет длину <tex>\frac12</tex>, а <tex>M_{00}</tex> соответственно <tex>\frac14</tex>);*Если кодовое слово <tex>x</tex> является префиксом кодового слова <tex>y</tex>, то отрезок <tex>M_x</tex> содержит <tex>M_y</tex> (Например, кодовое слово <tex>01</tex> является префиксом <tex>0111</tex>, а отрезок<tex>M_{01}</tex> содержит <tex>M_{0111}</tex>, это его самая правая четверть);'''
Рассмотрим префиксный код [[file:Tree2forkraft.jpg|thumb|300px|Пример разбиения на группы, при <tex>C(X)r = 2</tex>: так как ни одно из кодовых слов не является префиксом никакого другого кодового слова, то никакие два отрезка не пересекаются.символах ''a, b, c'', где <tex> l_a = 2, l_b = 2, l_c = 1</tex>]]
#Если некоторое <tex> l_i = 0 </tex> , то <tex> n = 1 </tex> . В таком случае пустая строка является искомым префиксным кодом. Далее все <tex> l_i \geqslant 1 </tex> . #Для доказательства корректности разделим длины <tex> l_i </tex> на <tex>r</tex> , возможно пустых, групп, внутри каждой из которых <tex> \sum\limits r ^{-l_i} \leqslant \dfrac{1}{r} </tex> .#:Пусть у нас есть <tex>n</tex> символов, кодовые слова имеют длины <tex>l_1 \leqslant l_2 \leqslant \ldots \leqslant l_n </tex>. Давайте разделим данные символы на отрезке <tex>[0;r</tex> групп, внутри каждой из которых <tex> \sum\limits r ^{-l_i} \leqslant \dfrac{1}{r} </tex> . Разделить символы на группы можно следующим жадным образом: брать <tex> l_i </tex> в порядке увеличения индекса.#:Докажем, что в таком случае группа будет либо полностью укомплектована <tex>(\sum\limits r ^{-l_i} = \dfrac{1]}{r})</tex> выбрать некоторое количество непересекающихся отрезков, то очевиднолибо будут исчерпаны все возможные <tex> l_i </tex> . Это следует из того, что сумма их длин не превзойдет при <tex>l_i \geqslant 1</tex>на <tex>i</tex>-ом шаге либо группа уже укомплектована, то есть либо ее остаток равен: #: <center><tex> \sumdfrac{1}{r} - \left ( r^{-l_1} + r^{-l_2} + \limits_ldots + r^{-l_{i -1}} \right ) = \dfrac{r^{l_i-1}- ( r^{Il_i - l_1} M_+ r^{C_il_i - l_2} + \le ldots + r^{l_i - l_{i - 1}} )}{r^{l_i}}</tex></center>#:Так как группа не укомплектована, то числитель положителен. Если добавим <tex> l_i </tex> в группу, то числитель уменьшится на <tex>1</tex>, где <tex>l_i - l_j</tex> неотрицательно при <tex> i \geqslant j </tex> , и <tex> r \in \mathbb{N} </tex>. Следовательно числитель — натуральное число. Тогда, взяв <tex> l_i </tex> в группу, мы не перепрыгнем через максимальное значение, то есть сумма группы <tex> \leqslant \dfrac{1}{r} </tex> . А значит, создавая группы по данному алгоритму мы сможем построить <tex>r</tex> групп, удовлетворяющих условию.#Выберем для каждой группы свой начальный символ. Запуститим данную процедуру для каждой группы слов, предварительно обрезав первую букву.#По индукции по величине <tex> l_n </tex> докажем, что наш алгоритм корректен. #:'''База:''' При <tex> l_n = 0 </tex> корректность процедуры очевидна. #:'''Переход: ''' Допустим, что процедура корректна для <tex> l_n = w </tex> . Докажем, что процедура корректна и для <tex> l_n = w + 1 </tex> . #:Заметим, что у слов каждой группы будет своя начальная буква, поэтому достаточно проверить префиксность кода для каждой группы. А это истинно по предположению индукции, где для каждой группы <tex> l_i \leqslant w </tex>.
Отсюда следует, что <tex>\sum\limits_{i = 1}^{I} M_{C_i} = \sum\limits_{i = 1}^{I} 2^{-l_i} \le 1</tex>.
}}
== Следствие Замечания ==Можно обобщить Когда имеет место строгое неравенство Крафта для случаев? Легко заметить, когда кодирующим алфавитом что если любая концевая вершина дерева является k-ичный. В доказательстве изменятся некоторые пункты:*отрезок кодовым словом, то <tex>[0;K = 1]</tex> придется делить . Строгое неравенство имеет место лишь в случае, когда некоторые из концевых вершин не на <tex>2</tex>используются. Однако, в случае двоичного кодового алфавита какая-нибудь концевая вершина не используется, то предыдущее решение оказывается лишним, и соответствующая цифра может быть удалена из каждого кодового слова, декодирование которого проходит через эту вершину. Таким образом, если имеет место строгое неравенство, то код неэффективен, но для двоичных деревьев очевидно, а на <tex>k</tex> равных частей;как можно его улучшить. *соответственно неравенство примет вид: <tex>\sum\limits_{i = 1}^{I} k^{-l_i} \le 1 </tex>Заметим еще раз, что теорема утверждает существование такого кода и ничего не говорит о конкретных кодах. Может существовать код, который удовлетворяет неравенству Крафта и тем не менее не является префиксным
== Ссылки См.также ==*[http://ru.wikipedia.org/wiki/Неравенство_Крафта [Неравенство Крафта — ВикипедияМакмиллана]]*ftp://remotesensing.ru/InfoTheory_lec05.pdf
== Литература Источники информации ==*А[http://ru.wikipedia.Шень "Программированиеorg/wiki/Неравенство_Крафта Википедия — Неравенство Крафта]*[http: теоремы и задачи"//books.sernam.ru/book_htc.php?id=35 Неравенство Крафта]*[https://xlinux.nist.gov/dads/HTML/kraftsinqlty.html Kraft's inequality]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Алгоритмы сжатия]]
1632
правки

Навигация