Неравенство Макмиллана — различия между версиями
Krotser (обсуждение | вклад) |
Krotser (обсуждение | вклад) |
||
Строка 12: | Строка 12: | ||
|definition='''''Кодом''''' для алфавита <tex>A</tex> называется функция (таблица) <tex>\alpha</tex>, которая для каждого символа <tex>a</tex> из <tex>A</tex> указывает двоичное слово <tex>\alpha(a)</tex>. Не требуется, чтобы коды всех символов имели равные длины. | |definition='''''Кодом''''' для алфавита <tex>A</tex> называется функция (таблица) <tex>\alpha</tex>, которая для каждого символа <tex>a</tex> из <tex>A</tex> указывает двоичное слово <tex>\alpha(a)</tex>. Не требуется, чтобы коды всех символов имели равные длины. | ||
}} | }} | ||
− | Хороший код должен позволять декодирование (восстановление последовательности символов по ее коду). Пусть фиксирован алфавит <tex>A</tex> и код <tex>\alpha</tex> для этого алфавита. Для каждого слова <tex>P</tex> в алфавите <tex>A</tex> (то есть для любой конечной последовательности букв алфавита <tex>A</tex>) рассмотрим двоичное слово <tex>\alpha(P)</tex>, которое получается, если записать подряд коды всех букв из <tex>P</tex> (без каких-либо разделителей). | + | Хороший код должен позволять декодирование (восстановление последовательности символов по ее коду). Пусть фиксирован алфавит <tex>A</tex> и код <tex>\alpha</tex> для этого алфавита. Для каждого слова <tex>P</tex> в алфавите <tex>A</tex> (то есть для любой конечной последовательности букв алфавита <tex>A</tex>) рассмотрим двоичное слово <tex>\alpha(P)</tex>, которое получается, если записать подряд коды всех букв из <tex>P</tex> (без каких{{---}}либо разделителей). |
{{Определение | {{Определение | ||
|definition=Код <tex>\alpha</tex> называется '''''однозначным''''', если коды различных слов различны: <tex>\alpha(P)\ne\alpha(P')</tex> при <tex>P\ne{P'}</tex>. | |definition=Код <tex>\alpha</tex> называется '''''однозначным''''', если коды различных слов различны: <tex>\alpha(P)\ne\alpha(P')</tex> при <tex>P\ne{P'}</tex>. |
Версия 03:42, 31 октября 2011
Необходимые определения
Определение: |
Алфавит — конечное множество. |
Определение: |
Символами или буквами называются элементы этого алфавита. |
Определение: |
Кодовым словом или просто кодом символа называется двоичное слово (Двоичное слово — конечная последовательность нулей и единиц). |
Определение: |
Кодом для алфавита | называется функция (таблица) , которая для каждого символа из указывает двоичное слово . Не требуется, чтобы коды всех символов имели равные длины.
Хороший код должен позволять декодирование (восстановление последовательности символов по ее коду). Пусть фиксирован алфавит
и код для этого алфавита. Для каждого слова в алфавите (то есть для любой конечной последовательности букв алфавита ) рассмотрим двоичное слово , которое получается, если записать подряд коды всех букв из (без каких—либо разделителей).Определение: |
Код | называется однозначным, если коды различных слов различны: при .
Неравенство Макмиллана
Теорема: |
(где , а — длины кодовых слов) выполняется не только для любого префиксного кода, но и вообще для любого однозначного кода. |
Доказательство: |
Есть разные способы решить эту задачу, но будет приведено простое и красивое, хотя и несколько загадочное, решение. Вместо нулей и единиц будем использовать и (из чего составлять коды разницы нет). Запишем формально сумму всех кодовых слов как алгебраическое выражение (многочлен от и , в котором одночлены записаны как произведения переменных и , без возведения в степень). Теперь (ещё более странное на первый взгляд действие) возведём это в степень (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах: сумма одночленов.Например, для кода со словами (которые теперь записываются как ) и для получаемТеперь подставим В этом примере все одночлены в правой части различны (если не переставлять переменные), и это не случайно: так будет для любого однозначного кода. В самом деле, по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов. в наше неравенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится (в скобке как раз выражение из неравенства Крафта—Макмиллана). Правую часть мы оценим сверху, сгруппировав слова по длинам: имеется не более слагаемых длины , каждое из которых равно , и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть . Итак, получаем, что и это верно при любом . Если основание степени в левой части больше единицы, то при больших это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому, для однозначного кода выполняется неравенство Крафта—Макмиллана. Что и требовалось доказать. |
Ссылки
Литература
А. Шень "Программирование: теоремы и задачи" (Издание четвёртое, Москва, Издательство МЦНМО, 2011) стр. 206 - 210