Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoGiulio Gattini Modificato 8 anni fa
1
La codifica di Huffman adattiva
2
Perché adattiva? La codifica di Huffman soffre del difetto che il decodificatore deve conoscere le probabilità dei simboli utilizzate nella compressione del messaggio... e ciò richiede spazio (il messaggio compresso è più lungo) Se l'informazione non è disponibile la compressione avviene in due passi primo passo: stimare le probabilità di ogni simbolo (costruzione del modello) e costruzione dell'albero di Huffman secondo passo: codifica del messaggio
3
L'idea L'idea fondamentale è quella di costruire un albero di Huffman che sia ottimo per la parte di messaggio vista fino ad adesso, e di riorganizzarlo quando occorre, per mantenerne l'ottimalità
4
Pro & Contro - I La codifica di Huffman adattiva crea le parole di codice utilizzando una stima variabile delle probabilità dei simboli emessi dalla sorgente La località è ben sfruttata Per esempio supponiamo che il messaggio inizi con una serie di caratteri che in seguito non si ripetono mai. Nella codifica di Huffman statica tali caratteri saranno in basso nell'albero a causa del fatto che sono molto rari nel messaggio visto nel suo insieme, e perciò saranno codificati con molti bit. Al contrario nella codifica adattiva, i caratteri saranno inseriti subito nelle foglie più vicine alla radice, salvo poi venire spinti più in basso all'apparire di caratteri più frequenti
5
Pro & Contro - II + Un solo passo sui dati - Talvolta la codifica adattiva richiede più bit di quella statica (senza overhead, ossia senza considerare il fatto che con Huffman occorre inserire nel messaggio compresso le probabilità dei simboli o una rappresentazione dell'albero, che costa O(n)) = Tuttavia in generale la codifica adattiva è competitiva con quella statica se si considera anche l'overhead
6
Un po' di storia La codifica di Huffman adattiva fu concepita indipendentemente da Faller (1973) and Gallager (1978) Knuth apportò dei miglioramenti all'algoritmo originale (1985) e l'algoritmo risultante è noto come algoritmo FGK Una versione più recente è stata proposta da Vitter (1987) e chiamata algoritmo V
7
Una domanda importante Sfruttando meglio la località, la codifica di Huffman adattiva è talvolta in grado di avere prestazioni migliori della codifica di Huffman statica, cioè, in alcuni messaggi, riesce a comprimere di più... ma avevamo detto che la codifica di Huffman (statica) era ottima, nel senso che era quella che aveva la minima ridondanza C'è una contraddizione?
8
L'algoritmo FGK - I Alla base dell'algoritmo FGK c'è la Proprietà di Fratellanza (Sibling Property) (Gallager 1978) Un albero binario con pesi non negativi nei nodi gode della proprietà di fratellanza se ogni nodo (tranne la radice) ha un fratello e i nodi possono essere numerati in ordine di peso non decrescente in modo tale che ogni nodo sia adiacente al proprio fratello. Un codice binario istantaneo è di Huffman se e solo se l'albero binario che lo rappresenta gode della proprietà di fratellanza
9
L'algoritmo FGK - II Notate che la numerazione dei nodi corrisponde all'ordine con il quale i nodi vengono combinati dall'algoritmo di Huffman, subito i nodi 1 e 2, poi i nodi 3 e 4 2a2a 3b3b 5d5d 6e6e 5c5c 11 f 3232 2121 1 1010 5 12 3 4 56 78 9 10 11
10
L'algoritmo FGK - III Nell'algoritmo FGK, sia il codificatore che il decodificatore costruiscono alberi di Huffman che cambiano dinamicamente. Per ogni simbolo il codificatore invia la parola di codice per quel simbolo nell'albero corrente e quindi aggiorna l'albero Il problema è cambiare in modo efficiente l'albero ottimo dopo t simboli (non necessariamente distinti) in quello ottimo per t+1 simboli Se semplicemente incrementassimo il peso del t+1-simo simbolo e di tutti i suoi predecessori, la proprietà di fratellanza potrebbe non essere più valida e dunque dobbiamo ricostruire l'albero
11
L'algoritmo FGK - IV Supponiamo che il prossimo simbolo sia “b” Se aggiorniamo i pesi...... la proprietà di fratellanza è violata!! Non è più un albero di Huffman 2a2a 3 b 5d5d 6e6e 5c5c 11 f 3232 2121 1 1010 5 12 3 4 56 78 9 10 11 b 4 6 22 33 non sono più ordinati per peso non decrescente
12
L'algoritmo FGK - V La soluzione può essere descritta come un processo a due fasi prima fase: l'albero originale è trasformato in un altro albero di Huffman valido per i primi t simboli, ma che abbia la proprietà che il semplice incremento dei pesi dei nodi possa aver luogo con successo seconda fase: si incrementano i pesi come visto in precedenza
13
L'algoritmo FGK - V La prima fase inizia alla foglia corrispondente al t+1- simo simbolo Si scambia questo nodo e tutto il suo sottoalbero, ma non il suo numero con il nodo di numero più alto tra quelli con lo stesso suo peso Adesso il nodo corrente è il padre di quest'ultimo nodo Il processo è ripetuto fino al raggiungimento della radice dell'albero
14
L'algoritmo FGK - VI Prima fase Nodo 2: niente da fare Nodo 4:da scambiare con il nodo 5 Nodo 8: da scambiare con il nodo 9 2a2a 3b3b 5d5d 6e6e 5c5c 1 11f11f 3232 2121 1 1010 5 12 3 4 56 78 9 10 11 b
15
L'algoritmo FGK - VI Prima fase Nodo 2: niente da fare Nodo 4:da scambiare con il nodo 5 Nodo 8: da scambiare con il nodo 9 Raggiunta la radice: fine! Seconda fase 2a2a 3 b 5d5d 6e6e 5c5c 1 11f11f 3232 2121 1 1010 5 12 3 4 5 6 7 8 9 10 11 b 6 12 33 4
16
Perché FGK funziona? La procedura a due fasi costruisce un albero di Huffman valido per t+1 simboli, dal momento che la proprietà di fratellanza è soddisfatta Infatti ogni nodo di cui bisogna incrementare il peso è scambiato con il nodo con il numero più alto fra quelli con lo stesso peso In questo modo, dopo gli incrementi non esistono nodi di numero più alto e con peso pari a quello precedente l'incremento
17
Il problema dei simboli non ancora visti - I All'inizio e talvolta durante l'algoritmo si incontra un simbolo mai visto prima. Come si tratta? Si usa un nodo 0 (con peso 0) che rappresenta tutti i simboli non visti. Quando appare un nuovo simbolo viene inviato il codice del nodo 0 e qualche altro bit per capire quale sia il nuovo simbolo Dato che ogni volta is inviano log n bit per capire quale sia il simbolo, l'overhead totale è n log n bit Si può fare meglio, inviando soltanto l'indice del simbolo nella lista dei simboli mai visti fino ad ora. Così, in media, si risparmia qualche bit
18
Il problema dei simboli non ancora visti - II Quindi il nodo 0 viene diviso in due foglie, sorelle, una per il nuovo simbolo, con peso 1, ed un nuovo nodo 0 Poi l'albero è rielaborato esattamente come prima per soddisfare di nuovo la proprietà di fratellanza
19
Algoritmo FGK - riassunto L'algoritmo inizia con soltanto una foglia, il nodo 0. Mano a mano che arrivano nuovi simboli, vengono create nuove foglie ed ogni volta l'albero viene ricalcolato Ogni simbolo è codificato con la sua parola di codice nell'albero corrente e poi l'albero è aggiornato I simboli mai visti sono codificati con il codice del nodo 0 e con altri bit, quanti servono per specificare con precisione il simbolo nella lista di quelli mai visti
20
L'algoritmo FGK - VII L'algoritmo FGK è competitivo con il codice di Huffman statico, se si tiene conto anche dell'overhead (ed è utilizzato nell'utility UNIX compact) Esercizio Costruire l'albero di Huffman statico e l'albero FGK per il messaggio e eae de eabe eae dcf e calcolare il numero di bit necessari per la compressione con entrambi gli algoritmi, ignorando l'overhead per Huffman SOL. FGK 60 bits, Huffman 52 bits FGK è ottenuto usando il minimo numero possibile di bit per individuare gli elementi nella lista dei simboli non visti
21
L'algoritmo FGK - VIII Se T= “numero totale di bit trasmessi dall'algoritmo FGK per un messaggio di lunghezza t che contiene n simboli distinti”, allora dove S è la performance dell'algoritmo di Huffman statico (Vitter 1987) La performance dell'algoritmo FGK non è mai peggiore di due volte l'ottimo di Huffman
22
L'algorithm V - I Vitter nel suo lavoro del 1987 introdusse due migliorie all'algoritmo FGK, chiamando lo schema risultante algoritmo Λ In suo onore, l'algoritmo è diventato famoso... con la lettera capovolta..., ossia come algoritmo V
23
Le idee principali - I lo scambio dei nodi durante la codifica e la decodifica è oneroso Nell'algoritmo FGK il numero di scambi (considerando costo doppio nel caso in cui un nodo è spostato due livelli più in su) è limitato da d d i /2 e, dove d i è la lunghezza del simbolo aggiunto nel vecchio albero (questo limite richiede un po' di lavoro per essere ricavato ed è opera di Vitter) Nell'algoritmo V, il numero di scambi è al massimo 1
24
Le idee principali - II Inoltre l'algoritmo V, non soltanto minimizza come Huffman e FGK, ma anche, cioè l'altezza dell'albero, e, cioè è più adatto per codificare il prossimo simbolo, ammesso che sia rappresentabile da una delle foglie dell'albero Questi obiettivi vengono raggiunti attraverso una diversa numerazione, detta numerazione implicita
25
Numerazione implicita I nodi sono numerati in ordine crescente per livelli; i nodi in un livello hanno numeri più bassi rispetto a quelli del livello più alto successivo I nodi nello stesso livello sono numerati in ordine crescente da destra a sinistra Se questo schema di numerazione viene soddisfatto (e non è detto lo sia sempre in FGK), certi tipi di scambi non possono accadere
26
Un invariante La chiave per minimizzare il numero di scambi degli altri tipi è il seguente invariante per ogni peso w, tutte le foglie di peso w precedono nella numerazione implicita tutti i nodi interni di peso w Gli scambi, nell'algoritmo V, sono studiati per preservare la numerazione implicita quando si legge un nuovo simbolo e l'invariante
27
L'algoritmo V - II se T= “numero totale di bit trasmessi dall'algoritmo V per un messaggio di lunghezza t con n simboli distinti”, allora Dal punto di vista sperimentale, l'algoritmo V è leggermente migliore dell'algoritmo FGK
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.