Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoFaramundo Marchesi Modificato 10 anni fa
1
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività? ActivitySelector(a, s, f, n) // f 1... f n A = {a 1 }, k = 1 for m = 2 to n if s[m] f[k] A = A {a m }, k = m return A
2
Lalgoritmo comincia con scegliere la prima attività a 1 (quella con tempo di fine minimo) Siamo sicuri che questa scelta non possa compromettere il risultato? In altre parole: esiste sempre una soluzione ottima che contiene a 1 ?
3
La risposta è affermativa. Sia b 1,...,b j una qualsiasi soluzione ottima (ne esiste certamente almeno una) che supponiamo ordinata per tempo di fine b1b1 b2b2 bjbj ………………….. a1a1 b2b2 bjbj a1a1
4
k viene posto ad 1 ed aggiornato ad m ogni volta che si sceglie una nuova attività a m Siccome le attività sono ordinate per tempo di fine non decrescente, f[k] è il massimo tempo finale delle attività selezionate precedentemente. ActivitySelector(a, s, f, n) // f 1... f n A = {a 1 }, k = 1 for m = 2 to n if s[m] f[k] A = A {a m }, k = m return A
5
Con il test: Siamo sicuri che questa scelta non comprometta il risultato? In altre parole: esiste sempre una soluzione ottima che contiene a m e le attività finora scelte? lalgoritmo seleziona la prima attività a m il cui tempo di inizio s[m] è maggiore o uguale di f[k] if s[m] f[k] A = A {a m }, k = m
6
La risposta è ancora affermativa. Assumiamo che esista una soluzione ottima b 1,...,b i,b i+1,...,b j che estende le attività b 1,...,b i finora scelte e supponiamo b 1,...,b i e b i+1,...,b j ordinate per tempo di fine amam b1b1 bibi bjbj ….. b i+2 amam b1b1 bibi bjbj ….. b i+1 ….. b i+2 f[k]f[k]
7
Sappiamo quindi che durante tutta lesecuzione dellalgoritmo esiste sempre una soluzione ottima contenente le attività b 1,...,b i scelte fino a quel momento Quando lalgoritmo termina non ci sono altre attività compatibili con b 1,...,b i e quindi le attività b 1,...,b i sono una soluzione ottima
8
Lalgoritmo è goloso perchè ad ogni passo, tra tutte le attività compatibili con quelle già scelte, sceglie quella che termina prima. Questa scelta è localmente ottima (golosa) perché è quella che lascia più tempo a disposizione per le successive attività.
9
Esercizio 1. Problema dello zaino frazionario: Dati n tipi di merce M 1,…,M n in quantità rispettive q 1,…,q n e con costi unitari c 1,…,c n si vuole riempire uno zaino di capacità Q in modo che il contenuto abbia costo massimo. Mostrare che il seguente algoritmo risolve il problema: RiempiZaino(q, c, n, Q) // c 1 c 2... c n Spazio = Q for i = 1 to n if Spazio q[i] z[i] = q[i], Spazio = Spazio – z[i] else z[i] = Spazio, Spazio = 0 return z
10
Esercizio 2. Problema dello zaino 0-1: Sono dati n tipi di oggetti O 1,…,O n in numero illimitato. Un oggetto di tipo O i occupa un volume v i e costa c i. Si vuole riempire uno zaino di capacità Q in modo che il contenuto abbia costo massimo. Mostrare che il seguente algoritmo non risolve il problema. RiempiZaino(v, c, n, Q) // c 1 /v 1 c 2 /v 2... c n /v n Spazio = Q for i = 1 to n z[i] = Spazio/v[i] Spazio = Spazio – z[i]v[i] return z
11
Esercizio 3 Siano a 1,...,a n attività didattiche aventi tempi di inizio s 1,...,s n e tempi di fine f 1,...,f n e supponiamo di avere un insieme sufficiente di aule in cui svolgerle. Trovare un algoritmo per programmare tutte le attività usando il minimo numero possibile di aule.
12
Esercizio 4 Siano a 1,...,a n attività didattiche aventi tempi di inizio s 1,...,s n e tempi di fine f 1,...,f n e abbiamo a disposizione m aule A 1,..., A m Trovare un algoritmo goloso per programmare il massimo numero di attività nelle m aule.
13
Codici di Huffman I codici di Huffman vengono usati nella compressione dei dati. Essi permettono un risparmio compreso tra il 20% ed il 90%. Sulla base delle frequenze con cui ogni carattere appare nel file, lalgoritmo goloso di Huffman trova un codice ottimo ossia un modo ottimale di associare ad ogni carattere una sequenza di bit detta parola di codice.
14
Sia dato un file di 120 caratteri con frequenze: carattere a b c d e f frequenza 57 13 12 24 9 5 Usando un codice a lunghezza fissa occorrono 3 bit per rappresentare 6 caratteri. Ad esempio carattere a b c d e f cod. fisso 000 001 010 011 100 101 Per codificare il file occorrono 120 3 = 360 bit.
15
Possiamo fare meglio con un codice a lunghezza variabile che assegni codici più corti ai caratteri più frequenti. Ad esempio con il codice carattere a b c d e f frequenza 57 13 12 24 9 5 cod. var. 0 101 100 111 1101 1100 Bastano 57 1 + 49 3 + 14 4 = 260 bit
16
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di unaltra 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.
17
Con il codice prefisso la codifica della stringa abc è 0101100 carattere a b c d e f cod. var. 0 101 100 111 1101 1100 La decodifica è pure semplice. Siccome nessuna parola codice è prefisso di unaltra, la prima parola codice del file codificato risulta univocamente determinata.
18
Per la decodifica basta quindi: 1.individuare la prima parola codice del file codificato 2.tradurla nel carattere originale e aggiungere tale carattere al file decodificato 3.rimuovere la parola codice dal file codificato 4.ripetere loperazione per i caratteri successivi
19
Ad esempio con il codice la suddivisione in parole codice della stringa di bit 001011101 è 0 0 101 1101 a cui corrisponde la stringa aabe carattere a b c d e f cod. var. 0 101 100 111 1101 1100 Per facilitare la suddivisione del file codificato in parole codice è comodo rappresentare il codice con un albero binario.
20
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 120 a:57f:5e:9d:24c:12b:13 1 1 1 11000 0 0 0 ha la rappresentazione ad albero 10614 703614
21
120 10614 703614 a:57f:5e:9d:24c:12b:13 1 1 1 11000 00 0 In realtà, come albero binario, la rappresentazione sarebbe Noi eliminiamo le foglie e chiamiamo foglie i nodi interni senza figli
22
Il codice a lunghezza variabile 63 120 a:57 25 38 14 b:13c:12 d:24 f:5e:9 0 0 00 0 1 1 1 1 1 è rappresentato carattere a b c d e f frequenza 57 13 12 24 9 5 cod. var. 0 101 100 111 1101 1100
23
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 dellalfabeto Σ, f c è la frequenza del carattere c e d T (c) è la profondità della foglia che rappresenta il carattere c nellalbero T Nota: assumiamo che lalfabeto Σ contenga almeno due caratteri. In caso contrario basta un numero per rappresentare il file: la sua lunghezza
24
La lunghezza in bit del file codificato è anche: in cui la sommatoria è estesa alle frequenze x. f di tutti i nodi interni x dellalbero T. 63 120 a:57 2538 14 b:13c:12d:24 f:5e:9 0 0 00 0 1 1 11 1
25
a:57b:13c:12 14 d:24 f:5e:9 01 Q a:57d:24f:5e:9 Q b:13c:12 carattere a b c d e f frequenza 57 13 12 24 9 5 Costruzione dellalbero di Huffman: a:57 25 b:13c:12 01 14 d:24 f:5e:9 01 Q
26
a:57 25 b:13c:12 01 38 14 d:24 f:5e:9 0 0 1 1 Q a:57 25 b:13c:12 01 14 d:24 f:5e:9 01 Q
27
a:57 25 b:13c:12 01 38 14 d:24 f:5e:9 0 0 1 1 Q 63 a:57 2538 14 b:13c:12d:24 f:5e:9 0 00 0 1 11 1 Q
28
63 a:57 2538 14 b:13c:12d:24 f:5e:9 0 00 0 1 11 1 Q 63 120 a:57 2538 14 b:13c:12d:24 f:5e:9 0 0 00 0 1 1 11 1 Q
29
Implementazione dellalgoritmo goloso di Huffman Huffman(c, f, n) Q = Ø // coda con priorità for i = 1 to n Push(Q, Nodo(f i, c i )) 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
30
Assumendo che la coda Q venga realizzata con un heap, le operazioni Insert ed ExtractMin richiedono tempo O(log n). Pertanto lalgoritmo richiede tempo O(n log n) (dove n è il numero di caratteri dellalfabeto).
31
Lalgoritmo è 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?
32
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.
33
Se T è ottimo ogni nodo interno ha due figli (altrimenti togliendo il nodo si otterrebbe un codice migliore) 120 63 a:57 25 38 14 b:13c:12 d:24 f:5e:9 0 0 0 0 0 1 1 1 1 1 63 120 a:57 25 38 14 b:13c:12 d:24 f:5 e:9 0 0 0 0 0 1 1 1 1 1 25 0 9 0 Se T è ottimo esistono due foglie sorelle x ed y a profondità massima.
34
Proprietà (sottostruttura ottima) Sia T lalbero di un codice prefisso ottimo per lalfabeto Σ 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 f c = z.f = f a + f b allora lalbero T'=T - {x,y} rappresenta un codice prefisso ottimo per lalfabeto Σ' = Σ - {a,b} {c}
35
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 lipotesi che T sia ottimo.
36
a b T xy z c T z S a b z xy c S z
37
Proprietà (scelta golosa) Siano a e b due caratteri di Σ aventi frequenze f a ed f b minime Esiste un codice prefisso ottimo in cui le parole codice di a e b hanno uguale lunghezza e differiscono soltanto per lultimo bit. Se i codici di a e b differiscono soltanto per lultimo bit, nellalbero del codice le foglie a e b sono figlie dello stesso nodo, cioè sorelle.
38
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.
39
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 f c f d ed f a f b. a e b sono i due caratteri con frequenza minima in assoluto e quindi f a f c ed f b f d.
40
c b a d T a b c d T Sia T' ottenuto da T scambiando la foglia c con la foglia a (con ricalcolo delle frequenze dei nodi interni) f a f c ed f b f d.
41
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.
42
Teorema Lalgoritmo di Huffman produce un codice prefisso ottimo Conseguenza della sottostruttura ottima e della proprietà della scelta golosa Huffman(c, f, n) Q = Ø // coda con priorità for i = 1 to n Push(Q, Nodo(f i, c i )) for j = n downto 2 x = ExtractMin(Q) y = ExtractMin(Q) Push(Q, Nodo(x,y)) return ExtractMin(Q)
43
Esercizio 5 Dimostrare che ogni algoritmo di compressione che accorcia qualche sequenza di bit deve per forza allungarne qualche altra.
44
Dimostrazione Supponiamo per assurdo che lalgoritmo accorci qualche sequenza ma non ne allunghi nessuna. Sia x la più corta sequenza che viene accorciata dallalgoritmo e sia m la sua lunghezza. Le sequenze di lunghezza minore di m sono 2 m -1 e non vengono accorciate o allungate.
45
Ognuna di esse viene codificata con una sequenza diversa e quindi le loro codifiche sono anchesse 2 m -1 e sono tutte di lunghezza minore di m. Dunque ognuna delle 2 m -1 sequenze più corte di m è codifica di qualche sequenza più corta di m. Dunque la codifica di x coincide con la codifica di unaltra sequenza. ASSURDO!!!!
46
Suggerimento: usare 2n - 1 bit per la struttura dellalbero ed n log n bits per elencare i caratteri nellordine in cui compaiono nelle foglie (usando il codice del file non compresso) Esercizio 6. Sia Σ = {c 1,...,c n } un insieme di caratteri ed f 1,...,f n le loro frequenze Rappresentare un codice prefisso ottimo per Σ con una sequenza di 2n - 1 + n log n bit
47
63 120 a:57 2538 14 b:13c:12d:24 f:5e:9 0 0 00 0 1 1 11 1 01001100111 se il nodo è interno metti uno 0 e scendi sul figlio sinistro; se è una foglia metti un 1 e risali verso sinistra finché puoi: se arrivi alla radice fermati altrimenti risali di un passo verso destra e scendi sul figlio destro Parti dalla radice e ripeti:
48
a bcd fe 0 0 00 0 1 1 11 1 01001100111 se incontri uno 0 crea il figlio sinistro e scendi su tale figlio; se incontri un 1 risali verso sinistra finché puoi: se arrivi alla radice fermati altrimenti risali di un passo verso destra, crea un figlio destro e scedi su tale figlio Crea la radice e ripeti:
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.