Неравенство Крафта — различия между версиями
Damm1t (обсуждение | вклад) м |
Damm1t (обсуждение | вклад) |
||
Строка 30: | Строка 30: | ||
'''Достаточность:''' | '''Достаточность:''' | ||
+ | |||
+ | *Если некоторое <tex> l_i = 0 </tex> , то <tex> n = 1 </tex> . В таком случае пустая строка является искомым префиксным кодом. Далее все <tex> l_i \geqslant 1 </tex> . | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Пусть у нас есть <tex>n</tex> символов, кодовые слова которого имеют длины <tex>l_1 \leqslant l_2 \leqslant \ldots \leqslant l_n </tex>. Давайте разделим данные символы на <tex>r</tex> групп, внутри каждой из которых <tex> \sum\limits r ^{-l_i} \leqslant \dfrac{1}{r} </tex> . Разделить символы на группы можно следующим жадным образом: брать <tex> l_i </tex> в порядке увеличения индекса. | ||
+ | |||
+ | Докажем, что в таком случае группа будет либо полностью укомплектована, либо будут исчерпаны все возможные <tex> l_i </tex> . Это следует из того, что при <tex> l_i \geqslant 1 </tex> на <tex>i</tex>-ом шаге либо группа уже укомплектована, либо ее остаток равен: | ||
+ | |||
+ | <center><tex> \dfrac{1}{r} - \left ( \dfrac{1}{r^{l_1}} + \ldots + \dfrac{1}{r^{l_i-1}} \right ) = \dfrac{r^{l_{i-1}} - ( r^{l_i - l_1} + r^{l_i - l_2} + \ldots + r^{l_i - l_{i - 1}} )}{r^{l_i}}</tex></center> | ||
+ | |||
+ | Так как группа не укомплектована, то числитель положителен. Если добавим <tex> l_i </tex> в группу, то числитель уменьшится на <tex>1</tex>. Тогда, взяв <tex> l_i </tex> в группу, мы не перепрыгнем через максимальное значение. А значит, создавая группы по данному алгоритму мы сможем построить <tex>r</tex> групп, удовлетворяющих условию. | ||
+ | |||
+ | ---- | ||
Для доказательства достаточности опишем рекурсивную процедуру, которая строит код для данного набора длин <tex> l_i </tex> , удовлетворяющих неравенству <tex> \sum\limits_{i = 1}^{n} r ^{-l_i} \leqslant 1 </tex> . | Для доказательства достаточности опишем рекурсивную процедуру, которая строит код для данного набора длин <tex> l_i </tex> , удовлетворяющих неравенству <tex> \sum\limits_{i = 1}^{n} r ^{-l_i} \leqslant 1 </tex> . | ||
− | + | *Разделим длины <tex> l_i </tex> на <tex>r</tex> групп, внутри каждой из которых <tex> \sum\limits r ^{-l_i} \leqslant \dfrac{1}{r} </tex> . Разделить длины на группы будем алгоритмом описанным выше. У всех слов из одной группы будет одна и та же начальная буква. | |
− | |||
− | Разделим длины <tex> l_i </tex> на <tex>r</tex> групп, внутри каждой из которых <tex> \sum\limits r ^{-l_i} \leqslant \dfrac{1}{r} </tex> . Разделить длины на группы | ||
− | + | *Запуститим данную процедуру для каждой группы слов, предварительно обрезав первую букву. | |
Доказательство корректности проведём по индукции по величине <tex> l_n </tex> . | Доказательство корректности проведём по индукции по величине <tex> l_n </tex> . |
Версия 20:11, 2 января 2018
Рассматриваемое ниже неравенство Крафта показывает для каких длин кодовых слов существует префиксный код.
Теорема (неравенство Крафта): |
— |
Доказательство: |
Необходимость: Напомним, что префиксный код можно представить в виде индукции. -ичного корневого дерева, рёбра которого соответствуют символам алфавита, а листья соответствующим кодам. Неравенство Крафта будем доказывать поДля простоты рассмотрим сначала случай двоичного алфавита, то есть .База: Если максимальная длина пути на дереве равна , то в дереве есть одно или два ребра длины . Таким образом, либо — для одного символа источника, либо — для двух символов источника.Переход: Предположим далее, что неравенство Крафта справедливо для всех деревьев высоты меньше . Докажем, что оно справедливо и для всех деревьев высоты меньше . Для данного дерева максимальной высоты ребра из первой вершины ведут к двум поддеревьям, высоты которых не превышают ; для этих поддеревьев имеем неравенства и , где — значения соответствующих им сумм. Каждая длина в поддереве увеличивается на , когда поддерево присоединяется к основному дереву, поэтому возникает дополнительный множитель . Таким образом, имеем .
Достаточность:
Пусть у нас есть символов, кодовые слова которого имеют длины . Давайте разделим данные символы на групп, внутри каждой из которых . Разделить символы на группы можно следующим жадным образом: брать в порядке увеличения индекса.Докажем, что в таком случае группа будет либо полностью укомплектована, либо будут исчерпаны все возможные . Это следует из того, что при на -ом шаге либо группа уже укомплектована, либо ее остаток равен:Так как группа не укомплектована, то числитель положителен. Если добавим в группу, то числитель уменьшится на . Тогда, взяв в группу, мы не перепрыгнем через максимальное значение. А значит, создавая группы по данному алгоритму мы сможем построить групп, удовлетворяющих условию.Для доказательства достаточности опишем рекурсивную процедуру, которая строит код для данного набора длин , удовлетворяющих неравенству .
Доказательство корректности проведём по индукции по величине .База: Если , то процедура корректна.Переход: Допустим, что процедура корректна для Заметим, что у слов каждой группы будет своя начальная буква, поэтому достаточно проверить префиксность кода для каждой группы. А это истинно по предположению индукции, где для каждой группы . Докажем, что процедура корректна и для . . |
Замечания
Когда имеет место строгое неравенство? Легко заметить, что если любая концевая вершина дерева является кодовым словом, то
. Строгое неравенство имеет место лишь в случае, когда некоторые из концевых вершин не используются. Однако, в случае двоичного кодового алфавита какая-нибудь концевая вершина не используется, то предыдущее решение оказывается лишним, и соответствующая цифра может быть удалена из каждого кодового слова, декодирование которого проходит через эту вершину. Таким образом, если имеет место строгое неравенство, то код неэффективен, но для двоичных деревьев очевидно, как можно его улучшить.Заметим еще раз, что теорема утверждает существование такого кода и ничего не говорит о конкретных кодах. Может существовать код, который удовлетворяет неравенству Крафта и тем не менее не является префиксным.