Хорошо известно, что в худшем случае существует оптимальный алгоритм для вычисления кода Хаффмана за время . Это улучшается двумя ортогональными способами:
Оптимальные коды без префиксов могут быть вычислены быстрее, если набор различных частот мал (например, имеет размер ): отсортируйте частоты, используя [Munro and Spira, 1976], чтобы воспользоваться небольшим значением , и вычислите Хаффмана дерево за линейное время от отсортированных частот. Это дает решение в
Существует алгоритм для вычисления эквивалентных кодов, где - это количество различных длин кодовых слов [Belal and Elmasry].
РЕЗУЛЬТАТ ОТ STACS 2006 SEEM быть неправым , Elmasry опубликовано Arxiv в 2010 году (http://arxiv.org/abs/cs/0509015) версия объявляя - операции на несортированном входе и - операций с отсортированным вводомO ( 9 k log 2 k - 1 n )
Я вижу аналогию со сложностью вычисления плоской выпуклой оболочки, где алгоритмы в (на основе сортировки, как алгоритм для кода Хаффмана) и в (подарок обертывание) были заменены алгоритмом Киркпатрика и Зейделя в (позже оказалось, что он является оптимальным для экземпляра со сложностью формы ). В случае свободных кодов префиксов: и предполагают возможность алгоритма со сложностью или даже где - количество кодовых слов длиныO ( n lg n ) O ( n h ) O ( n lg h ) O ( n H ( n 1 , … , n k ) O ( n lg n ) O ( n k ) O ( n lg k ) O ( n H ( n 1 ,использование аналогии ребра выпуклой оболочки, покрывающей указывает на длину кода, охватывающую символы .
Простой пример показывает, что сортировка (округленных) логарифмических значений частот (по линейному времени в модели оперативной памяти word) не дает оптимального кода без префикса в линейном времени:
- Для , и
- поэтому сортировка журналов не меняет порядок
- все же два кода из трех стоят бита больше, чем оптимальные.
Другим интересным вопросом было бы уменьшить сложность, когда велико, то есть все коды имеют различную длину:
- например, когда все частоты имеют различное логарифмическое значение. В этом случае можно отсортировать частоты по линейному времени в оперативной памяти и вычислить код Хаффмана за линейное время (поскольку для сортировки значений достаточно отсортировать их лог-значения), что приведет к общему линейному времени , намного лучше, чем из алгоритма Белала и Элмасри.
источник