Эффективная реализация алгоритма Хаффмана?

По ходу моей научной работы возникла необходимость подсчитать эффективность кода Хаффмана для алфавита из 300 млн. элементов.


Сам алгоритм тривиален, и его реализация не представляет труда. Но на реальной задаче алгоритм работает непозволительно долго. В связи с этим у меня два вопроса:

1. Существуют ли какие-нибудь оптимизации алгоритма по скорости?

2. Насколько адекватной оценкой сверху будет использование кодов Шеннона-Фано?
  • Вопрос задан
  • 9000 просмотров
Пригласить эксперта
Ответы на вопрос 2
Weageoo
@Weageoo
1) Арифметическое кодирование эффективнее.
2) Алгоритма Хаффмана (или другой алгоритм энтропийного кодирования) используется на шаге фактического сжатия в статистическом алгоритме сжатия данных без потерь PPM (вот для этого алгоритма уже существует множество модификаций; напр. PPMd используется в Rar, 7zip, WinZip).
3) Существует адаптивный алгоритм Хаффмана. Есть и его имплементация на C. Если будете тестировать (сравнивать с обычным хаффманом), то напишите пару слов о результатах.
Ответ написан
@mayorovp
Классическим способом ускорения алгоритма Хаффмана является слияние с виртуальным списком.

А именно, заводятся два списка — исходный и очередь.
В начала алгоритма исходный список сортируется по возрастанию частот, очередь пуста.

В процессе работы поддерживается следующий инвариант — элемент с минимальной частотой лежит либо в начале очереди, либо в начале исходного списка.
Шаг алгоритма следующий: извлекаются два минимальных элемента (оба из исходного списка, оба из очереди лили один из исходного, а второй из очереди) и «склеиваются», результат помещается в конец очереди.
Когда в обоих списках остался последний элемент — требуемое дерево построено.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы