Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.

Slides:



Advertisements
Presentazioni simili
Premessa: si assume di aver risolto (correttamente
Advertisements

Algoritmi e Strutture dati Mod B
Algoritmi e Strutture Dati
Strutture dati per insiemi disgiunti
Algoritmi e Strutture Dati
Capitolo 8 Sistemi lineari.
Algoritmi e Strutture Dati
RB-alberi (Red-Black trees)
Alberi binari di ricerca
Code con priorità Ordinamento
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Algoritmi e Strutture Dati
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Unintroduzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Alberi AVL (Adelson-Velskii.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. A)
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Trovare il percorso minimo da b ad ogni altro vertice
Algoritmi e strutture dati
Algoritmi e Strutture Dati
Lezione 5 Domande: Laverage path length di Chord con 2^b identificatori e N=2^b nodi è (giustificare la risposta) Laverage path length di Chord con 2^b.
Heap binari e HeapSort.
Metodo della moltiplicazione
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Strutture dati per insiemi disgiunti
Passo 3: calcolo del costo minimo
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Heap Ordinamento e code di priorità Ugo de Liguoro.
La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.
Cammini minimi da un sorgente
Valutare la difficoltà dei problemi
Capitolo 6 Alberi di ricerca Algoritmi e Strutture Dati.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Risoluzione delle collisioni con indirizzamento aperto Con la tecnica di indirizzamento aperto tutti gli elementi stanno nella tavola. La funzione hash.
Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna.
Capitolo 13 Cammini minimi: Algoritmo di Floyd e Warshall Algoritmi e Strutture Dati.
Capitolo 13 Cammini minimi: Ordinamento topologico Algoritmi e Strutture Dati.
1 Ordinamento (Sorting) INPUT: Sequenza di n numeri OUTPUT: Permutazione π = tale che a 1 ’  a 2 ’  … …  a n ’ Continuiamo a discutere il problema dell’ordinamento:
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 12 Minimo albero ricoprente: Algoritmo di Kruskal Algoritmi e Strutture Dati.
1 Ordinamento (Sorting) Input: Sequenza di n numeri Output: Permutazione π = tale che: a i 1  a i 2  ……  a i n Continuiamo a discutere il problema dell’ordinamento:
Master Bioinformatica 2002: Visite di Grafi Algoritmi di visita Scopo: visitare tutti i vertici di un grafo per scoprirne proprietà di vario tipo. Alcune.
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Algoritmi golosi Tecniche di soluzione dei problemi viste finora:
Algoritmi e Strutture Dati
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: lower bound Ω(n log n) e MergeSort ((*) l’intera lezione) Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Un’introduzione.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Capitolo 12 Minimo albero ricoprente: Algoritmo di Kruskal Algoritmi e Strutture Dati.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi Complessità e Trasportabilità Lezione n°3.
Transcript della presentazione:

Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente prefisso. Ma anche il codice a lunghezza variabile che abbiamo appena visto è un codice prefisso. Codifica e decodifica sono semplici con i codici prefissi.

la codifica della stringa abc è 0101100 Con il codice prefisso carattere a b c d e f cod. var. 0 101 100 111 1101 1100 la codifica della stringa abc è 0101100 La decodifica è pure semplice. Siccome nessuna parola codice è prefisso di un’altra, la prima parola codice del file codificato risulta univocamente determinata.

Per la decodifica basta quindi: individuare la prima parola codice del file codificato tradurla nel carattere originale e aggiungere tale carattere al file decodificato rimuovere la parola codice dal file codificato ripetere l’operazione per i caratteri successivi

Ad esempio con il codice carattere a b c d e f cod. var. 0 101 100 111 1101 1100 la suddivisione in parole codice della stringa di bit 001011101 è 001011101 a cui corrisponde la stringa aabe Per facilitare la suddivisione del file codificato in parole codice è comodo rappresentare il codice con un albero binario.

Esempio: il codice a lunghezza fissa carattere a b c d e f frequenza 57 13 12 24 9 5 cod. fisso 000 001 010 011 100 101 ha la rappresentazione ad albero 120 1 000001011 106 14 1 70 36 14 1 1 1 a:57 b:13 c:12 d:24 e:9 f:5

In realtà, come albero binario, la rappresentazione sarebbe 120 1 106 14 1 70 36 14 1 1 1 000001011 a:57 b:13 c:12 d:24 e:9 f:5 Noi eliminiamo le foglie e chiamiamo foglie i nodi interni senza figli

Il codice a lunghezza variabile carattere a b c d e f frequenza 57 13 12 24 9 5 cod. var. 0 101 100 111 1101 1100 è rappresentato 120 1 63 0101111 a:57 1 25 38 1 1 14 c:12 b:13 d:24 1 f:5 e:9

La lunghezza in bit del file codificato con il codice rappresentato da un albero T è: in cui la sommatoria è estesa a tutti i caratteri c dell’alfabeto Σ, fc è la frequenza del carattere c e dT(c) è la profondità della foglia che rappresenta il carattere c nell’albero T Bisogna cercare di diminuire sia il numero che le frequenzedei nodi interni Nota: assumiamo che l’alfabeto Σ contenga almeno due caratteri. In caso contrario basta un numero per rappresentare il file: la sua lunghezza

La lunghezza in bit del file codificato è anche: 63 120 a:57 25 38 14 b:13 c:12 d:24 f:5 e:9 1 in cui la sommatoria è estesa alle frequenze x.f di tutti i nodi interni x dell’albero T.

Costruzione dell’albero di Huffman: carattere a b c d e f frequenza 57 13 12 24 9 5 a:57 d:24 f:5 e:9 Q b:13 c:12 a:57 b:13 c:12 14 d:24 f:5 e:9 1 Q a:57 25 b:13 c:12 1 14 d:24 f:5 e:9 Q

a:57 25 b:13 c:12 1 14 d:24 f:5 e:9 Q a:57 25 b:13 c:12 1 38 14 d:24 f:5 e:9 Q

a:57 25 b:13 c:12 1 38 14 d:24 f:5 e:9 Q 63 a:57 25 38 14 b:13 c:12 d:24 f:5 e:9 1 Q

63 a:57 25 38 14 b:13 c:12 d:24 f:5 e:9 1 Q 63 120 a:57 25 38 14 b:13 c:12 d:24 f:5 e:9 1 Q

Implementazione dell’algoritmo goloso di Huffman Huffman(c, f, n) Q = Ø // coda con priorità for i = 1 to n Push(Q, Nodo(fi, ci)) for j = n downto 2 x = ExtractMin(Q) y = ExtractMin(Q) Push(Q, Nodo(x, y)) return ExtractMin(Q) Nodo(f, c) costruttore dei nodi foglia Nodo(x, y) costruttore dei nodi interni

Assumendo che la coda Q venga realizzata con un heap, le operazioni Insert ed ExtractMin richiedono tempo O(log n). Pertanto l’algoritmo richiede tempo O(n log n) (dove n è il numero di caratteri dell’alfabeto).

L’algoritmo è goloso perché ad ogni passo costruisce il nodo interno avente frequenza minima possibile. Ricordiamo infatti che Siamo sicuri che in questo modo otteniamo sempre un codice ottimo?

Elementi della strategia golosa Ingredienti comuni a molti problemi risolvibili con la strategia golosa: Sottostruttura ottima: Ogni soluzione ottima non elementare si ottiene da soluzioni ottime di sottoproblemi. Proprietà della scelta golosa: La scelta localmente ottima (golosa) non pregiudica la possibilità di arrivare ad una soluzione globalmente ottima.

Se T è ottimo esistono due foglie sorelle x ed y a profondità massima. Se T è ottimo ogni nodo interno ha due figli (altrimenti togliendo il nodo si otterrebbe un codice migliore) 63 120 a:57 25 38 14 b:13 c:12 d:24 f:5 e:9 1 9 120 63 a:57 25 38 14 b:13 c:12 d:24 f:5 e:9 1 Se T è ottimo esistono due foglie sorelle x ed y a profondità massima.

Proprietà (sottostruttura ottima) Sia T l’albero di un codice prefisso ottimo per l’alfabeto Σ e siano a ed b i caratteri associati a due foglie sorelle x ed y di T. Se consideriamo il padre z di x ed y come foglia associata ad un nuovo carattere c con frequenza fc = z.f = fa+ fb allora l’albero T'=T - {x,y} rappresenta un codice prefisso ottimo per l’alfabeto Σ' = Σ - {a,b} ⋃ {c}

Supponiamo, per assurdo, esista un albero S' per Σ' tale che B(S') < B(T'). Aggiungendo ad S' le foglie x ed y come figlie del nodo z (che in S' è una foglia) otterremmo un albero S per Σ tale che B(S) < B(T) contro l’ipotesi che T sia ottimo.

a b T x y z c T’ z c S’ z S a b z x y

Proprietà (scelta golosa) Siano a e b due caratteri di Σ aventi frequenze fa ed fb minime Esiste un codice prefisso ottimo in cui le parole codice di a e b hanno uguale lunghezza e differiscono soltanto per l’ultimo bit. Se i codici di a e b differiscono soltanto per l’ultimo bit, nell’albero del codice le foglie a e b sono figlie dello stesso nodo, cioè sorelle.

Attenzione: Il Lemma non dice che ciò è vero per ogni codice prefisso ottimo e tanto meno che se ciò è vero il codice è ottimo!!!! Dice solo che ciò è vero per almeno un codice ottimo.

Sappiamo che in T esistono due foglie sorelle a profondità massima. Siano c e d i caratteri di tali foglie. Mostriamo che scambiando c e d con a e b il codice rimane ottimo. Possiamo supporre fc ≤ fd ed fa ≤ fb. a e b sono i due caratteri con frequenza minima in assoluto e quindi fa ≤ fc ed fb ≤ fd.

Sia T' ottenuto da T scambiando la foglia c con la foglia a (con ricalcolo delle frequenze dei nodi interni) fa ≤ fc ed fb ≤ fd. T T’ c a b b a d c d

Allora: Siccome T è ottimo B(T) = B(T') e quindi anche T' è ottimo. Scambiando poi le foglie d e b, si ottiene ancora un albero ottimo T'' in cui a e b sono foglie sorelle.

Teorema L’algoritmo di Huffman produce un codice prefisso ottimo Huffman(c, f, n) Q = Ø // coda con priorità for i = 1 to n Push(Q, Nodo(fi , ci)) for j = n downto 2 x = ExtractMin(Q) y = ExtractMin(Q) Push(Q , Nodo(x,y)) return ExtractMin(Q) Conseguenza della sottostruttura ottima e della proprietà della scelta golosa

Esercizio 5 Dimostrare che ogni algoritmo di compressione che accorcia qualche sequenza di bit deve per forza allungarne qualche altra.

Dimostrazione Supponiamo per assurdo che l’algoritmo accorci qualche sequenza ma non ne allunghi nessuna. Sia x la più corta sequenza che viene accorciata dall’algoritmo e sia m la sua lunghezza. Le sequenze di lunghezza minore di m sono 2m-1 e non vengono accorciate o allungate.

Ognuna di esse viene codificata con una sequenza diversa e quindi le loro codifiche sono anch’esse 2m-1 e sono tutte di lunghezza minore di m. Dunque ognuna delle 2m-1 sequenze più corte di m è codifica di qualche sequenza più corta di m. Dunque la codifica di x coincide con la codifica di un’altra sequenza. ASSURDO!!!!