Метод кодирования Хаффмана, особенности и суть

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

Тот факт, что данные с равновероятными символами не сжимаются методом Хаффмана может означать, что строки таких символов являются совершенно случайными. Однако, есть примеры строк, в которых все символы равновероятны, но не являются случайными, и их можно сжимать. Хорошим примером является последовательность, в которой каждый символ встречается длинными сериями. Такую строку можно сжать методом RLE, но не методом Хаффмана. (Буквосочетание RLE означает «run-length encoding», т.е. «кодирование длин серий». Этот простой метод сам по себе мало эффективен, но его можно использовать в алгоритмах сжатия со многими этапами.

Заметим, что метод Хаффмана не работает в случае двухсимвольного алфавита. В таком алфавите одному символу придется присвоить код 0, а другому - 1. Метод Хаффмана не может присвоить одному символу код короче одного бита. Если исходные данные (источник) состоят из индивидуальных битов, как в случае двухуровневого (монохромного) изображения, то возможно представление нескольких бит (4 или 8) в виде одного символа нового недвоичного алфавита (из 16 или 256 символов). Проблема при таком подходе заключается в том, что исходные битовые данные могли иметь определенные статистические корреляционные свойства, которые могли быть утеряны при объединении битов в символы.

При сканировании монохромного рисунка или диаграммы по строкам пикселы будут чаще встречаться длинными последовательностями одного цвета, а не быстрым чередованием черных и белых. В итоге получится файл, начинающийся с 1 или 0 (с вероятностью 1/2). За нулем с большой вероятностью следует нуль, а за единицей - единица. Если биты объединять в группы, скажем, по 8 разрядов, то биты внутри группы будут коррелированы, но сами группы не будут иметь корреляцию с исходными пикселами. Если входной файл содержит, например, две соседние группы 00011100 и 00001110, то они будут кодироваться независимо, игнорируя корреляцию последних нулей первой группы и начальных нулей второй.

Выбор длинных групп улучшает положение, но увеличивает число возможных групп, что влечет за собой увеличение памяти для хранения таблицы кодов и удлиняет время создания этой таблицы. (Напомним, что если группа длины s увеличивается до длины 5 + n, то число групп растет экспоненциально.) Более сложный подход к сжатию изображений с помощью кодов Хаффмана основан на создании нескольких полных множеств кодов Хаффмана. Например, если длина группы равна 8 бит, то порождается несколько семейств кодов размера 256. Когда необходимо закодировать символ S, то выбирается одно семейство кодов, и S кодируется из этого семейства. Давид Хаффман (1925-1999) начал свою научную карьеру студентом в Массачусетском технологическом институте (MIT), где построил свои коды в начале пятидесятых годов прошлого века.

Он поступил на факультет MIX в 1953 году. В 1967 году Хаффман перешел в университет Сайта Круз на факультет компьютерных наук. Он играл заметную роль в развитии академической программы факультета и в подборе преподавателей, возглавляя его с 1970 по 1973 года. Выйдя на пенсию в 1994 году, Давид Хаффман продолжил свою научную деятельность в качестве заслуженного профессора в отставке, читая курсы по теории информации и по анализу сигналов. Он умер в 1999 году в возрасте 74 лет. Хаффман сделал важный вклад во многих областях науки, включая теорию информации и теорию кодирования. Он много занимался прикладными задачами, например, проектированием сигналов для радаров, разработкой процедур для асинхронных цепей и другими коммуникационными проблемами. Побочным результатом его работы по математическим свойствам поверхностей «нулевой кривизны» стало развитие им оригинальной техники свертывания из бумаги необычных скульптурных форм.

Пример: Представим себе изображение из 8-ми битовых пикселов, в котором половина пикселов равна 127, а другая половина имеет значение 128. Проанализируем эффективность метода RLE для индивидуальных битовых областей по сравнению с кодированием Хаффмана. Двоичная запись 127 равна 01111111, а 128 - 10000000. Половина пикселов поверхности будет нулем, а вторая половина - единицей. В самом плохом случае область будет походить на шахматную доску, то есть, иметь много серий длины 1. В этом случае каждая серия требует кода в 1 бит, что ведет к одному кодовому биту на пиксел на область, или 8 кодовых битов на пиксел для всего изображения. Это приводит к полному отсутствию сжатия. А коду Хаффмана для такого изображения понадобится всего два кода (поскольку имеется всего два разных пиксела), и они могут быть длины 1. Это приводит к одному кодовому биту на пиксел, то есть к восьмикратному сжатию.

-----------------------------