Лекция 5. Примеры кодирований: сериальное кодирование, кодирование натуральных чисел, побуквенное кодирование.
Сериальное кодирование. Определение сериального кода было дано в предыдущей лекции. Рассмотрим его свойства. Определение. Длиной сериального кода назовем число [ log x]*=1 при x=1 и [ log x]*= [ log x] при x>1. Определение. Средней длиной кода для n-последовательностей назовем число
Где сумма берется по всем двоичным последовательностям длины n. Свойства такого кодирования иллюстрируются следующими двумя утверждениями. Утверждение. Если все xi=1, то l(α)=|α|. Утверждение. Если все xi>1, то Доказательство.
Утверждение. Средняя длина слова с S сериями в сериальном кодировании Утверждение. Справедлива асимптотическая оценка
Из этих утверждений следует.
Таким образом, сериальное кодирование при малых количествах серий и большой длине серий приводит к тому, что при таком кодировании возникает эффект сжатия. Если серии короткие и их много, например: Пусть Лемма. Справдлива формула
Доказательство. Если слово
где При этом если
и если
Далее, если
Если
Число неизвестных в первом уравнении равно Так как множества неизвестных не пересекаются, то число решений системы (5.4) равно
или
Таким образом, число решений системы (4.5) равно
при Если же
Окончательно получаем формулу (5.2). Лемма доказана. Коды натурального ряда. Здесь мы будем рассматривать алфавиты А = (0,1,…,9) и B= (0,1). Задача кодирования натуральных чисел битовыми последовательностями актуальна, так как часто необходимо хранить и передавать информацию в бинарном виде. Особенно остро она встала в 50-е годы прошлого века в связи с распространением компьютеров. В данной модели предполагается, что нужно работать (хранить, передавать) с битовой информацией, изначально представимой, например, в десятичных числах. При этом набор чисел представляется битовой последовательностью без разделителей. Простой переход к двоичной записи не обеспечивает префиксности, а, следовательно, и декодируемости этой битовой последовательности. Приведем примеры кодов, которые это обеспечивают. Пусть n > 1, двоичную запись числа n обозначим BIN(n) = α 1… αn, α i Так как любая двоичная запись натурального числа начинается с единицы, то префиксность можно обеспечить с помощью тривиального кода TK(n)= 0…0BIN(n), Где число нулей префиксе равно [log n ] + 1. Длина такого кода 2[log n ] + 2. Следующие два примера дают более экономное кодирование. Код Элайеса. Код Элайеса неотрицательного целого числа n обозначим через El (n). Положим El (0) = 10, El (1) = 11. Пусть n > 1. В этом случае длина слова BIN(n) больше единицы. Код Элайеса состоит из трех фрагментов. Вначале идет некоторое количество нулей, подсчитав которые, мы найдем число символов в двоичной записи |BIN(n)|. Для экономии, учитывая предыдущее замечание можно взять количество нулей на единицу меньшее числа символов в двоичной записи |BIN(n)|. (Так как любая двоичная запись начинается с единицы, то мы всегда знаем, где заканчивается наша цепочка нулей). Теперь мы это количество символов записи |BIN(n)| отсчитываем после последнего нуля, а затем полученный фрагмент из нулей и единиц переводим в десятичную запись и получаем длину закодированного слова. Зная эту длину, мы отсчитываем нужное нам число символов, а полученный фрагмент и будет двоичной записью закодированного натурального числа. Опять же для экономии первую единицу данного фрагмента можно в коде опустить.
Тогда El (n)= 00…0 BIN([log n ]+1) B (n), где 00…0 – маркер, необходимый для того, чтобы знать, сколько последующих за 0 символов может задавать длину записи числа. Поэтому в данном коде количество нулей перед BIN([log n ]+1) равно |BIN([log n ]+1)|-1. Примеры (пробелы стоят только для иллюстрации): El (5) = 0 11 01. El (75) = 00 111 001011. Утверждение. Длина | El (n)| не превосходит log n + 2 log (log n) + 3. Код Левенштейна В коде Элайеса мы сэкономили по сравнению с тривиальным кодом за счет уменьшения префикса. В коде Левенштейна эта идея доведена до определенного истощения: от двоичной записи числа мы сначала переходим к двоичной записи длины BIN(n) (это было и в коде Элайеса), но затем мы переходим к длине длины, длине длины длины и т.д. Введем для удобства формальной записи этой идеи некоторые обозначения. Пусть λ 0(n) = [log n ]. А далее по аналогии до λ k 0(n) = λ 0 (λ k -10(n)) = [log…[log n ]]. Для любого n существует S такое, что: λ S 0(n) = 0, λ S -10(n) = 1. Положим Lev (0)=0, Lev (1) =10. Пусть n > 1. Тогда для такого сила вышеупомянутый параметр S>1. Если в префиксе кода мы ставим S подряд идущих единиц, а затем ноль (чтобы показать, где эта цепочка единиц заканчивается), то это не может быть ни кодом 0, ни кодом 1. А так как λ S 0(n) = 0, λ S -10(n) = 1, то эти соотношения никакой информации для кодирования не содержат, и в код надо включать информацию о длинах, начиная с B (λ S -20(n). Отсюда и следует формула для кода Левенштейна. Lev (n) = 11…10 B (λ S -20(n))… B (λ 0(n)) B (n), где 11…10 – слово из S единиц и одного нуля. Утверждение. Длина кода Левенштейна задается соотношением | Lev (n)| = log n + log log n + o(log log n). Пример (пробелы только для иллюстрации): Lev (75) = 11110 0 11 001011
S = 4 Lev(5)=1110 0 01. Lev(62)=11110 0 01 11110. Побуквенное кодирование. Мы видели, что при словарном кодировании объектов найти код минимальной длины – это решить алгоритмически неразрешимую проблему. В такой ситуации уместна более слабая постановка задачи. Так как кодирование – это отображение одного множества слов в другое, то ослабление задачи заключается в наложении ограничений на вид такого отображения.
В предыдущей лекции мы рассмотрели два примера таких ограничений: сериальное кодирования и кодирование натурального ряда. Второй из этих примеров является частным случаем более общей ситуации: префиксного кодирования. Если пренебречь разделителями, то в качестве двух алфавитов возьмем алфавиты А = (а 1, …, а n) и B = (b 1, …, bq). Алгоритм побуквенного (алфавитного) кодирования. Каждой букве ai алфавита A ставится в соответствие Bi= φ(ai) – слово в алфавите B длины li. Алфавитное кодирование будет дешифруемым, если отображение
Заметим, что в приведенном определении термин дешифруемость используется в другом смысле, нежели выше при описании основных свойств кодирования (дешифруемость – неизбыточность - разумность). Поэтому в других учебниках используются иные термины, например, разделимость. Но не будем загромождать изложение терминами, тем более, что из контекста всегда ясно, о чем идет речь. Обратим внимание на следующий важнейший факт, который, по сути дела, и оправдывает интерес к такому виду кодирования. Очевидно, что ограничение на вид отображения φ сразу влечет дешифруемость однобуквенных (в алфавите А) слов. Но из дешифруемости однобуквенных слов сразу следует дешифруемость слов (в алфавите A) любой длины. Заметим также, что в случае дешифруемого кодирования все слова Bi= φ(ai) обязательно различны. Оказывается, что дешифруемость накладывает ограничение на набор длин кодовых слов. Об этом говорит утверждение, известное как неравенство Крафта. Теорема. Если алфавитное кодирование с длиной кодов l 1, …, ln дешифруемо, то выполняется неравенство:
Доказательство. Пусть А = (а 1, …, а n) и B = (b 1, …, bq). Каждой букве ai алфавита A ставится в соответствие Bi= φ(ai) – слово в алфавите B длины li. Положим
Пусть
Здесь введено обозначение S (n, t) – число слов длины t и вида Bi 1 Bi 2 … Bin. Из дешифруемости следует, что все такие слова различны, но число различных слов длины t в алфавите из q букв не превосходит qt, поэтому S (n, t) Тогда
Теорема доказана. Напомним, что слово α является подсловом слова β, если существуют слова γ и δ (возможно пустые) такие, что β=γαδ. Если γ- пустое слово, то слово α называется префиксом слова β. В общем случае из неравенства Крафта не следует дешифруемость. Определение. Кодирование называется префиксным, если ни одно из кодовых слов не является началом другого. Теорема. Префиксный код дешифруем. Доказательство: Пусть есть α и β – два слова: Покажем, что из равенства φ (α) = φ (β)следует равенство α = β. Пусть Поочередно слева направо сравниваем подслова слов α и β, используя знание функции ϕ, которая определяет наше побуквенное кодирование (эта функция позволяет находить Bi= φ(ai) среди подслов слов α и β. Сначала сравниваем Если длины слов Значит, α = β. Теорема доказана. Из теоремы сразу следует алгоритм декодирования префиксного кода. Алгоритм декодирования. Берем первый символ слова φ (α)и ищем однобуквенное слово среди кодовых слов. Если находим такое слово, например, Bi= φ(ai), то декодируем слово Bi= φ(ai) в букву ai и продолжаем работать, начиная со следующего символа слова φ (α). Если не находим, то добавляем следующий символ и ищем среди кодовых слов уже двухбуквенное слово. И т.д. В случае алфавитного кодирования можно ограничиться префиксными кодами, так как, в каком-то смысле, любой дешифруемый алфавитный (побуквенный) код можно «свести к префиксному». А существование префиксного кода полностью определяется неравенством Крафта. Теорема (о существовании префиксного кода). Префиксный код с длинами кодов l 1 … ln существует тогда и только тогда, когда выполняется неравенство Крафта
Доказательство. Т.к. префиксный код дешифруем, то выполняется неравенство Крафта. С другой стороны, пусть выполняется неравенство Крафта. Покажем, что в этом случае существует префиксный код. Мы просто опишем алгоритм построения такого кода, т.е. построим отображение Bi= φ(ai).
Пусть B 1 = | l 1| = 1 B 2 = | l 2| = 1 S 1 слов длины 1 … BS 1= | lS 1| =1 B S 1+1 = | l S 1+1| = 2 S 2 слов длины 2 …
Тогда левую часть неравенства Крафта можно представить в виде: S 1 S 2 S 3 Теперь пошагово строим наш префиксный код. Первый шаг: Любые S 1 букв в B можно использовать для кодирования слов длины. Это следует из того, что при выполнении неравенства Крафта справедливо соотношение: S 1/ q ≤ 1, из которого следует, что S 1 ≤ q. Таким образом мы получили первую группу однобуквенных слов. Второй шаг: Аналогично из неравенства Крафта получаем S 1/ q + S 2/ q ≤ 1. Отсюда S 1 q + S 2 ≤ q 2, S 2 ≤ q 2 – s 1 q. Поэтому можно взять S 2 слов длины 2 в алфавите B так, что они не начинаются со слов первой группы. Таким образом мы получили вторую группу двухбуквенных слов. Третий шаг: На этом шаге строим группу трехбуквенных слов так, чтобы они не начинались с ранее построенных слов. Такие трехбуквенные слова в нужном количестве существуют, так как вновь из неравенства Крафта следует, что S 1 / q + S 2 / q + S3 / q ≤ 1. А это означает, что S3 ≤ q3 – qS 2 – q 2 S 1. Таким образом проходим все l шагов и в результате получаем дешифруемый префиксный код. Теорема доказана. Утверждение. Код Элайеса – префиксный. Доказательство: Рассмотрим El (n) и El (m). Если хотя бы одно из этих слов начинается с 1, то это либо 0, либо 1. Утверждение доказано. Пусть n, m больше 1, вспомним теорему о дешифруемости кода: El (n) = α 1… α k, El (m) = β 1… β S (для определенности k ≥ s). Пусть количество 0, с которых начинается α, совпадает с количеством 0, с которых начинается β. (В противном случае сразу следует свойство префиксности кода.) Далее рассмотрим вторые подслова слов El (n) и El (m). Если они не совпадают, то префиксность кода доказана. Если совпадают, то переходим к окончаниям слов. Если они совпадают, то m=n. В противном случае n не равно m. Таким образом, при m≠n выполняется соотношение B (n) ≠ B (m). Утверждение доказано. Докажите в качестве упражнения следующее утверждение. Утверждение. Код Левенштейна префиксный.
Воспользуйтесь поиском по сайту: ![]() ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|