Границы энтропии для кода Хаффмена

Напомним, что сформулированная ранее теорема Шеннона для канала без помех определяет верхнюю границу степени сжатия для любых кодов через энтропию вектора X . Найдем верхнюю и нижнюю границы степени сжатия для кода Хаффмена.

Пусть R(X) - скорость сжатия, определяемая как отношение

R = k/n , (2.7)

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

Пусть X - вектор данных длиной n и ( F1, F2, ... , Fk ) - вектор частот символов в X. Энтропия H(X) определяется как

. (2.8)

Попытаемся связать энтропию H(X) со степенью (скоростью) сжатия R(X) следующим образом:

, (2.9)

где ( L1, L2, ... , Lk ) - точный вектор Крафта кода Хаффмена для X.

Кривая - выпуклая, то есть она всегда располагается ниже любой собственной касательной линии, исключая точку касания. В частности, она находится ниже прямой линии y = x - 1, за исключением x = 1, так как эта прямая линия - касательная к кривой в точке x = 1. Таким образом, можно записать неравенство

, x > 0, x 1. (2.10)

Подставим в (2.10) и, умножая обе стороны на Fi/n, получим

. (2.11)

Просуммируем обе части неравенства по i. Сумма в правой части будет равна нулю, поскольку и сумма и сумма Fi/n дают единицу.

Следовательно,

. (2.12)

Наконец, приведя логарифм по основанию e к основанию 2, получим

H(X) ≤ R(X). (2.13)

Рассмотрим вектор Крафта ( L1* , L2* , ... , Lk* ), в котором длины кодовых слов Li* связаны с частотами символов следующим образом:

Li* [ - log2 ( Fi / n ) ] . (2.14)

Тогда

, (2.15)

где учтено, что [ u ] u + 1. Правая часть неравенства - это H(X) + 1.

И окончательно, объединяя все вышеполученное вместе,

H(X) R(X) H(X) + 1. (2.16)

Недостатки метода Хаффмена

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

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

Существует, правда, динамическая версия сжатия Хаффмена, которая может строить дерево Хаффмена "на лету" во время чтения и активного сжатия. Дерево постоянно обновляется, чтобы отражать изменения вероятностей входных данных. Однако и она на практике обладает серьезными ограничениями и недостатками и, кроме того, обеспечивает меньшую эффективность сжатия.

Еще один недостаток кодов Хаффмена - это то, что минимальная длина кодового слова для них не может быть меньше единицы, тогда как энтропия сообщения вполне может составлять и 0,1, и 0,01 бит/букву. В этом случае код Хаффмена становится существенно избыточным. Проблема решается применением алгоритма к блокам символов, но тогда усложняется процедура кодирования/декодирования и значительно расширяется кодовое дерево, которое нужно в конечном итоге сохранять вместе с кодом.

Наконец, код Хаффмена обеспечивает среднюю длину кода, совпадающую с энтропией, только в том случае, когда вероятности символов источника являются целыми отрицательными степенями двойки: 1/2 = 0,5; 1/4 = 0,25; 1/8 = 0,125; 1/16 = 0,0625 и т.д. На практике же такая ситуация встречается очень редко или может быть создана блокированием символов со всеми вытекающими отсюда последствиями.