Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Documenti analoghi
Tecniche Algoritmiche: tecnica greedy (o golosa)

Definizioni. Soluzione ottima: migliore soluzione possibile Soluzione ottima localmente: soluzione ottima in un dominio contiguo. Il paradigma greedy

Programmazione Greedy I codici di Huffman

Algoritmi e Strutture Dati Laboratorio 15/12/2008. Daniele Loiacono

Informatica 3. LEZIONE 16: Heap - Codifica di Huffmann. Modulo 1: Heap e code di priorità Modulo 2: Esempio applicativo: codifica di Huffmann

carattere a b c d e f cod. var

Grafi (non orientati e connessi): minimo albero ricoprente

Tecniche Algoritmiche/2 Algoritmi greedy

Grafi (orientati): cammini minimi

Problema del rappresentante o dei turisti

ESERCIZI SUGLI HEAP BINOMIALI (CAPITOLO 20) Catalano Pietro 56/100592

Code a priorità Una coda a priorità è una struttura dati astratta che permette di rappresentare un insieme di elementi su cui è definita una

Algoritmi e strutture dati. Codici di Huffman

Esercizi su alberi binari

2.2 Alberi di supporto di costo ottimo

Introduzione agli algoritmi Prova di esame del 19/9/2016 Prof.sse E. Fachini - R. Petreschi. Parte prima

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Algoritmi & Laboratorio

In questa lezione. Heap binario heapsort. [CLRS10] cap. 6, par Prof. E. Fachini - Intr. Alg.

Alberi binari di ricerca

Algoritmi & Laboratorio

LABORATORIO DI ALGORITMI E STRUTTURE DATI A-L. Ingegneria e scienze informatiche Cesena A.A: 2016/2017 Docente: Greta Sasso

La codifica di sorgente

2.2 Alberi di supporto di costo ottimo

2.2 Alberi di supporto di costo ottimo

La codifica di sorgente

Note per la Lezione 4 Ugo Vaccaro

Problema del cammino minimo

Heap Ordinamento e code di priorità. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 9

Strutture dati per insiemi disgiunti

Esercitazione 4 Algoritmi greedy

Soluzioni della settima esercitazione di Algoritmi 1

Alberi binari e alberi binari di ricerca

Algoritmi e Strutture Dati

Alberi binari e alberi binari di ricerca

d. Cancellazione del valore 5 e. Inserimento del valore 1

Minimo albero di copertura

Progettazione di Algoritmi

Algoritmi e Strutture Dati

Dizionari Liste invertite e Trie

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

2.2 Alberi di supporto di costo ottimo

Complementi di Algoritmi e Strutture Dati. Soluzioni prova scritta 7 giugno 2017

2.3 Cammini ottimi. E. Amaldi Fondamenti di R.O. Politecnico di Milano 1

Esercizi di Algoritmi e Strutture Dati

Problemi di ordinamento

Alberi binari e alberi binari di ricerca

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Laboratorio di Python

Esercizi su ABR. Prof. E. Fachini - Intr. Alg.!1

In questa lezione. Costruire un max-heap. [CLRS01] cap. 6 par Prof. E. Fachini - Intr. Alg.

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Alberi ed Alberi Binari

In questa lezione. Code di priorità. [CLRS01] cap. 6 da pag. 114 a pag Prof. E. Fachini - Intr. Alg. lunedì 17 settembre 2012

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Dato un insieme S di n elementi totalmente ordinato, l'algoritmo di ordinamento detto HeapSort ha le seguenti caratteristiche:

1 Esercizio - caso particolare di ottimalità

In questa lezione. Alberi binari: [CLRS09] cap. 12 per la visita inorder. visite e esercizi su alberi binari. Prof. E. Fachini - Intr. Alg.

Gli ordini di visita di un albero binario di 9 nodi sono i seguenti: A, E, B, F, G, C, D, I, H (anticipato)

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Informatica Generale Homework di Recupero 2016

Esercizio 1. FONDAMENTI DI INFORMATICA II Algoritmi e Strutture dati a.a 2015/16 14 giugno 2016

Algoritmi e strutture dati 16 Dicembre 2004 Canali A L e M Z Cognome Nome Matricola

Laboratorio di algoritmi e strutture dati

Problem Set 3 docente: Luciano Gualà

Laboratorio di Algoritmi e Strutture Dati

Informatica Generale Homework di Recupero 2018

Algoritmi e Strutture Dati

Heap binomiali. Oltre alle precedenti operazioni fondamentali degli heap riunibili, sugli heap binomiali definiremo anche le due ulteriori operazioni:

ADT Coda con priorità

1) Codici convoluzionali. 2) Circuito codificatore. 3) Diagramma a stati e a traliccio. 4) Distanza libera. 5) Algoritmo di Viterbi

Esercizi BST - AVL. E. Fachini

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Algoritmi e Strutture Dati

Heap e code di priorità

Algoritmi e Strutture Dati. HeapSort

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

ESERCIZI SULLA TECNICA Greedy

Il vettore e la lista concatenate (o catena) sono due esempi di strutture interne.

Esercizi per il corso di Algoritmi

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

ALGORITMI CORSO DI STUDIO IN INFORMATICA (laurea triennale) UNIVERSITÀ DEGLI STUDI DI CATANIA ANNO ACCADEMICO 2014/15

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Codifica di Huffman e Lempel-Ziv-Welch A L B E R T O B E L U S S I A N N O A C C A D E M I C O /

Algoritmi e Strutture Dati

Introduzione alla codifica entropica

In questa lezione Alberi binari di ricerca: la cancellazione

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Espressioni aritmetiche

Laboratorio di algoritmi e strutture dati

VISITA IL SITO PER ALTRO MATERIALE E GUIDE

Transcript:

Algoritmi Greedy Tecniche Algoritmiche: tecnica greedy (o golosa) Idea: per trovare una soluzione globalmente ottima, scegli ripetutamente soluzioni ottime localmente Un esempio Input: lista di interi che rappresentano il valore di monete disponibili e un intero che rappresenta un resto. Output: una collezione di cardinalità minima di monete la cui somma sia uguale al resto. Input: monete disponibili: 25, 10, 5 e 1; resto da formare: 87 Output: 25+25+25+10+1+1 Osservazione: gli algoritmi greedy non sempre funzionano! Input: monete disponibili: 1,4 e 6 resto da formare: 9 Greedy output: 6 + 1 + 1 + 1 Output ottimale: 4 + 4 + 1 Le scelte ottime a breve non garantiscono di raggiungere una soluzione ottima finale. Algoritmi Greedy - Schema generale 1 Una applicazione classica per lo schema 1 Le appetibilità degli oggetti sono note fin dall inizio e non vengono modificate Greedy1 ({a 1, a 2, a n }) S insieme vuoto ordina gli a i in ordine non crescente di appetibilità for ogni a i nell ordine do if a i può essere aggiunto a S then S S {a i } return S Il problema della selezione di attività Input: S = {1, 2,, n} insieme di attività che devono usare una risorsa in modo esclusivo. Ogni attività i è caratterizzata da un tempo di inizio e da un tempo di fine: [s i, f i ) (s i f i ). Output: insiemechecontieneilmassimonumero di attività mutuamente compatibili. Oggetti: le attività Appetibilità: tempo di fine 1

Greedy-Activity-Selector (n, s, f) 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 11 12 Soluzioni: {1, 5, 9}, {1, 6, 9}, {2, 5, 9}, {2, 6, 9} A insieme vuoto ordina le attività in ordine non decrescente rispetto ai tempi di fine A {1} j 1 for i 2 to n do if s i f j then A A {i} j i return A Complessità: O(n lgn) Ricordiamo che: gli algoritmi greedy non sempre funzionano! Domanda. L algoritmo Greedy-Activity-Selector seleziona sempre un numero massimo di attività? Greedy-Activity-Selector (n, s, f) A insieme vuoto ordina le attività in ordine non decrescente rispetto ai tempi di fine A {1} j 1 {A e` una soluzione ottima rispetto alle attività esaminati} for i 2 to n do if s i f j then A A {i} j i return A {A e` una soluzione ottima} Invariante dettagliato durante il ciclo: esiste un E, insieme massimo di attività compatibili in {1,,n}, tale che: A è un sottoinsieme di E l appetibilità degli elementi di E-A è non superiore a quella degli elementi di A j è l ultima attività aggiunta ad A Dopo il ciclo: A e` un insieme massimo di attività compatibili L invariante viene reso vero dall inizializzazione: Siano<i 1, i 2,...,i k > le attività (in ordine crescente di fine attività) di un insieme massimo di attività compatibili E. Poichèf 1 f i1 s i2 anche <1, i 2,...,i k > è un insieme massimo di attività compatibili. L appetibilita degli elementi di E-{1} è non superiore a quella degli elementi di {1},ej = 1 è l ultima attività scelta. 2

Supponiamo che A=<1, h 2,..., h r > sia un sottoinsieme di E=<1, h 2,..., h r, i r+1,..., i k > (in ordine crescente di fine attività), siaj = h r l ultima attività scelta. Allora f ir+1 s ir+2 se i è l attività selezionata nel corpo del while, f i f ir+1 Perciò <1, h 2,..., h r, i > è un sottoinsieme di un insieme massimo di attività compatibili: <1, h 2,..., h r, i, i r+2,..., i k > l appetibilita degli elementi di E-{1, h 2,..., h r, i} e non superiore a quella degli elementi di {1, h 2,..., h r, i} j = i è l ultima attività scelta. Algoritmi Greedy - Schema generale 2 Se le appetibilità degli oggetti possono essere modificate dalle scelte già fatte. Greedy2 ({a 1, a 2, a n }) S insieme vuoto valuta le appetibilità degli a i while ci sono elementi da scegliere do scegli l a i più appetibile if a i può essere aggiunto a S then S S {a i } aggiorna le appetibilità degli a i return S Una applicazione classica per lo schema 2 Codici di Huffmann (tecnica efficiente per la compressione dei dati) Esempio: Si consideri un alfabeto di 6 caratteri. In un codice a lunghezza fissa servono 3 bit per la loro rappresentazione. Quindi un file di dati di 100.000 caratteri richiede 300.000 bit. Una applicazione classica per lo schema 2 Un codice a lunghezza variabile codifica i simboli che occorrono più di frequente con meno bit può permettere un risparmio anche del 25%. Per esempio: caratteri: a,b,c,d,e,f frequenza: 0.45,0.13,0.12,0.16,0.09,0.05 codice l. fissa: 001,010,011,100,101 codice l. variabile: 0,101,100,111,1101,1100 Codici prefissi: nessuna parola del codice è prefisso di un altra. Con codici prefissi è facile la decodifica in quanto non ci sono ambiguità. Un codice binario può essere rappresentato in modo efficiente con un albero binario in cui le foglie rappresentano i caratteri. 0 1 0 1 0 0 1 0 1 0 1 a b c d e f 3

Un codice ottimo : permette la codifica più possibile compressa può essere rappresentato con un albero binario in cui ogni nodo interno ha sempre due figli e i caratteri più frequenti compaiono ai livelli alti dell albero 0 1 a 0 1 0 c 1 0 1 b d 0 1 f e Se C è l alfabeto, l albero di un codice prefisso ottimo per C ha C - 1nodi interni. A partire dall albero è facile calcolare il numero di bit necessari a codificare un file. Indichiamo con f(c) la frequenza del carattere c nel file con d T (c) il livello della foglia etichettata c nell albero T. Il numero di bit e allora: B(T) = Σ f(c) d T (c) c C L algoritmo di Huffman Input: un insieme C di caratteri e una funzione f che indica la frequenza di ogni carattere in un testo. Output: un codice binario ottimo per la compressione del testo. L algoritmo di Huffman considerare i caratteri in ordine non decrescente di frequenza per ogni carattere creare un albero formato solo da una foglia a partire dai due alberi che hanno frequenza minore costruire un nuovo albero che ha come frequenza la somma delle frequenze degli alberi fusi ripetere la fusione finché si ottiene un unico albero Si può individuare in tale descrizione una strategia greedy: Oggetti: gli alberi Appetibilità: frequenza Poiché gli oggetti vengono modificati e con essi le loro appetibilità, applichiamo lo schema greedy, con qualche modifica per l eventuale aggiornamento delle appetibilità. Huffman ({c 1, c 2, c n }) valuta le appetibilità dei c i while l albero non è unico do scegli i due alberi più appetibili crea l albero fusione dei due aggiorna le appetibilità degli alberi return l albero ottenuto 4

Esempio: caratteri: a,b,c,d,e,f frequenza: 0.45,0.13,0.12,0.16,0.09,0.05 a:45 25 100 55 30 Consideriamo i seguenti oggetti e metodi dati: C: un insieme di C caratteri ogni carattere c e inizialmente rappresentato come una coppia (carattere, frequenza) f[c] denota la frequenza di c c:12 b:13 14 d:16 f:5 e:9 Allocate-Node(): un funzione che restituisce un nuovo nodo di una struttura ad albero le cui foglie conterranno coppie (carattere, frequenza) e i cui nodi interni conterranno la somma delle frequenze contenute nelle foglie del sottoalbero corrispondente f[z] denota la frequenza contenuta nel nodo (foglia o nodo interno) z, left[z] e right[z] denotano il figlio sinistro e destro di z rispettivamente Q è una coda con priorità che memorizza (radici di) alberi la cui priorità è data dal valore di f sarà utilizzata per identificare i due alberi con la frequenza più piccola, da fondere assieme Huffman (C, f) n C Q C for i 1 to n - 1 do z Allocate-Node () x left [z] Extract-min (Q) y right[z] Extract-min (Q) f[z] f[x] + f[y] Insert (Q, z) return Extract-min (Q) {per ottenere un unico albero sono necessarie n-1 fusioni} {due alberi più appetibili e crea l albero fusione} {aggiorna le appetibilità degli alberi} {restituisci l albero ottenuto} Complessita in tempo: O(n lgn) se la coda di priorità è implementata con un heap binario. O(n 2 ) se la coda fosse realizzata con una struttura con inserzione e/o estrazione del minimo lineari 5

Conclusione Tecnica greedy: varie applicazioni: problema del sequenziamento distributore automatico di resto calcolo dei codici di Huffman calcolo del minimo albero ricoprente (algoritmi di Prim, Kruskal, Boruvka) cammini minimi a sorgente singola (algoritmo di Dijkstra) 6