Лекция 6. Арифметическое кодирование.



Алгоритм арифметического кодирования.

Алгоритм кодирования Хаффмана, в лучшем случае, не может пе­редавать на каждый символ сообщения менее одного бита информации. Предположим, известно, что в сообщении, состоящем из нулей и еди­ниц, единицы встречаются в 10 раз чаще нулей. При кодировании ме­тодом Хаффмана и на 0 и на 1 придется тратить не менее одного бита. Но энтропия д.с.в., генерирующей такие сообщения « 0.469 бит/сим. Метод Хаффмана дает для минимального среднего количества бит на один символ сообщения значение 1 бит. Хотелось бы иметь такую схе­му кодирования, которая позволяла бы кодировать некоторые символы менее чем одним битом. Одной из лучших среди таких схем является арифметическое кодирование, разработанное в 70-х годах XX века.

По исходному распределению вероятностей для выбранной для кодирования д. с.в. строится таблица, состоящая из пересекающихся только в граничных точках отрезков для каждого из значений этой д.с.в.: объединение этих отрезков должно образовывать отрезок [0.1], а их длины должны быть пропорциональны вероятностям соответству­ющих значений д.с.в. Алгоритм кодирования заключается в постро­ении отрезка, однозначно определяющего данную последовательность значений д.с.в. Затем для построенного отрезка находится число, при­надлежащее его внутренней части и равное целому числу, деленному на минимально возможную положительную целую степень двойки. Это число и будет кодом для рассматриваемой последовательности. Все воз­можные конкретные коды - это числа строго большие нуля и строго меньшие одного, поэтому можно отбрасывать лидирующий ноль и де­сятичную точку, но нужен еще один специальный код-маркер, сигна­лизирующий о конце сообщения. Отрезки строятся так. Если имеется отрезок для сообщения длины n – 1, то для построения отрезка для сооб­щения длины n, разбиваем его на столько же частей, сколько значений имеет рассматриваемая д.с.в. Это разбиение делается совершенно так­же как и самое первое (с сохранением порядка). Затем выбирается из полученных отрезков тот, который соответствует заданной конкретной последовательности длины п.

Принципиальное отличие этого кодирования от рассмотренных ра­нее методов в его непрерывности, т.е. в ненужности блокирования. Эффективность арифметического кодирования растет с ростом длины сжимаемого сообщения (для кодирования Хаффмана или Шеннона-Фано этого не происходит). Хотя арифметическое кодирование дает обычно лучшее сжатие, чем кодирование Хаффмана. Оно пока используется на практике сравнительно редко, т.к. оно появилось гораздо позже и тре­бует больших вычислительных ресурсов.

При сжатии заданных данных, например, из файла все рассмотрен­ные методы требуют двух проходов. Первый для сбора частот симво­лов, используемых как приближенные значения вероятностей символов, и второй для собственно сжатия.

Пример арифметического кодирования. Пусть д.с.в. X может при­нимать только два значения 0 и 1 с вероятностями 2/3 и 1/3 соответ­ственно. Сопоставим значению 0 отрезок [0,2/3], а 1 [2/3,1], Тогда для д.с.в. Х.

 

 

таблица построения кодов

 

 

 

 

Среднее количество бит на единицу сообщения для арифметиче­ского кодирования получилось меньше, чем энтропия. Это связано с тем, что в рассмотренной простейшей схеме кодирования, не описан код-маркер конца сообщения, введение которого неминуемо сделает это среднее количество бит большим энтропии.

Получение исходного сообщения из его арифметического кода про­исходит по следующему алгоритму.

Шаг 1. В таблице для кодирования значений д.с.в. определяется ин­тервал, содержащий текущий код, по этому интервалу одно­значно определяется один символ исходного сообщения. Если этот символ - это маркер конца сообщения, то конец.

 Шаг 2. Из текущего кода вычитается нижняя граница содержащего его интервала, полученная разность делится на длину этого же интервала. Полученное число считается новым текущим значением кода. Переход к шагу 1.

 


Дата добавления: 2022-01-22; просмотров: 24; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!