È noto che esiste un algoritmo ottimale nel caso peggiore per calcolare il codice Huffman in tempo . Questo è migliorato in due modi ortogonali:
I codici gratuiti con prefisso ottimale possono essere calcolati più rapidamente se l'insieme di frequenze distinte è piccolo (ad es. Di dimensione ): ordina le frequenze usando [Munro e Spira, 1976] in modo da sfruttare il piccolo valore di σ e calcola Huffman albero in tempo lineare dalle frequenze ordinate. Questo produce una soluzione in O ( n lg σ )
Esiste un algoritmo per calcolare codici equivalenti in cui k è il numero di lunghezze distinte di parole in codice [Belal ed Elmasry].
C'è un modo per combinare queste tecniche, al fine di migliorare l'attuale migliore complessità di ?
THE RESULT FROM STACS 2006 SEMBRA SBAGLIATO , Elmasry ha pubblicato su ARXIV nel 2010 (http://arxiv.org/abs/cs/0509015) una versione che annuncia - operazioni su input non ordinato e - O ( 9 k log 2 k - 1 n ) operazioni su input ordinato
Vedo un'analogia con la complessità del calcolo dello scafo convesso planare, in cui gli algoritmi in (basato sull'ordinamento, come l' algoritmo O ( n lg n ) per il codice di Huffman) e in O ( n h ) (confezione regalo ) sono stati sostituiti dall'algoritmo di Kirkpatrick e Seidel in O ( n lg h ) (in seguito si è dimostrato ottimale con la complessità della forma O ( n H ( n 1 , ... , n k ). Nel caso dei prefissi Codici liberi, O ( n lg n ) contro O ( n k ) suggerisce la possibilità di un algoritmo con complessità , … , n k ) dove n i è il numero di parole in codice di lunghezza i , usando l'analogia di un bordo dello scafo convesso che copre n i , o anche O ( n H ( n 1indica una lunghezza del codice che copre simboli.
Un semplice esempio mostra che l'ordinamento dei valori logaritmici (arrotondati) delle frequenze (in tempo lineare nel modello RAM della parola ) non fornisce un codice libero di prefisso ottimale in tempo lineare:
- Per , f 1 = 1 / 2 - ε ed f 2 = f 3 = 1 / 4 + ε
- quindi l'ordinamento dei registri non cambia ordine
- tuttavia due codici su tre costano bit in più rispetto all'ottimale.
Un'altra domanda interessante sarebbe quella di ridurre la complessità quando è grande, cioè tutti i codici hanno lunghezze distinte:
- per esempio quando le frequenze hanno tutte un valore log distinto. In questo caso è possibile ordinare le frequenze in tempo lineare in parola di RAM, e calcolare il codice di Huffman in tempo lineare (perché l'ordinamento i loro valori di registro è sufficiente per ordinare i valori), con conseguente tempo lineare nel complesso, tanto meglio del n 2 dall'algoritmo di Belal ed Elmasry.