Algoritmi e Strutture Dati
Capitolo 2 - Analisi di algoritmi
Alberto Montresor
Università 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.
© Alberto Montresor
1
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”!
✦
© Alberto Montresor
2
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
✦
© Alberto Montresor
3
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
✦
© Alberto Montresor
4
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
✦
© Alberto Montresor
5
Da “Wikipedia”
© Alberto Montresor
6
Macchina di Turing
Testina
D a1 a2
…
Meccanismo di controllo
(Programma)
Nastro
Cella
Marcatore della prima
cella
La macchina:
legge il simbolo sotto la testina
modifica il proprio stato (finito) interno
scrive un nuovo simbolo nella cella
muove la testina a destra o a sinistra
Fondamentale nello studio della calcolabilità
✦
Non adatto per i nostri scopi
✦Livello troppo basso
✦
Non sufficientemente realistico
✦
© Alberto Montresor
7
Modello 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)
✦
© Alberto Montresor
8
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
✦
© Alberto Montresor
9
Tempo di calcolo di binarySearch()
Il vettore viene suddiviso in due parti
✦
© Alberto Montresor
10
Tempo di calcolo di binarySearch()
Assunzioni
k
✦Per semplicità, assumiamo n potenza di 2: n =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
✦
© Alberto Montresor
11
Tempo di calcolo di binarySearch()
Soluzione ricorrenza per sostituzione
k
✦Ricordate che n = 2 ⇒ k = log n
✦
© Alberto Montresor
12
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
✦
© Alberto Montresor
13
Limiti asintotici superiori e inferiori
© Alberto Montresor
14
Torniamo alla matematica elementare...
Nei prossimi lucidi, vedremo alcuni
semplici algoritmi
✦Somme e moltiplicazioni (!)
2X2=5
✦
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?
✦
© Alberto Montresor
15
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?
✦
© Alberto Montresor
16
Moltiplicare 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
✦
© Alberto Montresor
17
Sommare 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?
✦
11101111111111
1 0 1 1 0 0 1 1 0 1 1 0 1 1 1+
111101101101011
1101010100100010
© Alberto Montresor
18
Moltiplicare numeri binari
Algoritmo “elementare” del prodotto - prod()
✦
n2
© Alberto Montresor
*******
*******
*******
*******
*******
*******
*******
*******
*******
x
19
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
✦
© Alberto Montresor
20
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 studiato alle elementari è più efficiente dell'algoritmo
del prodotto studiato alle elementari
✦
Nel 1960, Kolmogorov enunciò in una conferenza che l’algoritmo per la
moltiplicazione era ottimo, ovvero non si può fare meglio di così
✦
Una settimana dopo, fu provato il contrario!
✦
© Alberto Montresor
21
Moltiplicare 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
n/2 + b
✦X = a 2
✦
Y = c 2n/2 + d X
✦
XY = ac 2n + (ad+bc) 2n/2 + bd
X
a
b
Y
c
d
✦
Nota:
✦
Moltiplicare per 2t ≡ shift di t posizioni, in tempo lineare
✦
Sommare due vettori di bit anch’esso in tempo lineare
✦
© Alberto Montresor
22
Moltiplicare numeri binari
Algoritmo pdi(): prodotto divide-et-impera
✦
Costo della procedura pdi()
✦
© Alberto Montresor
23
Svolgere la ricorsione
0
nn
1
2
n/2
n/2
n/4
n/4
i
+
n/4
n/4
n/2
n/4
n/2 +
n/4
n/4
+ n/2
n/2
n/4
n/4
n/4
n/2
n/2
n/4
n/4
n/4
n/4
n/4
n/4
i
Livello i: 4i istanze
n/2
Leveldii dimensione
is the sum of
4i copies of n/2i
..........................
log2 n
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+
1+1+1+1+1+1+1+1
............................................................................
.......................
© Alberto Montresor
24
Moltiplicare numeri binari
Confronto fra algoritmi: tutto questo lavoro per niente?
2
✦Tprod(n) = O(n )
✦
Tpdi(n) = O(n2)
✦
La versione ricorsiva chiama se stessa 4 volte.
n/2 + b
✦X = a 2
✦
Y = c 2n/2 + d
✦
XY = ac 2n + (ad+bc) 2n/2 + bd
✦
Domanda
✦E' possibile ridurre il numero di moltiplicazioni?
✦
© Alberto Montresor
25
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
✦
© Alberto Montresor
26
Moltiplicare numeri binari
Gaussified-product (Karatsuba 1962)
✦
Esempio:
✦
Tpdi(106) =1012
✦
Tkaratsuba(106) = 3⋅109
✦
Conclusioni
✦L'algoritmo “naif” non è sempre il migliore...
✦
... può esistere spazio di miglioramento...
✦
... a meno che non sia possibile dimostrare il contrario!
✦
© Alberto Montresor
27
E non finisce qui...
1963: Toom-Cook
log 5/log 3) ~ O(n1.465)
✦Noto come algoritmo Toom3, ha complessità O(n
✦
Karatsuba = Toom2
✦
Moltiplicazione normale = Toom1
✦
1971: Schönhage–Strassen
✦Complessità O(n log n (log log n))
✦
Basato su Fast Fourier Transforms
✦
2007: Martin Fürer
O(log* n))
✦Complessità O(n log n 2
✦
Limite inferiore:
✦Ω(n log n) (congettura)
✦
© Alberto Montresor
28
GNU Multiple Precision Arithmetic Library
Utilizzata da Mathematica, Maple, etc.Utilizza Schönhage–Strassen quando
l’input è più lungo di k parole di 64 bit, con k compreso fra 1728 e 11520 a
seconda dell’architettura
✦
© Alberto Montresor
29
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 cui
b1 ≤ b2 ≤ ... ≤ bn
✦
Algoritmo “naif”
✦Generare tutte le permutazioni (n!) e verificare in tempo O(n)
se sono ordinate
✦
Costo totale: O(n n!)
✦
© Alberto Montresor
30
Selection sort
Complessità (caso medio, pessimo, ottimo)
✦
© Alberto Montresor
31
Insertion Sort
Algoritmo efficiente per ordinare piccoli insiemi di elementi
✦
Come ordinare una sequenza di carte da gioco “a mano”
✦
© Alberto Montresor
32
Insertion 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 il vettore sia già ordinato?
✦
Qual è il costo nel caso il vettore sia ordinato in ordine inverso?
✦
Cosa succede “in media”?
✦
Informalmente
✦
© Alberto Montresor
33
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
✦
© Alberto Montresor
34
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
✦
© Alberto Montresor
35
Merge Sort
© Alberto Montresor
36
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()
✦
© Alberto Montresor
37
Merge Sort
Programma completo
✦Chiama ricorsivamente se stesso e usa merge() per unire i risultati
✦
Caso base: sequenze di lunghezza ≤ 1 sono già ordinate
✦
© Alberto Montresor
38
Merge Sort
Partizionamento
Merge
© Alberto Montresor
39
Analisi di Merge-Sort
Una assunzione semplificativa
k
✦n=2 , 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
✦
© Alberto Montresor
40
Confronto fra ordini di grandezza
© Alberto Montresor
41
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 alla complessità
del problema - f(n)
✦
Se f(n)=g(n), allora A è un algoritmo ottimo
✦
© Alberto Montresor
42
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()
✦
© Alberto Montresor
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 mostremo...
✦
© Alberto Montresor
44
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 algoritmi
basati su confronti
✦
© Alberto Montresor
45
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
✦
© Alberto Montresor
46
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
✦
© Alberto Montresor
47
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!
✦
© Alberto Montresor
48
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
✦
© Alberto Montresor
49
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 è un
limite superiore al costo effettivo
✦
Metodo del potenziale
✦Lo stato del sistema viene descritto tramite differenze di potenziale
✦
Tecnica derivata dalla fisica
✦
© Alberto Montresor
50
Esempio
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
✦
© Alberto Montresor
51
Esempio - Contatore
x
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A[7] A[6] A[5] A[4] A[3] A[2] A[1] A[0]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
© Alberto Montresor
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
costo
0
1
3
4
7
8
10
11
15
16
18
19
22
23
25
26
31
52
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?
✦
© Alberto Montresor
53
Esempio: funzionamento
x
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A[7] A[6] A[5] A[4] A[3] A[2] A[1] A[0]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
© Alberto Montresor
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
costo
0
1
3
4
7
8
10
11
15
16
18
19
22
23
25
26
31
54
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,
i
✦A[i] viene modificato ogni 2 incrementi
✦
Quindi:
✦Costo aggregato:
✦
Costo ammortizzato: 2n/n = 2 = O(1)
✦
© Alberto Montresor
55
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
© Alberto Montresor
56
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
✦
© Alberto Montresor
57
Esempio – 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)
✦
© Alberto Montresor
58
Metodo 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
✦
© Alberto Montresor
59
Metodo 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.
✦
© Alberto Montresor
60
Esempio 2 – Metodo del potenziale
Scegliamo come funzione potenziale Φ(A) il numero bit 1 presenti nel
contatore
✦
operazione
add
costo
effettivo
1+t
differenza di
potenziale
-t+1
costo
ammortizzato
2
Nota:
✦t è il numero di bit 1 incontrati a partire dal meno significativo, prima di
incontrare un bit 0
✦
Partendo dal valore 0
✦All'inizio, zero bit accesi → Φ(A0) = 0
✦
Alla fine, Φ(An) ≥ 0 → la differenza di potenziale è non negativa
✦
© Alberto Montresor
61
Esercizi
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.
✦
© Alberto Montresor
62
Scarica

non