Dobrze wiadomo, że istnieje najgorszy przypadek optymalnego algorytmu do obliczania kodu Huffmana w czasie . Poprawiono to na dwa ortogonalne sposoby:
Optymalne kody wolne od prefiksów można obliczyć szybciej, jeśli zestaw różnych częstotliwości jest mały (np. Rozmiar ): posortuj częstotliwości za pomocą [Munro i Spira, 1976], aby skorzystać z małej wartości i obliczyć drzewo Huffmana w czasie liniowym z posortowanych częstotliwości. To daje rozwiązanie wσ O ( n lg σ )
Istnieje algorytm do obliczania równoważnych kodów, gdzie jest liczbą różnych długości słów kodowych [Belal i Elmasry].k
Czy istnieje sposób na połączenie tych technik, aby poprawić obecną najlepszą złożoność ?
wynikają z STACS 2006 wydają się być błędne , Elmasry opublikowany na arXiv w 2010 roku (http://arxiv.org/abs/cs/0509015) wersja ogłaszając - operacje na wejściu i niesegregowanych - operacji na posortowanym wejściu
Widzę analogię ze złożonością obliczania płaskiego wypukłego kadłuba, gdzie algorytmy w (oparte na sortowaniu, jako algorytm dla kodu Huffmana) i w (prezent zawijanie) zostały zastąpione przez algorytm Kirkpatrick i Seidela w (później okazało się być optymalnym instancją przy złożoności formy ). W przypadku kodów Free Prefix, kontra sugeruje możliwość algorytmu o złożoności , a nawet gdzie jest liczbą słów kodowych o długości , wykorzystując analogię krawędzi wypukłego kadłuba pokrywającego wskazuje na długość kodu pokrywającą symbole .
Prosty przykład pokazuje, że sortowanie (zaokrąglonych) wartości logarytmicznych częstotliwości (w czasie liniowym w modelu pamięci RAM „ ) nie daje optymalnego wolnego kodu w czasie liniowym:
- Dla , i
- więc sortowanie logów nie zmienia kolejności
- jeszcze dwa kody z trzech kosztują bity więcej niż optymalne.
Innym interesującym pytaniem byłoby zmniejszenie złożoności, gdy jest duże, tj. Wszystkie kody mają różne długości:
- na przykład gdy wszystkie częstotliwości mają odrębną wartość logarytmiczną. W takim przypadku można posortować częstotliwości w czasie liniowym w słowie RAM i obliczyć kod Huffmana w czasie liniowym (ponieważ sortowanie ich wartości logów wystarczy do posortowania wartości), co daje ogólny czas liniowy , znacznie lepiej niż z algorytmu Belala i Elmasry'ego.θ ( lg n ) n 2
źródło