Изменения

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

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

677 байт добавлено, 16:01, 19 марта 2018
Нет описания правки
|about=неравенство Крафта
|statement=
Пусть <tex>\Sigma</tex> — [[Основные определения, связанные со строками|алфавит]] из у нас есть <tex>n</tex> [[Основные определения, связанные со строками|символов]], кодовые слова которого которых имеют длины <tex>l_1 \leqslant l_2 \leqslant \ldots \leqslant l_n </tex>.
Тогда необходимое и достаточное условие существования префиксного кода в <tex>r</tex>-ичном алфавите для данных символов из <tex>\Sigma</tex>, состоит в выполнении неравенства:
<center><tex> \sum\limits_{i = 1}^{n} r ^{-l_i} \leqslant 1 </tex></center>
'''Достаточность:'''
Для доказательства достаточности опишем рекурсивную процедуру[[file:Tree2forkraft.jpg|thumb|300px|Пример разбиения на группы, которая строит код для данного набора длин при <tex> l_i r = 2</tex> , удовлетворяющих неравенству символах ''a, b, c'', где <tex> \sum\limits_{i l_a = 2, l_b = 2, l_c = 1}^{n} r ^{-l_i} \leqslant 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_i 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>(\sum\limits r ^{-l_i} = \dfrac{1}{r})</tex>, либо будут исчерпаны все возможные <tex> l_i </tex> . Это следует из того, что при <tex> l_i \geqslant 1 </tex> , то на <tex>i</tex>-ом шаге либо группа уже укомплектована, либо ее остаток равен: #: <center><tex> \dfrac{1}{r} - \left ( r^{-l_1} + r^{-l_2} + \ldots + r^{-l_{i-1}} \right ) = \dfrac{r^{l_i-1}{- ( r^{l_i - l_1}+ r^{l_i - l_2} + \ldots + \dfracr^{l_i - l_{i - 1}} )}{r^{l_i-1}} \right ) </tex> делится на </center>#:Так как группа не укомплектована, то числитель положителен. Если добавим <tex>\dfrac{1}{r^{l_i}}</tex> в группу, потому что каждый член слева делятся то числитель уменьшится на <tex> \dfrac{1}{r^{</tex>, где <tex>l_i}} - l_j</tex> . Получаем, что остаток набираемой группы до неотрицательно при <tex>i \dfrac{1}{r}geqslant j </tex> всегда делится на текущую величину , и <tex> r ^\in \mathbb{-l_iN} </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> .
}}

Навигация