Кодирование Хаффмана для сжатия без потерь
Мне действительно нужна помощь с кодированием Хаффмана для сжатия без потерь. Я готовлюсь к экзамену, и мне нужно это понять, знает ли кто-нибудь простые уроки, чтобы понять это, или кто-то может объяснить.
Вопросы на экзамене, вероятно, будут:
Предположим, что алфавит [A, B, C], а известное распределение вероятностей P(A)=0,6, P(B)=0,2 и P(C)=0,2. Для простоты давайте также предположим, что и кодер, и декодер знают, что длина сообщений всегда равна 3, поэтому нет необходимости в терминаторе.
Сколько битов необходимо для кодирования сообщения ACB с помощью кодирования Хаффмана? Вам нужно предоставить дерево Хаффмана и код Хаффмана для каждого символа. (3 оценки)
Сколько бит необходимо для кодирования сообщения ACB с помощью арифметического кодирования? Вам необходимо предоставить подробную информацию о процессе кодирования. (3 оценки)
Используя приведенные выше результаты, обсудите преимущество арифметического кодирования над кодированием Хаффмана. (1 оценка)
ответы:
Код Хаффмана: A - 1, B - 01, C - 00. Результат кодирования - 10001, поэтому необходимо 5 бит. (3 оценки)
Процесс кодирования арифметического кодирования: Высокий диапазон символа Низкий 0,0 1,0 1,0 А 0,0 0,6 0,6 С 0,48 0,6 0,12 В 0,552 0,576 0,024 Конечное двоичное кодовое слово равно 0,1001, то есть 0,5625. Поэтому необходимо 4 бита. (3 оценки)
В кодировании Хаффмана длина кодового слова для каждого символа должна быть целым числом. Но это может быть дробным в арифметическом кодировании. Следовательно, арифметическое кодирование часто более эффективно, чем кодирование Хаффмана, как показано выше. (1 оценка)
3 ответа
http://en.wikipedia.org/wiki/Huffman_coding
Если вы посмотрите на дерево (вверху справа), то увидите, что каждый родительский узел представляет собой сумму двух под ним. Значения в узлах являются частотами букв. Каждый бит в двоичной последовательности является правой / левой ветвью в дереве.
Это помогает?
Я не имею ни малейшего понятия об арифметическом кодировании, но это выглядит довольно умно.
Дерево Хаффмана - это двоичное дерево, узлы которого представляют значения с наибольшим распределением в потоке, сжимаемом вблизи корня, и значения с уменьшающимся распределением все дальше и дальше от корня, что позволяет кодировать более общие значения более коротким битом. строки, в то время как менее распространенные значения кодируются в более длинные строки.
Дерево Хаффмана строится следующим образом:
- Построить таблицу сущностей в исходном потоке с их распределением.
- Выберите две записи в таблице, которые имеют наименьшее распределение.
- Сделайте узел дерева из этих двух записей.
- Удалите только что использованные записи из таблицы.
- Добавьте новую запись в таблицу с объединенным распределением только что удаленных узлов, а также узел дерева.
- если в таблице осталось более одной записи, перейдите к шагу 2.
- Запись, оставленная в таблице, является вашим корнем.
Базовая реализация Хаффмана вполне подойдет. Но если вы строите с нуля, вам может понадобиться более 1 другой структуры данных в вашем наборе инструментов, чтобы упростить такие вещи, как minHeap и битовый вектор. Основные алгоритмы кодирования и декодирования довольно просты. Нет информации о сравнении с арифметическим кодированием.