Upload
bianca-papa
View
217
Download
0
Embed Size (px)
Citation preview
1
Algoritmi e Strutture DatiCapitolo 2 - Analisi di algoritmi
Alberto MontresorUniversità di Trento
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
2
Valutare la complessità in tempo
✦Complessità in tempo: cosa serve?
✦Per stimare il tempo impiegato da un programma
✦Per stimare il più grande input gestibile in tempi ragionevoli
✦Per confrontare l'efficienza di algoritmi diversi
✦Per ottimizzare le parti più importanti
✦“Complessità”: “Dimensione” → “Tempo”
✦Dobbiamo definire “dimensione” e “tempo”!
3
Dimensione dell'input
✦Criterio di costo logaritmico:
✦La taglia dell'input è il numero di bit necessari per rappresentarlo
✦Esempio: moltiplicazione di numeri binari lunghi n bit
✦Criterio di costo uniforme
✦La taglia dell'input è il numero di elementi che lo costituiscono
✦Esempio: ricerca minimo in un array di n elementi
✦In molti casi:
✦Possiamo assumere che gli “elementi” siano rappresentati da un numero costante di bit
✦Le due misure coincidono a meno di una costante moltiplicativa
4
Definizione di tempo
✦Tempo = “Wall-clock” time:
✦Il tempo effettivamente impiegato per eseguire un algoritmo
✦Dipende da troppi parametri:
✦bravura del programmatore
✦linguaggio di programmazione utilizzato
✦codice generato dal compilatore
✦processore, memoria (cache, primaria, secondaria)
✦sistema operativo, processi attualmente in esecuzione
✦Dobbiamo considerare un modello astratto
5
Definizione di tempo
✦Tempo = “# operazioni elementari”
✦Quali operazioni possono essere considerate elementari?
✦Esempio: min(A, n)
✦Modello di calcolo: rappresentazione astratta di un calcolatore
✦Astrazione: deve semplificare dettagli, altrimenti è inutile
✦Realismo: deve riflettere la situazione reale
✦“Potenza” matematica:deve permettere di trarre conclusioni “formali” sul costo
6
Da “Wikipedia”Da “Wikipedia”
7
Macchina di TuringMacchina di Turing
…a1 a2D
Meccanismo di controllo
(Programma)
Nastro
Cella
Testina
La macchina:legge il simbolo sotto la testinamodifica il proprio stato (finito) internoscrive un nuovo simbolo nella cellamuove la testina a destra o a sinistraMarcatore della prima
cella
✦Fondamentale nello studio della calcolabilità✦Non adatto per i nostri scopi
✦Livello troppo basso
✦Non sufficientemente realistico
8
Modello RAMModello RAM
✦Random Access Machine (RAM)
✦Memoria:✦Quantità infinita di celle di dimensione finita✦Accesso in tempo costante (indipendente dalla posizione)
✦ Processore (singolo)✦Set di istruzioni elementari simile a quelli reali:
✦somme, addizioni, moltiplicazioni, operazioni logiche, etc. ✦istruzioni di controllo (salti, salti condizionati)
✦Costo delle istruzioni elementari✦Uniforme, ininfluente ai fini della valutazione (come vedremo)
9
Tempo di calcolo di min()
✦Ogni istruzione richiede un tempo costante per essere eseguita
✦Costante diversa da istruzione a istruzione
✦Ogni istruzione viene eseguita un certo # di volte, dipendente da n
10
Tempo di calcolo di binarySearch()
✦Il vettore viene suddiviso in due parti
11
Tempo di calcolo di binarySearch()
✦Assunzioni
✦Per semplicità, n =2k è una potenza di 2
✦L’elemento cercato non è presente (caso pessimo)
✦Ad ogni suddivisione, scegliamo sempre la parte DX di dimensione n/2(caso pessimo)
✦Due casi
✦Equazione di ricorrenza
12
Tempo di calcolo di binarySearch()
✦Soluzione ricorrenza per sostituzione
✦Ricordate che n = 2k ⇒ k = log n
13
Analisi di algoritmi
✦Analisi del caso pessimo ✦La più importante✦Il tempo di esecuzione nel caso peggiore è un limite superiore al tempo di esecuzione per qualsiasi input✦Per alcuni algoritmi, il caso peggiore si verifica molto spesso
✦Es.: ricerca di dati non presenti in un database✦Il caso medio è spesso cattivo quanto quello peggiore
✦Vedi insertionSort()✦Analisi del caso medio
✦Difficile in alcuni casi: cosa si intende per “medio”?✦Distribuzione uniforme
✦Analisi del caso ottimo✦Può avere senso se l’input ha una distribuzione particolare
14
Limiti asintotici superiori e inferiori
15
Algoritmi: primi esempiAlgoritmi: primi esempi
✦Nei prossimi lucidi, vedremo alcuni semplici algoritmi
✦Somme e moltiplicazioni (!)
✦Ordinamento
✦Vogliamo riflettere su:
✦In alcuni casi, si può migliorare quanto si ritiene “normale”
✦In altri casi, è impossibile fare di meglio
✦Qual è il rapporto fra un problema computazionale e l'algoritmo?
2 X 2 = 5
16
Moltiplicare numeri complessi
✦Ricordate come moltiplicare due numeri complessi?
✦(a+bi)(c+di) = [ac – bd] + [ad + bc]i
✦Input: a, b, c, d Output: ac-bd, ad+bc
✦Modello di calcolo:
✦Costo moltiplicazione: 1, costo addizione/sottrazione: 0.01
✦Domande
✦Quanto costa l'algoritmo “banale” dettato dalla definizione?
✦Potete fare di meglio? (Soluzione di Gauss)
✦Qual è il ruolo del modello di calcolo?
17
Moltiplicare numeri complessiMoltiplicare numeri complessi
✦Questioni aperte...
✦Si può fare di meglio?
✦Oppure, è possibile dimostrare che non si può fare di meglio?
✦Alcune riflessioni
✦In questo modello “estremamente semplice”, effettuare 3 moltiplicazioni invece di 4 risparmia il 25% del costo
✦Esistono contesti in cui effettuare 3 moltiplicazioni invece di 4 può produrre un risparmio maggiore
18
Sommare numeri binariSommare numeri binari
✦Algoritmo elementare della somma - sum()
✦richiede di esaminare tutti gli n bit
✦costo totale cn (c ≡ costo per sommare tre bit e generare riporto)
✦Domanda
✦Esiste un metodo più efficiente?
* * * * * * * * * * * * * * ** * * * * * * * * * * * * * *
+* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
19
Moltiplicare numeri binariMoltiplicare numeri binari
* * * * * * * * * * * * * *
* * * * * * ** * * * * * *
* * * * * * ** * * * * * ** * * * * * *
* * * * * * * * * * * * * *
x
n2
✦Algoritmo “elementare” del prodotto - prod()
20
Moltiplicare numeri binari
✦Confronto fra i costi di esecuzione
✦Somma: Tsum(n) = c1n
✦Prodotto: Tprod(n) = c2n2 + c3n
✦Si potrebbe erroneamente concludere che...
✦Il problema della moltiplicazione è inerentemente più costoso del problema dell'addizione
✦“Conferma” la nostra esperienza
21
Moltiplicare numeri binari
✦ Confronto fra problemi
✦Per provare che il problema del prodotto è più costoso del problema della somma, dobbiamo provare che non esiste una soluzione in tempo lineare per il prodotto
✦Abbiamo confrontato gli algoritmi, non i problemi
✦A parità di dimensione dell'input:l'algoritmo di somma è più efficiente dell'algoritmo del prodotto
✦Questione aperta se esista un algoritmo in tempo lineareper il prodotto
✦Esiste comunque la possibilità di migliorare
22
Moltiplicare numeri binariMoltiplicare numeri binari
✦Un metodo algoritmico: divide-et-impera✦Divide: dividi il problema in sottoproblemi di dimensioni inferiori✦Impera: risolvi i sottoproblemi in maniera ricorsiva✦Combina: unisci le soluzioni dei sottoproblemi in modo da ottenere la risposta del problema principale
✦Moltiplicazione ricorsiva✦X = a 2n/2 + b ✦Y = c 2n/2 + d✦XY = ac 2n + (ad+bc) 2n/2 + bd✦Nota:
✦Moltiplicare per 2t ≡ shift di t posizioni, in tempo lineare✦Sommare due vettori di bit anch’esso in tempo lineare
a b
c d
23
Moltiplicare numeri binariMoltiplicare numeri binari
✦Algoritmo pdi(): prodotto divide-et-impera
✦Costo della procedura pdi()
24
Svolgere la ricorsioneSvolgere la ricorsione
25
Moltiplicare numeri binari
✦Confronto fra algoritmi: tutto questo lavoro per niente?
✦Tprod(n) = O(n2)
✦Tpdi(n) = O(n2)
✦La versione ricorsiva chiama se stessa 4 volte.
✦X = a 2n/2 + b
✦Y = c 2n/2 + d
✦XY = ac 2n + (ad+bc) 2n/2 + bd
✦Domanda
✦E' possibile ridurre il numero di moltiplicazioni?
26
Moltiplicazione di Karatsuba (1962)
✦Gaussified-product (Karatsuba 1962)
✦A1 = ac
✦A3 = bd
✦m = (a+b)(c+d)=ac+ad+bc+bd
✦A2 = m−A1−A3=ad+bc
27
Moltiplicare numeri binariMoltiplicare numeri binari
✦Gaussified-product (Karatsuba 1962)
✦Esempio: ✦Tpdi(106) =1012
✦Tkaratsuba(106) = 3 10⋅ 9
✦Conclusioni
✦L'algoritmo “naif” non è sempre il migliore...
✦... può esistere spazio di miglioramento...
✦... a meno che non sia possibile dimostrare il contrario!
28
Ordinamento
✦Problema dell'ordinamento
✦Input: una sequenza A di n numeri <a1, a2, ..., an>
✦Output: una permutazione B=<b1, b2, ..., bn> di A tale per cuib1 ≤ b2 ≤ ... ≤ bn
✦Algoritmo “naif”
✦Generare tutte le permutazioni (n!) e verificare in tempo O(n)se sono ordinate
✦Costo totale: O(n n!)
29
Selection sort
✦Complessità (caso medio, pessimo, ottimo)
30
Insertion Sort
✦Algoritmo efficiente per ordinare piccoli insieme di elementi
✦Come ordinare una sequenza di carte da gioco “a mano”
31
Insertion Sort - AnalisiInsertion Sort - Analisi
✦Per questo algoritmo:
✦Il costo di esecuzione non dipende solo dalla dimensione...
✦ma anche dalla distribuzione dei dati in ingresso
✦Domande
✦Qual è il costo nel caso l'array sia già ordinato?
✦Qual è il costo nel caso l'array sia ordinato in ordine inverso?
✦Cosa succede “in media”?✦Informalmente
32
Merge Sort
✦Insertion Sort
✦E' basato su un approccio incrementale (A[1...j-1] ordinato, aggiungi A[j])
✦Merge Sort
✦E' basato sulla tecnica divide-et-impera vista in precedenza
✦Divide:✦Dividi l'array di n elementi in due sottovettori di n/2 elementi
✦Impera:✦Chiama MergeSort ricorsivamente su i due sottovettori
✦Combina:✦Unisci (merge) le due sequenze ordinate
33
Merge Sort
✦Il nucleo di Merge Sort è nel passo combina (merge)
✦merge(A, primo, ultimo, mezzo)✦A è un array di lunghezza n✦primo, ultimo, mezzo indici tali per cui
1 ≤ primo ≤ mezzo < ultimo ≤ n
✦La procedura merge() suppone che i sottovettori A[primo...mezzo] e A[mezzo+1...ultimo] siano ordinati
✦I due vettori vengono fusi in un unico sottovettore ordinato A[primo...ultimo]
✦Qual è l'idea?
✦Fondere i due sottovettori “sfruttando” il fatto che sono ordinati
34
Merge SortMerge Sort
35
Merge Sort
✦Come funziona merge():
A B
1 5 7 + 2 4 6
5 7 + 2 4 6 1
5 7 + 4 6 1 2
5 7 + 6 1 2 4
7 + 6 1 2 4 5
7 + 1 2 4 5 6
+ 7 1 2 4 5 6
1 2 4 + 5 6 7 ✦Domanda
✦ Costo computazionale di merge()
36
Merge SortMerge Sort
✦Programma completo
✦Chiama ricorsivamente se stesso e usa merge() per unire i risultati
✦Caso base: sequenze di lunghezza ≤ 1 sono già ordinate
37
Merge SortMerge Sort
38
Analisi di Merge-Sort
✦Una assunzione semplificativa
✦n=2k, ovvero l'altezza dell'albero di sottodivisioni è esattamente k
✦tutti i sottovettori hanno dimensioni che sono potenze esatte di 2
✦Costi di Merge Sort
✦Risoluzione della ricorrenza
✦Domanda
✦Ricavare questo risultato svolgendo l’equazione di ricorrenza
39
Confronto fra ordini di grandezza
40
Limitazioni inferiori e algoritmi ottimi
✦Dato un problema
✦Se trovate un algoritmo A con complessità O(g(n)), avete stabilito un limite superiore alla complessità del problema - g(n)
✦Se dimostrate che qualunque algoritmo per il problema deve avere complessità Ω(f(n)), avete stabilito un limite inferiore all complessità del problema - f(n)
✦Se f(n)=g(n), allora A è un algoritmo ottimo
41
Limitazioni inferiori - tecniche
✦Dimensione dei dati✦Se un problema ha in ingresso n dati e richiede di esaminarli tutti, allora una limitazione inferiore della complessità è Ω(n)✦Esempio: sommare due numeri binari
✦Eventi contabili✦Se un problema richiede che un certo evento sia ripetuto almeno n volte, allora una limitazione inferiore della complessità è Ω(n)✦Esempio: ricerca del minimo richiede almeno n-1 confronti
✦Oracolo✦Se un oracolo, utilizzando una certa regola ignota all’algoritmo, “divina” ad ogni opportunità la situazione più sfavorevole, allora combattendo contro di esso si può individuare una limitazione inferiore✦Esempio: merge()
42
Limitazioni inferiori
✦Caveat emptor!
✦Le tecniche illustrate sono semplici, ma nascondono sottigliezze
✦Fare attenzioni alle assunzioni di base✦Ricerca in vettore ordinato: O(log n), non O(n)!✦Ricerca del minimo in vettore ordinato: O(1), non O(n)!
✦Esempio più complesso: ordinamento
✦Limitazione inferiore Ω(n) - perché?
✦Limitazione superiore O(n log n)
✦Possiamo “restringere” questo scarto?
✦Più avanti mostremo...
43
Limitazioni inferiori
✦Caveat emptor!✦Le tecniche illustrate sono semplici, ma nascondono sottigliezze✦Fare attenzioni alle assunzioni di base
✦Ricerca in vettore ordinato: O(log n), non O(n)!✦Ricerca del minimo in vettore ordinato: O(1), non O(n)!
✦Esempio più complesso: ordinamento✦Limitazione inferiore Ω(n) - perché?✦Limitazione superiore O(n log n)✦Possiamo “restringere” questo scarto?✦Più avanti mostreremo...
✦che Merge Sort è ottimo, in quanto è possibile dimostrare che Ω(n log n) è un limite inferiore all’ordinamento per gli algoritmibasati su confronti
44
Counting Sort
✦Come funziona:
✦I numeri da ordinare sono compresi in un range [1..k]
✦Costruire un array B[1..k] che conta il numero di volte che compare un valore in [1..k]
✦Ricollocare i valori così ottenuti in A
45
Counting Sort
✦Complessità
✦O(n+k)
✦Se k è O(n), allora la complessità è O(n)
✦Discussione su limite inferiore
✦Counting Sort non è basato su confronti
✦Abbiamo cambiato le condizioni di base
✦Se k è O(n3), questo algoritmo è peggiore di tutti quelli visti finora
46
Tecniche di analisi
✦Per risolvere le relazioni di ricorrenza
✦Analisi per sostituzione (accennata)
✦Analisi per livelli (accennata)
✦Relazioni di ricorrenza comuni✦Ricorrenze lineari di ordine costante✦Ricorrenze lineari con partizione bilanciata
✦Analisi per tentativi
✦Alla lavagna!
47
Analisi ammortizzata
Si considera il tempo richiesto per eseguire, nel caso pessimo, un'intera sequenza di operazioni
✦Sequenza
✦Operazioni costose e meno costose
✦Se operazioni più costose sono poco frequenti, allora il loro costo può essere ammortizzato dalle operazioni meno costose
✦Importante differenza
✦Analisi del caso medio: ✦basata su probabilità, su singola operazione
✦Analisi ammortizzata: ✦deterministica, su operazioni multiple, caso pessimo
48
Metodi per l'analisi ammortizzata
✦Metodo dell'aggregazione
✦Si calcola la complessità O(f(n)) per eseguire n operazioni in sequenza nel caso pessimo
✦Il costo ammortizzato di una singola operazione è O(f(n)/n)
✦Metodo degli accantonamenti (o del contabile)
✦Alle operazioni vengono assegnati costi ammortizzati che possono essere maggiori/minori del loro costo effettivo
✦Provare che la somma dei costi ammortizzati è unlimite superiore al costo effettivo
✦Metodo del potenziale
✦Lo stato del sistema viene descritto tramite differenze di potenziale
✦Tecnica derivata dalla fisica
49
EsempioEsempio
✦Contatore binario
✦Implementiamo un contatore binario di k bit con un array di bit
✦Un numero binario x registrato in A ha il bit meno significativo in A[0] e il più significativo in A[k-1] per cui:
✦Supponiamo che A venga usato per contare a partire da x=0 usando l’operazione di incremento
50
Esempio - ContatoreEsempio - Contatore
8 0 0 0 0 1 0 0 0 15
9 0 0 0 0 1 0 0 1 16
10 0 0 0 0 1 0 1 0 18
14 0 0 0 0 1 1 1 0 25
13 0 0 0 0 1 1 0 1 23
11 0 0 0 0 1 0 1 1 19
12 0 0 0 0 1 1 0 0 22
15 0 0 0 0 1 1 1 1 26
16 0 0 0 1 0 0 0 0 31
x A[7] A[6] A[5] A[4] A[3] A[2] A[1] A[0] costo
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 1
2 0 0 0 0 0 0 1 0 3
3 0 0 0 0 0 0 1 1 4
4 0 0 0 0 0 1 0 0 7
5 0 0 0 0 0 1 0 1 8
6 0 0 0 0 0 1 1 0 10
7 0 0 0 0 0 1 1 1 11
51
Esempio - Contatore
✦Analisi “grossolana”
✦Una singola operazione di incremento richiede tempo O(k) nel caso pessimo
✦Limite superiore O(nk) per una sequenza di n incrementi
✦Considerazioni per un'analisi più stretta
✦Possiamo però osservare che il tempo necessario ad eseguire l’intera sequenza è proporzionale al numero di bit che vengono modificati
✦Quanti bit vengono modificati?
52
Esempio: funzionamentoEsempio: funzionamento
8 0 0 0 0 1 0 0 0 15
9 0 0 0 0 1 0 0 1 16
10 0 0 0 0 1 0 1 0 18
14 0 0 0 0 1 1 1 0 25
13 0 0 0 0 1 1 0 1 23
11 0 0 0 0 1 0 1 1 19
12 0 0 0 0 1 1 0 0 22
15 0 0 0 0 1 1 1 1 26
16 0 0 0 1 0 0 0 0 31
x A[7] A[6] A[5] A[4] A[3] A[2] A[1] A[0] costo
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 1
2 0 0 0 0 0 0 1 0 3
3 0 0 0 0 0 0 1 1 4
4 0 0 0 0 0 1 0 0 7
5 0 0 0 0 0 1 0 1 8
6 0 0 0 0 0 1 1 0 10
7 0 0 0 0 0 1 1 1 11
53
Esempio – Metodo dell'aggregazione
✦Dalla simulazione si vede che:
✦A[0] viene modificato ad ogni incremento del contatore,
✦A[1] viene modificato ogni 2 incrementi,
✦A[2] viene modificato ogni 4 incrementi....✦In generale,
✦A[i] viene modificato ogni 2i incrementi✦Quindi:
✦Costo aggregato:
✦Costo ammortizzato: 2n/n = 2 = O(1)
54
Metodo degli accantonamenti o del contabile
✦Si assegna un costo ammortizzato distinto(*) ad ognuna delle operazioni possibili
✦Il costo ammortizzato può essere diverso dal costo effettivo
✦Le operazioni meno costose vengono caricate di un costo aggiuntivo detto credito
✦costo ammortizzato = costo effettivo + credito prodotto
✦I crediti accumulati saranno usati per pagare le operazioni più costose✦costo ammortizzato = costo effettivo – credito consumato
(*) Nell'aggregazione, abbiamo calcolato costo ammortizzato costante
55
Come assegnare costi ammortizzati?Come assegnare costi ammortizzati?
✦Lo scopo è:
✦dimostrare che la somma dei costi ammortizzati ai è un limite superiore ai costi effettivi ci:
✦dimostrare che il valore così ottenuto è “poco costoso”
✦Alcuni punti da ricordare
✦La dimostrazione deve essere valida per tutte le sequenze di input (caso pessimo)
✦Il credito è espresso dalla seguente formula e quindi è positivo
56
Esempio – Metodo degli accantonamentiEsempio – Metodo degli accantonamenti
✦Costi
✦Costo effettivo dell'operazione increment(): d (dove d è il numero di bit che cambiano valore)
✦Costo ammortizzato dell'operazione increment(): 2✦1 per cambio del bit da 0 a 1 (costo effettivo)✦1 per il futuro cambio dello stesso bit da 1 a 0
✦Ne segue che: ✦in ogni istante, il credito è pari al numero di bit 1 attualmente presenti
✦Costo totale ammortizzato: O(n)
57
Metodo del potenzialeMetodo del potenziale
✦Come funziona
✦Si associa alla struttura dati D una funzione di potenziale Φ(D)
✦Requisiti:✦le operazioni meno costose devono incrementare Φ(D)✦le operazioni più costose devono decrementare Φ(D)
✦Costo ammortizzato:
✦sommatoria del costo effettivo e della variazione di potenziale
58
Metodo del potenzialeMetodo del potenziale
✦Il costo ammortizzato di una sequenza di n operazioni è:
✦Se la variazione di potenziale Φ(Dn)-Φ(D0) è non negativa:
✦il costo ammortizzato A è un limite superiore al costo reale
✦Altrimenti:
✦la variazione di potenziale negativa deve essere compensata da un aumento adeguato del costo ammortizzato delle operazioni.
59
Esempio 2 – Metodo del potenzialeEsempio 2 – Metodo del potenziale
✦Scegliamo come funzione potenziale Φ(A) il numero bit 1 presenti nel contatore.
✦Caso 1: Partendo dal valore 0
✦All'inizio, zero bit accesi → Φ(A0) = 0
✦Alla fine, Φ(An) ≥ 0 → la differenza di potenziale è non negativa
operazione costo differenza di costo effettivo potenziale ammortizzato
add 1+t -t+1 2
60
EserciziEsercizi
✦Esercizio 1
✦Dato un array A[1..n] di interi e un intero v, descrivere un algoritmo che determini se esistono due elementi in A la cui somma è esattamente v
✦Esercizio 2
✦Dato un array A[1..n] di interi positivi, descrivere un algoritmo O(n) che determini se esistono due elementi in A la cui somma è esattamente 17
✦Esercizio 3
✦Siano date n monete d'oro, tutte dello stesso peso tranne una contraffatta che pesa meno, ed una bilancia con due piatti.Disegnare un algoritmo per individuare la moneta contraffatta in al più log n pesate.