Задать вопрос
agorkov
@agorkov

Эффективная передача кодов Хаффмана?

Моя научная работа связана с компрессией данных и сейчас я пытаюсь решить одну весьма специфическую задачу.


Есть входной алфавит из N m-битных  чисел (N>=10^6; m=24). Для каждого из N символов известна частота его появления. На основе этой информации для всех символов получены коды Хаффмана.


Задача заключается в том, чтобы создать передачу из которой можно однозначно восстановить как сами m-битные числа, так и их Хаффмановские коды. Разумеется, передача должна иметь минимально возможный объём.


Вариант, до которого я сам додумался требует N*(m+2)-1 бит. Если у кого-то получится улучшить мой результат, поделитесь вашим решением.
  • Вопрос задан
  • 3083 просмотра
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
Mrrl
@Mrrl
Заводчик кардиганов
Что-то не так в условии. 24-битных чисел всего 16*10^6, их никак не наберется 2^9.
И вопрос — нужно получить именно заданные коды Хаффмана, или достаточно, чтобы получились какие-нибудь эквивалентные по длине (а алгоритмы упаковки и распаковки сами договорятся, чтобы распакованные коды были именно теми, которые используются при упаковке основного сообщения)?
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
В случае, если нужно передать действительно произвольный код Хаффмана, то выиграть почти ничего нельзя. Код определяется N-элементным вектором m-битных чисел (с условием, что все элементы различны) — это буквы, отсортированные по кодам, и расстановкой скобок в выражении из N операндов — это двоичное дерево. Число векторов равно (2^m)!/(2^m-N)!, число деревьев — C(N,2*N)/(4*N-2). Если N заметно меньше, чем 2^m, то первое из этих чисел можно оценить как 2^(m*N), а второе — как 2^(2*N)/(4*N-2)/sqrt(pi*N). Общее число бит в их произведении — примерно m*N+2*N.
По мере приближения N к 2^m появляется возможность выиграть до 1.4*N бит (за счет того, что (2^m)!< (2^m)^(2^m).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы