La codifica di Huffman adattiva. Perché adattiva? La codifica di Huffman soffre del difetto che il decodificatore deve conoscere le probabilità dei simboli.

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati (Mod. A)
Advertisements

Algoritmi e strutture dati
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
© 2015 Giorgio Porcu - Aggiornamennto 01/12/2015 I STITUTO T ECNICO SECONDO BIENNIO T ECNOLOGIE E P ROGETTAZIONE Rappresentazione dell’ Informazione Sistemi.
Prog21 Alberi binari (radicati e ordinati) Il figlio destro della radice La radice Il figlio sinistro della radice Il padre del nodo 5.
Unità di apprendimento 6 Dal problema al programma.
Fondamenti di Informatica A - Massimo Bertozzi ALBERI E ALBERI BINARI DI RICERCA (BST)
Introduzione alla compressione. Gabriele Monfardini - Corso di Basi di Dati Multimediali - a.a Cosa è la compressione? Intuitivamente la compressione.
La codifica aritmetica. Come possiamo far meglio di Huffman? - I Come abbiamo visto, il principale svantaggio della codifica di Huffman sono i suoi problemi.
La seguente matrice è una matrice delle distanze di un’istanza del problema del Commesso Viaggiatore. Calcolare un lower bound per il valore del ciclo.
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
La codifica di Huffman. Codici ottimi - I Un codice è ottimo se ha la lunghezza media di parola L più piccola Si può vedere come un problema di ottimizzazione.
Indici di Posizione Giulio Vidotto Raffaele Cioffi.
Prof.ssa Rossella Petreschi Lezione del 29 /10/2014 del Corso di Algoritmica Lezione n°8.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
© 2007 SEI-Società Editrice Internazionale, Apogeo
Progettare algoritmi veloci usando strutture dati efficienti
Inserzione e Cancellazione
Unità di apprendimento 1
La rappresentazione delle informazioni
Branch and Bound Lezione n°19 Prof.ssa Rossella Petreschi
MASSIMO COMUNE DENOMINATORE (M.C.D)
Branch and Bound Lezione n°14 Prof.ssa Rossella Petreschi
Progettare algoritmi veloci usando strutture dati efficienti
Algoritmi di stima con perdita di pacchetti in reti di sensori wireless: modellizzazione a catene di Markov, stima e stima distribuita Chiara Brighenti,
Controlli Automatici - A.A. 2003/2004
Dizionari alberi bilanciati.
Analisi di sequenze di operazioni Union-Find
Lezione n°9 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Alberi binari Definizione Sottoalberi Padre, figli
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Dal problema al processo risolutivo
Rappresentazione di alberi
Unità di apprendimento 7
B-alberi e alberi autoaggiustanti
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
La gestione degli insiemi disgiunti
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Lezione n°4 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Quick Sort: Esempio Si consideri il seguente vettore, v, di n=10 elementi: i=inf j=sup Scegliamo come pivot.
K4 è planare? E K3,3 e K5 sono planari? Sì!
Algoritmi e Strutture Dati
Programmare.
Dizionari alberi bilanciati.
Il sistema di numerazione decimale
Rappresentazione di alberi
Lezione n°6 Prof.ssa Rossella Petreschi
Branch and Bound Lezione n°18 Prof.ssa Rossella Petreschi
Introduzione agli Algoritmi e alle Strutture Dati
Codici rilevatori di errori
Definizione di linguaggio di programmazione
Alberi n-ary Lezioni di C.
Algoritmi e Strutture Dati
Progettare algoritmi veloci usando strutture dati efficienti
* 07/16/96 Sez. 2: Ordinamento La consultazione di banche dati è sempre più cruciale in tutte le applicazioni dell’Informatica. Se vogliamo consultare.
Algoritmi e Strutture Dati
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Algoritmi e Strutture Dati
Unione per ranghi compressi
Ricerca 01/08/2019 package.
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Algoritmi.
Transcript della presentazione:

La codifica di Huffman adattiva

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

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à

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

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

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

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?

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

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

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

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 b non sono più ordinati per peso non decrescente

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

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

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 b

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 b

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

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

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

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

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

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

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

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

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

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

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

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