1. Коды ХаффманаРабота алгоритма начинается с составления списка символов (чисел) алфавита в порядке убывания их частоты (вероятности). Лучше всего продемонстрировать этот алгоритм на простом примере. Пусть имеется пять символов: с известными вероятностями: , , , и . Для построения кодов, выбираем сначала пару символов с наименьшими вероятностями – это символы и . Наименее вероятному символу ставим в соответствие битовый ноль, а более вероятному – битовую единицу: Символы и условно объединяются в единый символ с вероятностью появления 0,2. Затем берется третий символ из упорядоченного списка – это символ с вероятностью 0,2. Поэтому код символа будет начинаться с битовой 1, а к кодам символов и дописывается битовый ноль: Далее, условно объединяем все три символа, в символ с вероятностью появления 0,4 и рассматриваем его со следующим символом списка - , вероятность которого 0,2. Так как вероятность появления символа меньше вероятности появления условного символа , то код символа будет начинаться с нуля, а кодам символов , и приписывается битовая единица: Аналогично, получаем для последнего символа : В итоге получаем коды Хаффмана, но записанные в обратном порядке, т.е. для кодирования символа имеем код 0, для - код 10, для - 111, - 1101 и - 1100. Заметим, что данные коды могут быть корректно декодированы, например, последовательность символов будет представлена последовательностью бит 01011111011100 В этой последовательности первым встречается битовый ноль, но с нуля начинается только один код – код символа , поэтому он так и декодируется. Затем видим код, начинающийся с битовой единицы. Таких кодов несколько, поэтому необходимо прочитать следующий бит, который равен 0. Код 10 – единственный, соответствующий символу . После этого видим код с тремя единицами подряд (111). Это говорит о том, что это символ . Наконец последние два кода точно декодируют символы и . Построенные таким образом однозначные коды будут в среднем тратить 2,2 бита на символ: бит/символ Для сравнения, обычный двоичный код потребовал бы 3 бита для представления одного символа, т.е. в этом случае последовательность можно было бы сжать в 3/2,2=1,36 раза. Однако чтобы произвести декодирование данных необходимо знать построенные коды. Самый лучший способ передать декодеру частоты появления символов в потоке, т.е. в данном случае дополнительно пять чисел. На основе этих частот декодер строит коды, а затем применяет их для декодирования последовательности. Поэтому, чем длиннее кодированная последовательность, тем меньше удельный вес служебной информации переданной декодеру. И здесь возникает вопрос: а как можно численно определить степень статистической избыточности в заданной цифровой последовательности? Ведь тогда, зная эту характеристику мы могли бы определять максимально возможную степень сжатия этой последовательности и сравнивать конкретный алгоритм с этой нижней границей, т.е. мы могли бы объективно оценивать качество работы алгоритма сжатия. Оказывается, что такой величиной является энтропия, которая определяет минимальное число бит, необходимое для представления заданной последовательности чисел с последующей возможностью полного восстановления информации. В 1948 г. сотрудник лаборатории Bell Labs Клод Шеннон показал, что минимальное число бит, которое необходимо затратить для представления одного символа той или иной информации можно найти с помощью формулы , где - частота (вероятность) появления -го числа в последовательности; - число уникальных чисел в последовательности. Например, применяя данную формулу к нашей последовательности чисел, определяем, что число уникальных символов равно 5 – это и . Частота появления цифр равна , , , и . В результате, минимальное число бит для представления одного символа в такой последовательности равно бит/символ. Сравнивая полученный результат с ранее полученным для кодов Хаффмана (2,2 бит/символ), видим, что коды Хаффмана оказываются более близкими к нижней границе, чем равномерный код, которому необходимо 3 бита/символ. Также можно посчитать и степень сжатия последовательности. Если равномерный код будет расходовать 3 бита на символ, то потенциальное сжатие будет равно раз, а с помощью неравномерных кодов Хаффмана получим раз. Следовательно, представленный алгоритм сжатия не является лучшим. Кроме того, с помощью энтропии можно показать, что если последовательность содержит случайный набор чисел (не имеет закономерностей), то вероятности , а возможность сжатия , т.е. случайный набор данных сжать невозможно. Это положение в частности говорит о том, что если один раз к данным был применен хороший алгоритм сжатия, например, zip, то повторное сжатие этим или другим алгоритмом не приведет к лучшим результатам, скорее наоборот. Таким образом, на выходе любого хорошего алгоритма сжатия будет получаться почти случайный набор данных.
|