Научная статья на тему 'Обобщение известных способов кодирования строк'

Обобщение известных способов кодирования строк Текст научной статьи по специальности «Математика»

CC BY
390
45
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
КОДИРОВАНИЕ ХАФФМАНА / АЛГОРИТМЫ ЛЕМПЕЛЯ ЗИВА / ЭНУМЕРАТИВНОЕ КОДИРОВАНИЕ / HUFFMAN CODING / LEMPEL-ZIV ALGORITHMS / LZ77 / LZ78 / ENUMERATIVE CODING

Аннотация научной статьи по математике, автор научной работы — Ковалев Дмитрий Сергеевич

В статье рассматривается кодирование Хаффмана. Его ключевым элементом является построение бинарного дерева. Дерево задает некоторый способ рекурсивного разбиения множества алфавита для получения префиксных кодов. Широко известно обобщение бинарного дерева на q-арное. В данной статье приводится обобщение кодирования Хаффмана на случай произвольного дерева. Описывается новый подход для понимания алгоритмов кодирования семейства Лемпеля Зива. Предлагается считать, что эти алгоритмы кодируют не саму строку, а некоторое отображение, связанное с ней. При этом строка является неподвижной точкой кодируемого отображения.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

GENERALIZATION OF KNOWN METHODS OF STRING CODING

The first part of this paper is about Huffman coding. Its key feature is a binary tree construction. This tree defines recursive partition of alphabet set to construct prefix codes. Generalization of binary tree to q-ary tree is well known. This paper gives Huffman coding generalization for any trees. The second part of this paper defines another approach to understanding Lembel-Ziv family of algorithms. The suggestion is that these algorithms encode a mapping associated with a string, not a string itself. The string is a fixed point of encoded mapping in this case.

Текст научной работы на тему «Обобщение известных способов кодирования строк»

УДК 519.72

Д. С. Ковалев

Новосибирский государственный университет ул. Пирогова, 2, Новосибирск, 630090, Россия E-mail: dmitriy.kovalev@gmail.com

ОБОБЩЕНИЕ ИЗВЕСТНЫХ СПОСОБОВ КОДИРОВАНИЯ СТРОК

В статье рассматривается кодирование Хаффмана. Его ключевым элементом является построение бинарного дерева. Дерево задает некоторый способ рекурсивного разбиения множества алфавита для получения префиксных кодов. Широко известно обобщение бинарного дерева на q-арное. В данной статье приводится обобщение кодирования Хаффмана на случай произвольного дерева. Описывается новый подход для понимания алгоритмов кодирования семейства Лемпеля - Зива. Предлагается считать, что эти алгоритмы кодируют не саму строку, а некоторое отображение, связанное с ней. При этом строка является неподвижной точкой кодируемого отображения.

Ключевые слова: кодирование Хаффмана, алгоритмы Лемпеля - Зива, энумеративное кодирование.

Введение

Сжатие данных - это процесс экономного кодирования информации. Можно выделить два подхода к такому кодированию. В первом случае кодируются непосредственно сами данные. Этот подход имеет широкое распространение, кодирование Хаффмана [1] является одним из его примеров. Второй подход заключается в том, что кодируются не сами данные, а некоторое преобразование, связанное с ними. При этом данные можно восстановить из преобразования и, возможно, некоторой дополнительной информации. Примером такого подхода может служить фрактальное сжатие изображений [2]. Его суть заключается в том, что вместо изображения запоминается система итерируемых функций, для которой исходное изображение является аттрактором (неподвижной точкой).

В данной работе мы рассмотрим оба подхода: обобщим кодирование Хаффмана и покажем, что кодирование Лемпеля - Зива [3; 4] можно рассматривать как кодирование отображения, для которого данные являются неподвижной точкой.

Любую информацию (текст, изображение, звук и т. п.) можно представить в виде строки символов над некоторым алфавитом, поэтому далее будем рассматривать только кодирование строк. Зафиксируем алфавит А = {а1, а2,..., ак} из к > 1 элементов. Множество строк

фиксированной длины п обозначим Ап. Длину строки ^ будем обозначать , а ее символ,

стоящий на позиции 1 < г < , как ^[г].

Пусть ^ е Ап - строка, которую нужно закодировать. Будем считать, что статистика встречаемости каждого символа алфавита А в строке ^ известна: символ а{ встречается п{ раз, при этом п1 + п2 + ... + пк = п .

Обобщение кодирования Хаффмана

Рассмотрим способ кодирования строки ^ . Одним из давно известных подходов является энумеративное кодирование [5]. Его суть заключается в следующем. Обозначим Ап [п1, п2,..., пк ] все строки ^ е Ап с фиксированной статистикой (п1, п2,..., пк). Количество таких строк выражается мультиномиальным коэффициентом

ISSN 1818-7900. Вестник НГУ. Серия: Информационные технологии. 2010. Том 8, выпуск 4 © Д. С. Ковалев, 2010

f n Л n!

пх, n2,..„ nk

= N.

п1!п2!... nk !

Следовательно, все строки из An [nj,n2,...,nk] можно перенумеровать некоторым способом числами от 0 до N — 1. В такой ситуации кодирование является получением номера по строке, а декодирование - получением строки по ее номеру. Кодирование является оптимальным в том смысле, что каждому из N различных объектов сопоставляется уникальный номер 0,1,..., N — 1.

Определим функцию кодирования:

index : An [nj,n2,...,nk] ^ 0,1,...,N — J,

и декодирования:

index—J :0,J,...,N — J ^ An [nJ,n2,...,nk]. Для получения битового представления закодированной строки s достаточно записать index (s) в двоичной системе счисления.

Если H0 = log2 N , то потребуется не более |" H0 "| бит для двоичного представления каждой строки из An [nJ,n2,...,nk]. Число H0 также называется энтропией Хартли [6] множества

A" К n2,.■■, nk ].

Согласно работе [7] оптимальным количеством бит для кодирования строки из An [nJ,n2,...,nk] является nH , где H - энтропия Шеннона:

^ n

H — Z Pi l0g2 Pi , где Pi =— .

i=j n

Число nH будем называть размером по энтропии для строки s . Энумеративное кодирование дает лучший результат (можно потратить меньше бит, чем nH ), потому что используется точная статистика встречаемости символов, в то время как в работе [7] рассматриваются вероятности появления символов. Всегда выполняется

J n

-H0 < H .

При n ^ ж имеет место следующая сходимость:

1 J

"H0 =- l0g2 n n

n

\

Z Pi l0g2 Pi = H ( P 1, P2,., Pk ) , где Pi =— .

vnJ, n2,..., nk J i=J n

Сходимость доказывается непосредственно, если разложить факториал по формуле Стир-линга. Из этого следует, что энумеративное кодирование также позволяет закодировать строку не хуже размера по энтропии.

Функцию index можно задать таблично. Нужно построить таблицу, где в первой колонке будет находиться строка, а во второй - ее номер. Однако такой способ является неэффективным для реального использования на вычислительной машине. Таблица для хранения требует количество памяти пропорциональное N , которое является огромным даже при малых длинах строк n .

Рассмотрим эффективный способ построения функции index, в котором номер строки s строится только с использованием символов самой строки s . В дальнейшем этот способ будет обобщен и показана его связь с кодированием Хаффмана.

Закодируем позиции всех символов aJ, которые встречаются в строке s . Для этого сформируем битовую строку sJ длины n, где единица стоит на месте символа aJ, а остальные нули:

г , [1,если s [i] = aJ sJ [i] = < r , .

[0, если s [i] Ф aJ

Строка sJ содержит в точности nJ единиц. После того, как позиции всех символов aJ известны, аналогичным образом формируем строку s2, чтобы запомнить позиции символов

(

а2. Длина строки s2 будет п — п1, потому что позиции а1 уже известны. Будем продолжать формировать строки для остальных символов алфавита а3,..., ак.

Всего придется изготовить к — 1 строк, последняя из которых отделит символы ак—1 и ак друг от друга. Исходную строку я можно однозначно восстановить по набору (s2,...,лк—1) очевидным способом. Следовательно, имеет место взаимно однозначное соответствие

л ^ , . * ', Лк—1 )

и кодирование строки я эквивалентно кодированию набора битовых строк (л2,..., лк—1).

Каждая битовая строка ^ содержит в точности п1 единиц. Количество битовых строк ^ с

Л „IЛ

v ni у

Стало

фиксированным числом единиц пг выражается биномиальным коэффициентом быть, каждой такой строке можно присвоить номер Л( ), такой что

л п

о <Л( л, )< 1 = в,, г=1,2,., к—1.

I пг )

Способы построения Л( ) описаны в [5], где битовая строка с заданным числом единиц

называется битовой строкой с заданным весом.

Произведение всех , где г = 1,2,., к — 1, дает в точности уже упомянутый мультиномиальный коэффициент:

п

n2

=D1D2.

D

k-1 •

г у

Таким образом, набор Л( s1) ,Л( s2) ,...,Л( sk-1) можно интерпретировать цифрами в записи числа index(s) в системе счисления по смешанному основанию D1D2...Dk-1. Запишем в явном виде номер строки s :

index (s )=Л( si ) + Л( „2) Di +Л( S3) D1D2 + ... + Л( Sk-1) D1D2... Dk-2.

При таком подходе функция index-1 реализуется тривиально.

Внимательнее рассмотрим приведенную схему. Мы взяли алфавит A и разделили его на две части: A = A) и A1, где A0 = {aj , A1 = {a2,a3,...,ak} . Потом в строке s все вхождения символа a1 обозначили единицей, а вхождения остальных символов нулями, и получили тем самым строку s1. Далее взяли A1 и опять разделили на две части: A1 = A10 и A11, где A10 ={a2} , A11 ={a3,a4,...,ak} . Среди символов, обозначенных нулем на предыдущем шаге, все вхождения a2 обозначили единицей, а остальных символов - нулями. В результате была построена строка s2 . Мы продолжали делать разбиение алфавита до тех пор, пока в последнее множество не попали последние два символа ak-1 и ak. В результате получили набор рекурсивных разбиений алфавита A :

Л Л ЛЛЛ

A = A0 и

A10 и

A110 и

A11.10 U A11.1

, где

Д) ={а1} , А10 ={а2 } ,., А11^10 — {ак—1} , АП.Л1 ={ак } .

к—1 к—1

Для удобства любые рекурсивные разбиения можно представлять в виде дерева (в данном случае оно бинарное), которое в дальнейшем будем называть деревом разбиения алфавита.

Листьями в дереве являются одноэлементные подмножества или (фактически) символы алфавита А. Именно разбиение определило способ формирования всех строк .

Теперь рассмотрим произвольные рекурсивные разбиения алфавита и обобщим на них описанный подход. На каждом шаге разбивать можно на произвольное число частей, но в конце должны остаться одноэлементные подмножества алфавита. Можно выбирать следующие стратегии разбиения:

k-1

k-1

V

• делить каждое множество на две части - бинарное дерево;

• делить каждое множество на д > 2 частей - д-е дерево;

• делить каждое множество на произвольное число частей - произвольное дерево. Для мультиномиального коэффициента выполняется замечательное тождество:

f n + п2 + ... + пк) f n + ...+ nt + nt+i + .

пг, n2

-> n

к У

. + Пк V

+п

п + ...+nt

т,..., n

t

nt+1 + . + nk

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Л

v nt+1,

n

к У

П + - + П. П(+1 + -- - ' »* у

Благодаря этому любое дерево разбиения алфавита А единственным образом соответст-

( п \

вует разложению числа циентов Di:

ni, n2,..., nk

на множители из других мультиномиальных коэффи-

ni, n2

,n

= од.

к У

Каждый множитель Di соответствует внутреннему узлу дерева разбиения, у которого имеется к дочерних узлов. В то же время каждому такому узлу соответствует строка st из символов 0,1,..., ki — 1, которой опять можно сопоставить номер Л(st) такой, что 0 < Л(s )< Dt. Вычисляя последовательно номера Л(st) каждой из строк, можно получить

номер строки s как число, записанной в системе счисления по смешанному основанию.

Номер строки s может быть получен разными способами в зависимости от конкретного дерева разбиения алфавита. Тем не менее все эти способы эквивалентны и дают оптимальный результат, потому что N объектов кодируются номерами 0,1,..., N — 1.

Указанный способ вычисления index (s) работает для любых деревьев разбиения алфавита, но на практике почти не применяется. Это связано с тем, что подсчет мультиномиальных коэффициентов является вычислительно трудоемкой задачей даже при небольших значениях n .

Далее предложен менее трудоемкий вариант получения index (s), но оптимальный (согласно энтропии) результат он будет давать только на специально построенных разбиениях алфавита.

Опять будем строить рекурсивные разбиения алфавита A так, чтобы строке s соответствовал набор строк (st, s2,..., sl). Пусть каждая s{ состоит из элементов 0,1,..., ki — 1. Изменим

способ получения номера Л( si) для строки si. Будем считать символы строки si цифрами

числа Л(si) в системе счисления с фиксированным основанием к . В явном виде вычисление

Л( st) сводится к полиному

ы

Л( si ) = I si [ j к—1,

j=1

для которого выполняется ограничение

0 <Л(si )< ^ = Dt.

Из этого следует, что

0<index(s)< DjD2 ...Dt = к}к2|...кЫ = N'.

В общем случае такое кодирование не является оптимальным, потому что всегда N> N . Оптимальным оно будет лишь в том случае, когда распределение символов 0,1,..., kt — 1 в каждой строке st является равномерным или близко к нему. При равномерном распределении энтропия Шеннона такой строки будет равна log2 к1, а размер по энтропии - |si|log2 ki. В то же время для двоичного представления Л( si) всегда требуется

l0g2 Di = l0g2 KW = |si| l0g2 К

\

(

\

n

бит, что совпадает с размером по энтропии. Тогда для N' получаем оптимальное значение:

^2 N' = |SJlOg2 к1 + |Л2110§2 к2 + . + [10§2 к1 .

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

Кодирование Хаффмана или Шеннона - Фано [8] является частным случаем описанной выше конструкции. В обоих случаях используется разбиение алфавита на две части на каждом шаге так, чтобы распределение было равномерным. Метод Хаффмана отличается от метода Шеннона - Фано только способом построения дерева разбиения. В методе Шеннона -Фано дерево разбиения строится «сверху-вниз»: алфавит делится на две части специальным образом, затем эти части делятся на две части и т. д. В методе Хаффмана дерево строится «снизу-вверх»: находятся два самых редких символа в строке и объединяются в новый символ, а затем процедура повторяется. Вычислять полиномы для нахождения Л( ) не нужно,

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

Неподвижная точка и кодирование Лемпеля - Зива

Опишем второй подход, где кодироваться будет не сама строка л , а отображение, связанное с ней. Рассмотрим некоторые автоморфизмы множества Ап. Любая перестановка п из п элементов 1, 2,..., п задает такой автоморфизм. Действие перестановки на строку ле Ап заключается в переупорядочивании ее символов:

п( л ) = л [п(1)] л [п( 2)]. л [п( п)].

Пусть Р (п) - множество всех перестановок из п элементов. Для любой строки л е Ап найдутся перестановки пе Р(п), для которых л является неподвижной точкой или п( л) = л . Обозначим множество таких перестановок Р5 (п). Оно не пусто, потому что всегда содержит

тождественную перестановку. Разные строки могут быть неподвижными точками у одной и той же перестановки. Разные перестановки могут иметь одну и ту же строку в качестве неподвижной точки.

Любая перестановка п может быть записана как последовательность непересекающихся циклов (в некотором порядке):

П = С1С2 ... ст.

В данном случае используются обозначения, принятые в комбинаторике, поэтому учитываются циклы единичной длины (в отличие от алгебры). Каждый цикл с1 длины ¡1 > 0 можно записать в виде

С =(Р1Р2 ...Рг) ,

тогда полная запись перестановки выглядит как

п = ( Р1 Р12 . р1 )( р2 Р22 . Р22 ) .( р1тР2т ■■■ р1т) .

Число непересекающихся циклов в перестановке п обозначим т(п), при этом, всегда выполняется 1 < т(п) < п . Если п( л) = л , то обязательно л [Р,а ] = л [Рв ] при любых 1 < а,Р < ¡{.

Иначе говоря, каждый цикл перестановки содержит номера позиций одинаковых символов в строке л . В общем случае не все одинаковые символы из строки обязаны попадать в один и тот же цикл.

Из р (п) выберем - перестановку с минимальным числом непересекающихся циклов. Очевидно, что число циклов в будет равно количеству разных символов а{ е А в стро-

ке я , которое не превышает к - размер алфавита. Позиции, на которых находятся одинаковые символы в строке я , попадают в один и тот же цикл перестановки л5.

Если строка я содержит все символы алфавита, то длины циклов в л5 совпадают со статистикой п1, п2,..., пк. Без ограничения общности можно считать, что = п{, и вся перестановка записывается в виде

„ /"12 Щ \( 1 2 п2\ I 1 2 пк\

= ( Р1 Р1 — Рх )( Р2Р2 — Р2 )—( РкРк ■■■ Ркк ) , где Р/ - позиции символа а{ в строке я при 1 < } < щ.

Пусть вектор С длины ) задает соответствие каждого цикла перестановки определенному символу алфавита. Тогда пара , С) однозначно определяет строку я и наоборот. Следовательно, вместо исходной строки я можно попытаться закодировать пару , С). Если на кодирование , С) будет потрачено меньше, чем на кодирование я другим способом, то можно говорить о сжатии. Для кодирования перестановки л5 и вектора С можно воспользоваться энумеративным кодированием, как это было описано ранее.

Любой перестановке пе Р(п) можно сопоставить бинарную квадратную матрицу В(п) размера п х п со следующими элементами:

, , ч |1, если п(г) = 7

ь и=]п .

' [П, иначе

Каждая строка и каждый столбец такой матрицы содержит в точности одну единицу.

Будем считать, что символы алфавита А являются элементами кольца 2(к) - целых чисел по модулю к . Каждому символу а{ сопоставлено число г — 1е 2(к). При такой интерпретации любой строке из Ап очевидным способом сопоставляется вектор из 2 (к). Любая бинарная матрица размера п х п задает отображение 2 (к) в себя.

Пусть строке я е Ап соответствует вектор V е 2 (к), тогда он является неподвижной точкой отображения В (пя) или В (пя) V = V.

Для строки я , которой соответствует вектор V , рассмотрим способы построения матрицы В так, чтобы Bv = V . Для этого построим матрицу В' с элементами:

, = |1, если V [г ] = V [ ] ]. 7 [П, иначе

Матрица В' содержит всю информацию о структуре строки, а именно: на каких позициях в строке я стоят одинаковые символы, при этом размер алфавита А неважен. Из определения следует, что матрица всегда является симметричной с единицами на главной диагонали. Она будет симметрична также относительно побочной диагонали, если строка я является палиндромом. Всего единиц в матрице будет п12 + — + п^.

Двум одинаковым подстрокам строки я будут соответствовать подряд идущие единицы на диагонали параллельной главной. Пусть = я [г] я [г +1]—я [г + А] и

= я [7] я [ ] +1] — я [] + А] - подстроки я , причем = . Тогда в матрице В' выполняется

= Ь'+1,7+1 = — = Са, 7+А =1 и = +1,;+1 = — = Ь+А,;+А =1.

Если строка я соответствует тексту на естественном языке, то, скорее всего, она содержит много одинаковых подстрок. В этом случае в В будут часто встречаться последовательности подряд идущих единиц на диагоналях, параллельных главной. Это можно видеть, если взглянуть на матрицу В' (рис. 1, 2). Матрица представлена как изображение размера п х п пикселей. Единице в матрице соответствует белый пиксель, а нулю - черный.

.1 Ш 1Ш1 .

„■Д .ЙВ ЗЙ^¡¡«¡и-ДэЮОС-:

Рис. 2. Матрица Б' для фрагмента последовательности ДНК

С другой стороны, сама матрица Б' позволяет оценить, насколько много одинаковых подстрок содержится в строке. Если в строке л встречаются несколько одинаковых символов подряд, то им будут соответствовать квадратные блоки из единиц в Б'. Если таких блоков много, то, возможно, для строки л имеет смысл применить кодирование длин серий.

Если в матрице Б' в каждой строке и в каждом столбце оставить по одной единице, то будут получены всевозможные матрицы Б со свойством Бу = V . Каждой из этих матриц будет однозначно соответствовать некоторая перестановка, для которой л будет неподвижной точкой.

Получить матрицу Б из Б' также можно, убрав ограничение на то, что в каждом столбце должна быть только одна единица. Таким образом, для получения матрицы Б достаточно в Б' оставить по одной единице в каждой строке, а количество единиц в столбце может быть произвольным. Такая матрица Б в общем случае уже не будет соответствовать перестановке,

но свойство неподвижной точки Ву = V сохраняется. Построенная таким образом матрица В позволяет выделить группы одинаковых символов (их позиции) в строке ^ . Поэтому матрицу В вместе с информацией о том, какой символ алфавита какой группе соответствует, можно использовать для кодирования строки ^ .

Утверждение. Всегда можно выбрать матрицу В из В' таким способом, чтобы закодировать строку ^ согласно размеру по энтропии.

Доказательство этого утверждения сводится к последовательному запоминанию позиций символов а1, а затем всех остальных а2,..., ак в строке £ с помощью матрицы Б. Это в точности процесс энумеративного кодирования, описанного в первой части данной статьи. Матрицу В начинаем строить с первого столбца матрицы В'. Этот первый столбец однозначно определяет позиции некоторого символа алфавита а^ в строке ^ . После того, как позиции а1, известны, в В добавляем столбец, который определит все позиции элемента а^ и

продолжаем так делать, пока позиции всех символов строки не попадут в матрицу В.

Матрица В' может иметь специфические свойства, которыми можно воспользоваться для получения и кодирования матрицы В. Например, матрица В может иметь различные симметрии в зависимости от природы строки ^ . Однако ее главное достоинство состоит в том, что она содержит большое число подряд идущих единиц на диагоналях, параллельных главной. Именно это свойство используется в алгоритмах кодирования Лемпеля - Зива.

В основе семейства алгоритмов Лемпеля - Зива лежит простая идея: в процессе кодирования строки ее части заменяются ссылками на элементы из некоторого словаря. Различие между алгоритмами заключается в том, что процесс кодирования ссылок и словарь определены по-разному.

Одновременное построение и кодирование матрицы В из В соответствует кодированию Лемпеля - Зива. При таком подходе единица на месте (г, ]) в матрице В' интерпретируется

как ссылка символа ^ [г] на ^ [. Ссылаться друг на друга могут только одинаковые символы строки. Если единица находится ниже главной диагонали, то г > ], что означает ссылку на предшествующий символ. Если единица выше главной диагонали, то г < ], что является ссылкой на последующий символ. На одну и ту же позицию может ссылаться несколько символов, но каждый символ обязан ссылаться только на одну позицию. В матричном виде это выражается тем, что в каждой строке должна быть в точности одна единица. Алгоритмы кодирования Лемпеля - Зива используют ссылки только на предшествующие символы, т. е. только ту часть матрицы В', которая находится ниже главной диагонали.

Рис. 3. Матрица В' во время кодирования Ь777

В качестве примера рассмотрим известный алгоритм LZ77 со скользящим окном [3]. Пусть окно имеет размер N = W + w и состоит из двух частей: словаря длины W и буфера упреждающего просмотра длины w. На рис. 3 схематично представлена матрица B', из которой одновременно строится и запоминается матрица B. Допустим, что в процессе кодирования строки s мы находимся в позиции p . Нужно найти совпадение наибольшей длины (не превосходящей w ) в словаре. Для этого в матрице нужно обследовать область S и выбрать диагональ из единиц наибольшей длины. Затем запоминается позиция диагонали, ее длина и следующий символ из строки.

Можно предложить другие способы кодирования матрицы B из B. Идея также заключается в том, чтобы воспользоваться наличием большого количества подряд идущих единиц на диагоналях матрицы B. Пусть B содержит n диагоналей d0, d2,..., dn-1 . Каждая диагональ d- состоит из элементов b't+1 u+t^modk+,, где t = 0,1,..., n -1.

Суть алгоритма кодирования заключается в последовательном кодировании диагоналей di . На каждом шаге в матрице B выбирается диагональ с максимальным числом единиц и кодируется согласно энтропии. Это можно сделать с помощью арифметического [9] или эну-меративного кодирования. Те единицы, которые оказались на закодированной диагонали, автоматически попадают в матрицу B. Строки и столбцы с единицами на выбранной диагонали больше не учитываются в B . Затем выбирается следующая диагональ с максимальным количеством единиц и кодируется согласно энтропии. Процесс продолжается до тех пор, пока матрица B не будет полностью построена и закодирована.

Заключение

В статье рассмотрено обобщение кодирования Хаффмана для случая произвольного рекурсивного разбиения множества алфавита. Показано, как получить это обобщение исходя из простых идей энумеративного кодирования. Результаты обобщения были использованы на практике для построения алгоритма быстрого сжатия видеоданных [10].

Обобщение кодирования Лемпеля - Зива позволяет единообразно взглянуть на существующие алгоритмы этого класса. Это может вызвать новые исследования в этой области. Все такие алгоритмы кодируют одно и то же отображение (его матрицу), но делают это разными способами. Подробно разобран пример того, как алгоритм LZ77 кодирует матрицу отображения, построенного по строке.

Список литературы

1. Huffman D. A. A Method for the Construction of Minimum-Redundancy Codes // Proceedings of the I.R.E. 1952. P. 1098-1102.

2. Fisher Y. Fractal Image Compression: Theory and Application. Springer Verlag, 1995.

3. Ziv J., Lempel A. A universal algorithm for sequential data compression // IEEE Transactions on Information Theory, IT. 1977.Vol. 23 (3). P. 337-343.

4. Ziv J., Lempel A. Compression of Individual Sequences via Variable-Rate Coding // IEEE Transactions on Information Theory, ГГ. 1978. Vol. 24 (5). P. 530-536.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

5. Cover T. M. Enumerative Source Encoding // IEEE Transactions on Information Theory. 1973. Vol. IT-19. P. 73-77.

6. Hartley R. V. L. Transmission of Information // Bell System Technical Journal. July 1928.

7. Shannon C. E. A Mathematical Theory of Communication // Bell System Technical Journal. 1948. Vol. 27. P. 379-423; 623-656.

8. Fano R. M. The transmission of information // Technical Report. 1949. Ко. 65.

9. Rissanen J. J. Generalized Kraft Inequality and Arithmetic Coding // IBM J. Res. Dev. May 1976. P. 198-203.

10. Ковалев Д. С. Алгоритм быстрого кодирования видеоданных // Материалы XLVI МНСК «Студент и научно-технический прогресс». Новосибирск, 2008. C. 8-9.

Материал поступил в редколлегию 17.05.2010

D. S. Kovalev

GENERALIZATION OF KNOWN METHODS OF STRING CODING

The first part of this paper is about Huffman coding. Its key feature is a binary tree construction. This tree defines recursive partition of alphabet set to construct prefix codes. Generalization of binary tree to q-ary tree is well known. This paper gives Huffman coding generalization for any trees. The second part of this paper defines another approach to understanding Lembel-Ziv family of algorithms. The suggestion is that these algorithms encode a mapping associated with a string, not a string itself. The string is a fixed point of encoded mapping in this case.

Keywords: Huffman coding, Lempel-Ziv algorithms, LZ77, LZ78, enumerative coding.

i Надоели баннеры? Вы всегда можете отключить рекламу.