Код Хаффмана с длиной кодового слова не более L бит — различия между версиями
Строка 27: | Строка 27: | ||
== Пример работы алгоритма генерации кода Хоффмана с длиной кодового слова не более L бит == | == Пример работы алгоритма генерации кода Хоффмана с длиной кодового слова не более L бит == | ||
− | Пусть <tex>A=\{a_{1},a_{2},...,a_{n}\}</tex> — алфавит из n различных символов, <tex>P=\{p_{1},p_{2},...,p_{n}\}</tex> — соответствующий ему набор | + | Пусть <tex>A=\{a_{1},a_{2},...,a_{n}\}</tex> — алфавит из n различных символов, <tex>P=\{p_{1},p_{2},...,p_{n}\}</tex> — соответствующий ему набор частот. Пусть <tex>L = 2</tex> - ограничение на длину кодового слова. |
Сначала создадим необходимый набор монет; | Сначала создадим необходимый набор монет; | ||
Строка 65: | Строка 65: | ||
Теперь нам нужно набрать монеты суммарным номиналом <tex> n - 1 = 2 </tex> с минимальным суммарным весом, т.е. просто возьмем первые две монеты из итогового списка. Посчитаем массив <tex> H </tex>. Обратите внимание, что при подсчете количества монет определенного веса мы учитываем монеты, которые были даны изначально, а не те, которые получились путем слияния исходных. | Теперь нам нужно набрать монеты суммарным номиналом <tex> n - 1 = 2 </tex> с минимальным суммарным весом, т.е. просто возьмем первые две монеты из итогового списка. Посчитаем массив <tex> H </tex>. Обратите внимание, что при подсчете количества монет определенного веса мы учитываем монеты, которые были даны изначально, а не те, которые получились путем слияния исходных. | ||
− | <tex>H=\{ | + | <tex>H=\{2,2,1\}</tex> |
Итак, мы получили длины кодовых слов для символов. Осталось восстановить ответ. | Итак, мы получили длины кодовых слов для символов. Осталось восстановить ответ. | ||
== Пример восстановления ответа. == | == Пример восстановления ответа. == | ||
+ | |||
+ | Итак, у нас есть <tex>A=\{a_{1},a_{2},...,a_{n}\}</tex> — алфавит из n различных символов, <tex>P=\{1, 2, 3\}</tex> — соответствующий ему набор частот, а также <tex>H=\{2,2,1\}</tex> - соответсвующие длины кодовых слов |
Версия 19:24, 17 декабря 2014
Код Хаффмана с длиной слова не более L бит - это вариация классического кода Хоффмана с дополнительным ограничением: длина каждого кодового слова не должна превышать заданной константы. Здесь будет приведен алгоритм, решающий эту задачу за время
, где - максимальная длина кодового слова, - размер алфавита, c помощью сведения задачи к одной из вариаций задачи о банкомате.Содержание
Задача о банкомате.
В вариации задаче о банкомате, которую мы рассмотрим, у вас имеется
монет. Каждая монета характеризуется двумя параметрами: номиналом и весом. При этом все номиналы являются степенями двойки и не превышают . Необходимо выбрать из имеющихся монет некоторый набор так, чтобы их суммарный номинал был равен (натуральное число), а суммарный вес минимален.Алгоритм решения задачи о банкомате.
Рассмотрим алгоритм решения приведенной выше вариации задачи о банкомате, считая, что решение существует.
- Разделим имеющиеся у нас монеты на списки по номиналу (свой список для каждого номинала) и упорядочим монеты по возрастанию весов внутри списков, а списки в порядке возрастания номиналов.
- Рассмотрим первый список (с монетами самого низкого номинала). Разобьем в нем все монеты на пары (1 и 2, 3 и 4 и т. д.) Заменим каждую пару монет одной новой монетой, номинал и вес которой равен сумме номиналов и весов старых. Если число монет было нечетно, то последнюю монету, которая не имеет пары, исключим из рассмотрения.
- Объединим первый список со вторым так, чтобы монеты в получившемся списке остались упорядочены по весу.
- Будем повторять шаги 2-3 до тех пор, пока у нас не останется один список, в котором содержатся монеты номинала 1 ( ), упорядоченные по весу. Возьмем первые монет из списка. Это и будет ответ к задаче.
Сведение к генерации кода Хоффмана с длиной кодового слова не более L бит.
Пусть
- ограничение на длину кодового слова, а - частоты символов алфавита.- Отсортируем символы алфавита в порядке возрастания их частот.
- Для каждого символа создадим монет номиналами .
- С помощью описанного выше алгоритма выберем набор монет суммарным номиналом ( - размер алфавита) с минимальным суммарным весом.
- Посчитаем массив , где - количество монет номинала , которые попали в наш набор.
При этом
- это длина кодового слова для -го символа.Зная длины кодовых слов, легко восстановить и сам код.Восстановление ответа.
- Отсортируем все символы по возрастанию длины кодового слова, которое им соответствует, а при равенстве длин - в алфавитном порядке.
- Первому символу сопоставим код, состоящий из нулей, соответствующей длины.
- Каждому следующему символу сопоставим следующее двоичное число. При этом если его длина меньше необходимой, то допишем нули справа.
Пример работы алгоритма генерации кода Хоффмана с длиной кодового слова не более L бит
Пусть
— алфавит из n различных символов, — соответствующий ему набор частот. Пусть - ограничение на длину кодового слова.Сначала создадим необходимый набор монет;
Распределим их по спискам:
Номинал = | |||
Номинал = |
Выполним объединение первого списка по парам и исключим последний элемент, т.к. для него нет пары:
Номинал = | |||
Номинал = |
Объединим первый список со вторым:
Номинал = | ||||
Номинал = |
Выполним объединение второго списка по парам:
Номинал = | ||||
Номинал = |
Теперь нам нужно набрать монеты суммарным номиналом
с минимальным суммарным весом, т.е. просто возьмем первые две монеты из итогового списка. Посчитаем массив . Обратите внимание, что при подсчете количества монет определенного веса мы учитываем монеты, которые были даны изначально, а не те, которые получились путем слияния исходных.
Итак, мы получили длины кодовых слов для символов. Осталось восстановить ответ.
Пример восстановления ответа.
Итак, у нас есть
— алфавит из n различных символов, — соответствующий ему набор частот, а также - соответсвующие длины кодовых слов