найти среднюю длину кода сообщения

Алгоритм Хаффмана

Алгоритм Хаффмана (англ. Huffman’s algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Содержание

Определение [ править ]

Алгоритм построения бинарного кода Хаффмана [ править ]

Построение кода Хаффмана сводится к построению соответствующего бинарного дерева по следующему алгоритму:

Время работы [ править ]

Пример [ править ]

найти среднюю длину кода сообщения. 400px Huffman abracadabra. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-400px Huffman abracadabra. картинка найти среднюю длину кода сообщения. картинка 400px Huffman abracadabra. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

В дереве Хаффмана будет [math]5[/math] узлов:

Узелabrсd
Вес52211
Узелabrcd
Вес5222

Затем опять объединим в один узел два минимальных по весу узла — [math]r[/math] и [math]cd[/math] :

Узелarcdb
Вес542

Еще раз повторим эту же операцию, но для узлов [math]rcd[/math] и [math]b[/math] :

Узелbrcda
Вес65

На последнем шаге объединим два узла — [math]brcd[/math] и [math]a[/math] :

Узелabrcd
Вес11

Остался один узел, значит, мы пришли к корню дерева Хаффмана (смотри рисунок). Теперь для каждого символа выберем кодовое слово (бинарная последовательность, обозначающая путь по дереву к этому символу от корня):

Символabrсd
Код01110110001001

Корректность алгоритма Хаффмана [ править ]

Чтобы доказать корректность алгоритма Хаффмана, покажем, что в задаче о построении оптимального префиксного кода проявляются свойства жадного выбора и оптимальной подструктуры. В сформулированной ниже лемме показано соблюдение свойства жадного выбора.

[math]f[x]d_T(x) + f[y]d_T(y) = (f[x] + f[y])(d_(z) + 1) = f[z]d_(z) + (f[x] + f[y])[/math]

из чего следует, что

[math] B(T) = B(T’) + f[x] + f[y] [/math]

Источник

Рассчитать среднюю длину кода при методе Хаффмана

Помощь в написании контрольных, курсовых и дипломных работ здесь.

найти среднюю длину кода сообщения. tick. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-tick. картинка найти среднюю длину кода сообщения. картинка tick. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.Двухмерные массивы. Рассчитать среднюю температуру в первом столбце и среднюю во втором столбце
Здравствуйте. Мне нужна программа, в которой используются двухмерные массивы. Массив должен.

Определить среднюю длину слова в введенной текстовой строке, символы пунктуации на длину не влияют
определить среднюю длину слова в введенной текстовой строке, символы пунктуации на длину не влияют.

найти среднюю длину кода сообщения. tick. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-tick. картинка найти среднюю длину кода сообщения. картинка tick. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.Рассчитать среднюю температуру за месяц
Написать функцию, находящую среднее значение в массиве с известным числом элементов. Написать.

Решение

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Рассчитать среднюю наработку на отказ
процессор имеет интенсивность отказа (λ) = 10^(-6) 1/c, интенсивность восстановления (µ) = 10^(-4).

Как рассчитать среднюю цену в 1с
Здравствуйте! Не могли бы подсказать, как сделать чтобы рассчитывало среднюю цену. Например если в.

StringGrid: Рассчитать среднюю температуру за месяц
как будет выглядеть код к этой задаче? Рассчитать среднюю температуру за месяц. Написать функцию.

Рассчитать среднюю ёмкость для трёх конденсаторов
Написать программу решения следующей задачи, используя модуль: Ёмкость плоского конденсатора.

Источник

Код Хаффмана

Построение кода Хаффмана для таблицы вероятностей.

Вот калькулятор, который рассчитывает коды Хаффмана для заданной вероятности символов.
Немного теории под калькулятором.

найти среднюю длину кода сообщения. . найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-. картинка найти среднюю длину кода сообщения. картинка . Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Код Хаффмана

Таблица вероятности символов

Таблица вероятности символов

Импортировать данные Ошибка импорта

Небольшой отрывок из Википедии.

Алгоритм Хаффмана — адаптивный жадный алгоритм оптимального префиксного кодирования алфавита с минимальной избыточностью. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. В настоящее время используется во многих программах сжатия данных.

Этот метод кодирования состоит из двух основных этапов:
Построение оптимального кодового дерева.
Построение отображения код-символ на основе построенного дерева.

Идея алгоритма состоит в следующем: зная вероятности символов в сообщении, можно описать процедуру построения кодов переменной длины, состоящих из целого количества битов. Символам с большей вероятностью ставятся в соответствие более короткие коды. Коды Хаффмана обладают свойством префиксности (т. е. ни одно кодовое слово не является префиксом другого), что позволяет однозначно их декодировать.
Классический алгоритм Хаффмана на входе получает таблицу частот встречаемости символов в сообщении. Далее на основании этой таблицы строится дерево кодирования Хаффмана (Н-дерево).

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

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

Источник

Информационные технологии

Неравномерное кодирование. Средняя длина кодирования

В приведенных выше примерах кодирования все кодовые слова имели одинаковую длину. Однако это не является обязательным требованием. Более того, если вероятности появления сообщений заметно отличаются друг от друга, то сообщения с большой вероятностью появления лучше кодировать короткими словами, а более длинными словами кодировать редкие сообщений. В результате кодовый текст при определенных условиях станет в среднем короче.

найти среднюю длину кода сообщения. 6f2f9ee7fe04a2f7a20e813f58c54063. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-6f2f9ee7fe04a2f7a20e813f58c54063. картинка найти среднюю длину кода сообщения. картинка 6f2f9ee7fe04a2f7a20e813f58c54063. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Наиболее экономным является код с наименьшей средней длиной найти среднюю длину кода сообщения. c5dfa89fc662b5b8505255aa630ab0fd. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-c5dfa89fc662b5b8505255aa630ab0fd. картинка найти среднюю длину кода сообщения. картинка c5dfa89fc662b5b8505255aa630ab0fd. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.. Сравним на примерах экономичность различных способов кодирования одного и того же источника.

Пусть источник содержит 4 сообщения найти среднюю длину кода сообщения. 0f57fb2238ffc53074a4d2aea9f680f7. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-0f57fb2238ffc53074a4d2aea9f680f7. картинка найти среднюю длину кода сообщения. картинка 0f57fb2238ffc53074a4d2aea9f680f7. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.с вероятностями найти среднюю длину кода сообщения. cc9466b40fc15d9fb2c3b2b493828534. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-cc9466b40fc15d9fb2c3b2b493828534. картинка найти среднюю длину кода сообщения. картинка cc9466b40fc15d9fb2c3b2b493828534. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.. Эти сообщения можно закодировать кодовыми словами постоянной длины, состоящими из двух знаков, в алфавите найти среднюю длину кода сообщения. de5f73e743e5f32a80c9397573599027. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-de5f73e743e5f32a80c9397573599027. картинка найти среднюю длину кода сообщения. картинка de5f73e743e5f32a80c9397573599027. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.в соответствии с кодовой таблицей.

найти среднюю длину кода сообщения. 4be60c01260fad068dd84cb934d15c36. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-4be60c01260fad068dd84cb934d15c36. картинка найти среднюю длину кода сообщения. картинка 4be60c01260fad068dd84cb934d15c36. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.00
найти среднюю длину кода сообщения. e7fb081e7d6a49314607f263a85eef3c. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-e7fb081e7d6a49314607f263a85eef3c. картинка найти среднюю длину кода сообщения. картинка e7fb081e7d6a49314607f263a85eef3c. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.01
A_310
A_411

Очевидно, что для представления (передачи) любой последовательности в среднем потребуется 2 знака на одно сообщение. Сравним эффективность такого кодирования с описанным выше кодированием словами переменной длины. Кодовая таблица для данного случая может иметь следующий вид.

найти среднюю длину кода сообщения. 4be60c01260fad068dd84cb934d15c36. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-4be60c01260fad068dd84cb934d15c36. картинка найти среднюю длину кода сообщения. картинка 4be60c01260fad068dd84cb934d15c36. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.0
найти среднюю длину кода сообщения. e7fb081e7d6a49314607f263a85eef3c. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-e7fb081e7d6a49314607f263a85eef3c. картинка найти среднюю длину кода сообщения. картинка e7fb081e7d6a49314607f263a85eef3c. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.1
найти среднюю длину кода сообщения. 868836207ac7794c25b3273d89cfe61e. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-868836207ac7794c25b3273d89cfe61e. картинка найти среднюю длину кода сообщения. картинка 868836207ac7794c25b3273d89cfe61e. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.10
найти среднюю длину кода сообщения. ecc01e8b4a907d65d985a4fb0eee583a. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-ecc01e8b4a907d65d985a4fb0eee583a. картинка найти среднюю длину кода сообщения. картинка ecc01e8b4a907d65d985a4fb0eee583a. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.11

В этой таблице, в отличие от предыдущей, наиболее частые сообщения найти среднюю длину кода сообщения. 4be60c01260fad068dd84cb934d15c36. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-4be60c01260fad068dd84cb934d15c36. картинка найти среднюю длину кода сообщения. картинка 4be60c01260fad068dd84cb934d15c36. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.и найти среднюю длину кода сообщения. e7fb081e7d6a49314607f263a85eef3c. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-e7fb081e7d6a49314607f263a85eef3c. картинка найти среднюю длину кода сообщения. картинка e7fb081e7d6a49314607f263a85eef3c. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.кодируются одним двоичным знаком. Для последнего варианта кодирования имеем

найти среднюю длину кода сообщения. f8f9047ba98de513cd4dfc6065b94158. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-f8f9047ba98de513cd4dfc6065b94158. картинка найти среднюю длину кода сообщения. картинка f8f9047ba98de513cd4dfc6065b94158. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

в то время как для равномерного кода средняя длина найти среднюю длину кода сообщения. 72045f702dd18c34821e145713a7d5e1. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-72045f702dd18c34821e145713a7d5e1. картинка найти среднюю длину кода сообщения. картинка 72045f702dd18c34821e145713a7d5e1. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.(она совпадает с общей длиной кодовых слов). Из рассмотренного примера видно, что кодирование сообщений словами различной длины может дать суще-ственное (почти в два раза) увеличение экономичности кодирования.

Необходимо отметить, что неоднозначность декодирования слова появилась несмотря на то, что условие однозначности декодирования знаков (инъективность кодового отображения) выполняется.

Решение данной проблемы заключается в том, чтобы иметь возможность в любом кодовом тексте выделять отдельные кодовые слова без использования специальных разделительных знаков. Иначе говоря, необходимо, чтобы код удовлетворял следующему требованию: всякая последовательность кодовых знаков может быть единственным образом разбита на кодовые слова. Коды, для которых последнее требование выполнено, называются однозначно декодируемыми (иногда их называют кодами без запятой).

Рассмотрим код (схему алфавитного кодирования) найти среднюю длину кода сообщения. 363ff641b10347ffab298248918dc22b. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-363ff641b10347ffab298248918dc22b. картинка найти среднюю длину кода сообщения. картинка 363ff641b10347ffab298248918dc22b. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др., заданный кодовой таблицей

найти среднюю длину кода сообщения. b2dd38cfbb8b2092f1c2666e1651de50. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-b2dd38cfbb8b2092f1c2666e1651de50. картинка найти среднюю длину кода сообщения. картинка b2dd38cfbb8b2092f1c2666e1651de50. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

и различные слова, составленные из элементарных кодов.

Определение. Код найти среднюю длину кода сообщения. 91b2417d13d076fabf08a2684f817476. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-91b2417d13d076fabf08a2684f817476. картинка найти среднюю длину кода сообщения. картинка 91b2417d13d076fabf08a2684f817476. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.называется однозначно декодируемым, если

найти среднюю длину кода сообщения. 2405bccad8ca1d9a6dc638a5b0056617. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-2405bccad8ca1d9a6dc638a5b0056617. картинка найти среднюю длину кода сообщения. картинка 2405bccad8ca1d9a6dc638a5b0056617. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

найти среднюю длину кода сообщения. cc5932dbf1d06b509f1929053d3c3c15. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-cc5932dbf1d06b509f1929053d3c3c15. картинка найти среднюю длину кода сообщения. картинка cc5932dbf1d06b509f1929053d3c3c15. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Если таблица кодов содержит одинаковые кодовые слова, то есть если

найти среднюю длину кода сообщения. fd8f351d3ead59cab293dba21ff9a6e8. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-fd8f351d3ead59cab293dba21ff9a6e8. картинка найти среднюю длину кода сообщения. картинка fd8f351d3ead59cab293dba21ff9a6e8. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

то код заведомо не является однозначно декодируемым (схема не является разделимой). Такие коды далее не рассматриваются.

Префиксные коды

Наиболее простыми и часто используемыми кодами без специального разделителя кодовых слов являются так называемые префиксные коды [29].

Теорема 1. Префиксный код является однозначно декодируемым.

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

найти среднюю длину кода сообщения. 06 05. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-06 05. картинка найти среднюю длину кода сообщения. картинка 06 05. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

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

Если код префиксный, то, читая кодовую запись подряд от начала, мы всегда сможем разобраться, где кончается одно кодовое слово и начинается следующее. Если, например, в кодовой записи встретилось кодовое обозначение 110, то разночтений быть не может, так как в силу префиксности наш код не содержит кодовых обозначений 1, 11 или, скажем, 1101. Именно так обстояло дело для рассмотренного выше кода, который очевидно является префиксным.

Источник

Алгоритм Хаффмана на пальцах

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

Примечание переводчика: под символом автор подразумевает некий повторяющийся элемент исходной строки — это может быть как печатный знак (character), так и любая битовая последовательность. Под кодом подразумевается не ASCII или UTF-8 код символа, а кодирующая последовательность битов.

К статье прикреплён исходный код, который наглядно демонстрирует, как работает алгоритм Хаффмана — он предназначен для людей, которые плохо понимают математику процесса. В будущем (я надеюсь) я напишу статью, в которой мы поговорим о применении алгоритма к любым файлам для их сжатия (то есть, сделаем простой архиватор типа WinRAR или WinZIP).

Идея, положенная в основу кодировании Хаффмана, основана на частоте появления символа в последовательности. Символ, который встречается в последовательности чаще всего, получает новый очень маленький код, а символ, который встречается реже всего, получает, наоборот, очень длинный код. Это нужно, так как мы хотим, чтобы, когда мы обработали весь ввод, самые частотные символы заняли меньше всего места (и меньше, чем они занимали в оригинале), а самые редкие — побольше (но так как они редкие, это не имеет значения). Для нашей программы я решил, что символ будет иметь длину 8 бит, то есть, будет соответствовать печатному знаку.

Мы могли бы с той же простотой взять символ длиной в 16 бит (то есть, состоящий из двух печатных знаков), равно как и 10 бит, 20 и так далее. Размер символа выбирается, исходя из строки ввода, которую мы ожидаем встретить. Например, если бы я собрался кодировать сырые видеофайлы, я бы приравнял размер символа к размеру пикселя. Помните, что при уменьшении или увеличении размера символа меняется и размер кода для каждого символа, потому что чем больше размер, тем больше символов можно закодировать этим размером кода. Комбинаций нулей и единичек, подходящих для восьми бит, меньше, чем для шестнадцати. Поэтому вы должны подобрать размер символа, исходя из того по какому принципу данные повторяются в вашей последовательности.

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

Предположим, у нас есть строка «beep boop beer!», для которой, в её текущем виде, на каждый знак тратится по одному байту. Это означает, что вся строка целиком занимает 15*8 = 120 бит памяти. После кодирования строка займёт 40 бит (на практике, в нашей программе мы выведем на консоль последовательность из 40 нулей и единиц, представляющих собой биты кодированного текста. Чтобы получить из них настоящую строку размером 40 бит, нужно применять битовую арифметику, поэтому мы сегодня не будем этого делать).

Чтобы лучше понять пример, мы для начала сделаем всё вручную. Строка «beep boop beer!» для этого очень хорошо подойдёт. Чтобы получить код для каждого символа на основе его частотности, нам надо построить бинарное дерево, такое, что каждый лист этого дерева будет содержать символ (печатный знак из строки). Дерево будет строиться от листьев к корню, в том смысле, что символы с меньшей частотой будут дальше от корня, чем символы с большей. Скоро вы увидите, для чего это нужно.

Чтобы построить дерево, мы воспользуемся слегка модифицированной очередью с приоритетами — первыми из неё будут извлекаться элементы с наименьшим приоритетом, а не наибольшим. Это нужно, чтобы строить дерево от листьев к корню.

Для начала посчитаем частоты всех символов:

СимволЧастота
‘b’3
‘e’4
‘p’2
‘ ‘2
‘o’2
‘r’1
‘!’1

После вычисления частот мы создадим узлы бинарного дерева для каждого знака и добавим их в очередь, используя частоту в качестве приоритета:
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Теперь мы достаём два первых элемента из очереди и связываем их, создавая новый узел дерева, в котором они оба будут потомками, а приоритет нового узла будет равен сумме их приоритетов. После этого мы добавим получившийся новый узел обратно в очередь.
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.
Повторим те же шаги и получим последовательно:
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Ну и после того, как мы свяжем два последних элемента, получится итоговое дерево:
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Теперь, чтобы получить код для каждого символа, надо просто пройтись по дереву, и для каждого перехода добавлять 0, если мы идём влево, и 1 — если направо:
найти среднюю длину кода сообщения. image loader. найти среднюю длину кода сообщения фото. найти среднюю длину кода сообщения-image loader. картинка найти среднюю длину кода сообщения. картинка image loader. Алгоритм Хаффмана (англ. Huffman's algorithm) — алгоритм оптимального префиксного кодирования алфавита. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. Используется во многих программах сжатия данных, например, PKZIP 2, LZH и др.

Если мы так сделаем, то получим следующие коды для символов:

СимволКод
‘b’00
‘e’11
‘p’101
‘ ‘011
‘o’010
‘r’1000
‘!’1001

Чтобы расшифровать закодированную строку, нам надо, соответственно, просто идти по дереву, сворачивая в соответствующую каждому биту сторону до тех пор, пока мы не достигнем листа. Например, если есть строка «101 11 101 11» и наше дерево, то мы получим строку «pepe».

Важно иметь в виду, что каждый код не является префиксом для кода другого символа. В нашем примере, если 00 — это код для ‘b’, то 000 не может оказаться чьим-либо кодом, потому что иначе мы получим конфликт. Мы никогда не достигли бы этого символа в дереве, так как останавливались бы ещё на ‘b’.

На практике, при реализации данного алгоритма сразу после построения дерева строится таблица Хаффмана. Данная таблица — это по сути связный список или массив, который содержит каждый символ и его код, потому что это делает кодирование более эффективным. Довольно затратно каждый раз искать символ и одновременно вычислять его код, так как мы не знаем, где он находится, и придётся обходить всё дерево целиком. Как правило, для кодирования используется таблица Хаффмана, а для декодирования — дерево Хаффмана.

Входная строка: «beep boop beer!»
Входная строка в бинарном виде: «0110 0010 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110 0101 0111 0010 0010 000»
Закодированная строка: «0011 1110 1011 0001 0010 1010 1100 1111 1000 1001»
Как вы можете заметить, между ASCII-версией строки и закодированной версией существует большая разница.

Приложенный исходный код работает по тому же принципу, что и описан выше. В коде можно найти больше деталей и комментариев.

Все исходники были откомпилированы и проверены с использованием стандарта C99. Удачного программирования!

Чтобы прояснить ситуацию: данная статья только иллюстрирует работу алгоритма. Чтобы использовать это в реальной жизни, вам надо будет поместить созданное вами дерево Хаффмана в закодированную строку, а получатель должен будет знать, как его интерпретировать, чтобы раскодировать сообщение. Хорошим способом сделать это, является проход по дереву в любом порядке, который вам нравится (я предпочитаю обход в глубину) и конкатенировать 0 для каждого узла и 1 для листа с битами, представляющими оригинальный символ (в нашем случае, 8 бит, представляющие ASCII-код знака). Идеальным было бы добавить это представление в самое начало закодированной строки. Как только получатель построит дерево, он будет знать, как декодировать сообщение, чтобы прочесть оригинал.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *