Изменения

Перейти к: навигация, поиск

Код Хаффмана с длиной кодового слова не более L бит

553 байта добавлено, 18:27, 23 октября 2019
м
Было: пусть дан алфавит из 5 символов <tex>A=\{A,B,C,C,D\}</tex> ; Стало: пусть дан алфавит из 5 символов <tex>A=\{A,B,C,D,E\}</tex>,
'''Код Хаффмана Оптимальный префиксный код с длиной кодового слова не более L бит''' — это вариация классического кода Хоффмана с дополнительным ограничением: код, в котором длина каждого кодового слова не должна превышать заданной константы. Здесь будет приведен алгоритм, решающий эту задачу за время <tex> O(nL) </tex>, где <tex>L</tex> — максимальная длина кодового слова, <tex>n</tex> — размер алфавита, c помощью сведения задачи к [[Задача_о_рюкзаке | задаче о рюкзаке]].
Данный алгоритм бывает полезен, когда нам нужно ограничить максимальную длину кодового слова, а при использовании алгоритма Хаффмана самому редко встречающемуся символу соответствует слишком длинное кодовое слово. Например, пусть дан алфавит из 5 символов <tex>A=\{A,B,C, CD, DE\}</tex>, а частоты символов являются степенями двойки: <tex>P=\{1,2,4, 8, 16\}</tex>. Тогда классический код Хоффмана будет выглядеть следующим образом:
<tex> A = 1111 </tex>
Важно заметить следующий факт. В худшем случае все кодовые слова будут иметь длину L бит. Тогда мы можем закодировать <tex> 2^L </tex> символов. Таким образом, нельзя получить описанный выше код, если <tex> n > 2^L </tex>.
== Сведение задачи о рюкзаке к генерации оптимального префиксного кода Хоффмана с длиной кодового слова не более L бит. ==
Пусть <tex>L</tex> — ограничение на длину кодового слова, а <tex>P=\{p_{1},p_{2},...,p_{n}\}</tex> — частоты символов алфавита. Алгоритм генерации кода будет следующим:
# Отсортируем символы алфавита в порядке возрастания их частот.
# Для каждого символа создадим <tex>L</tex> предметов ценностью <tex>2^{-1}..2^{-L}</tex>, каждый из которых имеет вес <tex>p_{i}</tex>.
# С помощью задачи о рюкзаке выберем набор предметов суммарной ценностью <extex>n - 1</tex> (<tex>n</tex> — размер алфавита) с минимальным суммарным весом.
# Посчитаем массив <tex>H=\{h_{1},h_{2},...,h_{n}\}</tex>, где <tex>h_{i}</tex> — количество предметов ценностью <tex>p_{i}</tex>, которые попали в наш набор.
Заметим, что при генерации каждого следующего кодового слова, в качестве его префикса выступает последовательность, лексикографически большая, чем предыдущее кодовое слово (т.к. мы берем следующее двоичное число), а значит ни для каких двух кодовых слов одно не может быть префиксом другого. Т.е. код, сгенерированный таким образом является префиксным.
== Пример работы алгоритма генерации оптимального префиксного кода Хоффмана с длиной кодового слова не более L бит ==Пусть <tex>A=\{a_{1}A,a_{2},...B,a_{n}C\}</tex> — алфавит из n трех различных символов, <tex>P=\{p_{1},p_{2},...,p_{n}3\}</tex> — соответствующий ему набор частот. Пусть <tex>L = 2</tex> — ограничение на длину кодового слова.
Сначала создадим необходимый набор предметов;
{| class="wikitable"! Символ || Частота || Предметы|- align = "center"| A || 1 || <tex>(2^{-1}; 1), (2^{-2}; 1), </tex>|- align = "center"| B || 2 || <tex>(2^{-1}; 2), (2^{-2}; 2), </tex>|- align = "center"| C || 3 || <tex> (2^{-1}; 3), (2^{-2}; 3) </tex>|}
Решим задачу о рюкзаке для заданного набора и выберем предметы суммарной ценностью <tex> n - 1 = 2 </tex> с минимальным суммарным весом. В нашем случае в оптимальный набор попадут следующие предметы:
<tex> A = 11 </tex>
 
==См. также==
*[[Алгоритм_Хаффмана | Алгоритм Хаффмана]]
*[[Задача_о_рюкзаке | Задача о рюкзаке]]
==Источники информации==
*[http://en.wikipedia.org/wiki/Package-merge_algorithm Package-merge algorithm]
*[http://en.wikipedia.org/wiki/Canonical_Huffman_code Canonical Huffman code]
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Алгоритмы сжатия ]]
1
правка

Навигация