Опрос

Какой архиватор наиболее эффективный?:

Новички

Виктор Васильев
Юрий Антонов
Сергей Андреевич
Генадий
Avanasy

Процедура кодирования

Итак, перед началом кодирования исходный интервал составляет [0 – 1).

После пpосмотpа пеpвого символа сообщения Р кодер сужает исходный интеpвал до нового - [0.8; 1), котоpый модель выделяет этому символу. Таким образом, после кодирования первой буквы результат кодирования будет находиться в интервале чисел [ 0.8 - 1).

Следующим символом сообщения, поступающим в кодер, будет буква А . Если бы эта буква была первой в кодируемом сообщении, ей был бы отведен интервал [ 0 - 0.1 ), но она следует за Р и поэтому кодируется новым подынтервалом внутри уже выделенного для первой буквы, сужая его до величины [ 0.80 - 0.82 ). Другими словами, интервал [ 0 - 0.1 ), выделенный для буквы А , располагается теперь внутри интервала, занимаемого предыдущим символом (начало и конец нового интервала определяются путем прибавления к началу предыдущего интервала произведения ширины предыдущего интервала на значения интервала, отведенные текущему символу). В pезультате получим новый pабочий интеpвал [0.80 - 0.82), т.к. пpедыдущий интеpвал имел шиpину в 0.2 единицы и одна десятая от него есть 0.02.

Следующему символу Д соответствует выделенный интервал [0.1 - 0.2), что пpименительно к уже имеющемуся рабочему интервалу [0.80 - 0.82) сужает его до величины [0.802 - 0.804).

Следующим символом, поступающим на вход кодера, будет буква И с выделенным для нее фиксированным интервалом [ 0,3 – 0,6). Применительно к уже имеющемуся рабочему интервалу получим [ 0,8026 - 0,8032 ).

Пpодолжая в том же духе, имеем:

вначале                          [0.0 - 1.0)

после пpосмотpа          Р                 [0.8 - 1.0)

                                      А                 [0.80 - 0.82)

                                      Д                 [0.802 - 0.804)

                                      И                 [0.8026 - 0.8032)

                                      О        [0.80302 - 0.80308)

                                      В                 [0.803032 - 0.803038)

                                      И                 [0.8030338 - 0.8030356)

                                      З                   [0.80303488 - 0.80303506)

                                      И                   [0.803034934 - 0.803034988)

                                      Р                    [0.8030349772 - 0.8030349880)

Результат кодирования: интервал [0,8030349772 – 0,8030349880]. На самом деле, для однозначного декодирования теперь достаточно знать только одну границу интервала – нижнюю или верхнюю, то есть результатом кодирования может служить начало конечного интервала - 0,8030349772. Если быть еще более точным, то любое число, заключенное внутри этого интервала, однозначно декодируется в исходное сообщение. К примеру, это можно проверить с числом 0,80303498, удовлетворяющим этим условиям. При этом последнее число имеет меньшее число десятичных разрядов, чем числа, соответствующие нижней и верхней границам интервала, и, следовательно может быть представлено меньшим числом двоичных разрядов.

Нетрудно убедиться в том, что, чем шире конечный интервал, тем меньшим числом десятичных (и, следовательно, двоичных) разрядов он может быть представлен. Ширина же интервала зависит от распределения вероятностей кодируемых символов – более вероятные символы сужают интервал в меньшей степени и , следовательно, добавляют к результату кодирования меньше бит. Покажем это на простом примере.

Допустим, нам нужно закодировать следующую строку символов: A A A A A A A A A # , где вероятность буквы А составляет 0,9. Процедура кодирования этой строки и получаемый результат будут выглядеть в этом случае следующим образом:

Входной символ  Нижняя граница           Верхняя граница

    0.0                     1.0

                A    0.0                     0.9

                A    0.0                     0.81

                A     0.0                     0.729

                A     0.0                     0.6561

                A     0.0                     0.59049

                A    0.0                     0.531441

                A    0.0                     0.4782969

                А   0.0                                 0.43046721

                А                        0.0                     0.387420489

                #                         0.3486784401   0.387420489

Результатом кодирования теперь может быть, к примеру, число 0.35 , целиком попадающее внутрь конечного интервала 0.3486784401 – 0.387420489. Для двоичного представления этого числа нам понадобится 7 бит (два десятичных разряда соответствуют примерно семи двоичным ), тогда как для двоичного представления результатов кодирования из предыдущего примера – 0,80303498 – нужно 27 бит !!!