21/10/2013
Algoritmi e strutture di dati 2
Paola Vocca
Lezione 1: Divide et Impera
Lezione1- Divide et impera
1
Paradigma del divide et impera
Strutturato in tre fasi.
Sia Π( )istanza di dimensione di un problema
computazionale Π(dove è immediato il caso base)
• decomposizione: identifica un numero di sottoproblemi Π( ), Π( ), … , Π( ),dove < • ricorsione: per = , , … , ,ottieni ricorsivamente la
soluzione per ciascun Π( )sino ad ottenere
problemi di dimensioni tali da poter essere risolti
direttamente ( < , con costante)
• ricombinazione: ricava la soluzione per Π( )da
quelle ottenute per Π
,Π
,…,Π
.
Lezione1- Divide et impera
2
1
21/10/2013
Paradigma del divide et impera:
Complessità
• Sia ( )il costo di dividere il problema Πnei
sottoproblemi Π( ), Π( ), … , Π( ).
• Sia ( ) il costo il costo di combinare i risultati dei
sottoproblemi per ottenere il risultato del problema Π.
• Siano ( )i costi delle soluzioni dei sottoproblemi.
• Sia il costo del problema base
• Il costo ( )del problema Πè dato da:
≤
=
+
+
( )
>
Risolvere un’equazione di ricorrenza
Lezione1- Divide et impera
3
Equazioni di ricorrenza
•
•
•
Una ricorrenza è un’equazione o una diseguaglianza che
descrive una funzione in termini del suo valore su valori inferiori.
E’ relativamente semplice esprimere la complessità con una
relazione di ricorrenza. Può essere però piuttosto complicato
risolvere la relazione di ricorrenza.
Esistono diversi metodi per la risoluzione di equazioni di ricorrenza
o Metodo Iterativo:
• Si itera la regola induttiva di ( )in termini di e del caso base.
• Richiede manipolazione delle somme
o Metodo di Sostituzione
• Si ipotizza una possibile soluzione
• Si sostituisce l’ipotetica soluzione nei casi base e induttivo
• Si dimostra la correttezza della ipotesi tramite induzione
matematica
o Metodo Principale (Master Theorem)
• Fornisce limiti sulle ricorrenze della forma
( )=
( /!) + "(# )
Lezione1- Divide et impera
4
2
21/10/2013
Equazioni di ricorrenza negli algoritmi ricorsivi
• Una naturale applicazione delle equazioni di ricorrenza
è data dalle funzioni ricorsive
fact(int n){
if n <= 1 then
return 1 /* Caso Base
else
return n*fact(n-1) /* Passo Induttivo
Lezione1- Divide et impera
5
Assunzioni
Θ(1)
n =1

T ( n) = 
2T (n / 2) + Θ( n) n > 1
• Funzioni con argomenti interi
Θ (1)

T (n) = 
T (  n / 2  ) + T (  n / 2  ) + Θ ( n )
n =1
n >1
• Condizioni al contorno:
o trascurate in quanto per sufficientemente piccolo il tempo
di esecuzione è costante
o Al variare delle condizioni al contorno cambia la soluzione
generalmente di un fattore costante
T ( n ) = 2T ( n / 2 ) + Θ ( n )
Lezione1- Divide et impera
6
3
21/10/2013
Il metodo iterativo (1)
Base: ( ) = Induzione: ($) = ! + ($ − )
Sostituire ad $i valori ,
ottiene il caso base
I.
1.
2.
3.
− ,
− … finché si
( ) = ! + ( − )sostituire $ con
( − ) = ! + ( − )sostituire $ con
( − ) = ! + ( − ))sostituire $ con
n-1. ( ) = ! + ( ) sostituire $ con −
−
noto
Lezione1- Divide et impera
7
Il metodo iterativo (2)
Sostituire ( − ), ( − ) …fino al caso base e
sostituirlo.
II.
( ) = ! + ( − ) =
! + ! + ( − ) = ∗ ! + ( − ) =
! + ! + ! + ( − )) = ) ∗ ! + ( − )) =
! + ! + ! + ! + − + = + ∗ ! + − + = …… … …
•
•
III.
=
,
!+
=
Inserire il caso base
-( ) = ( − 1). + /
−
∗ ! + ( )
Valutare l’espressione O-grande associata
•
-( ) = . ∗ − . + / = 0( )
Lezione1- Divide et impera
8
4
21/10/2013
Il metodo iterativo: Fattoriale
fact(int n){
if n <= 1 then
return 1 /* Caso Base
else
return n*fact(n-1) /* Passo Induttivo
Equazione di ricorrenza
Lezione1- Divide et impera
9
Il metodo iterativo: Fattoriale
• Complessità di fact
o Caso Base:
-(0) = 0(1)
-(1) = 0(1)
o Caso Induttivo:
0 1 + max 0 1 + -( − 1)
0 1 + - − 1 567 > 1
o Per il fattoriale, l’analisi risulta:
= 0( )
Lezione1- Divide et impera
10
5
21/10/2013
Il metodo iterativo: Esempio
-( )
=
3-
3 39-
27-
8
9
8
:;
+
8
=
+9 +
=
8
+
9
:;
8
?
+ :;
;9
……..
+
+
=
9
=
=
+
Quando ci si ferma?
Lezione1- Divide et impera
11
Il metodo iterativo: Esempio
• Ci si ferma quando
+
=
⇒ > log + <
+
)
+
+
D
E
+ F
E+
+ ⋯ + ) log +
H( )
Contiene una serie geometrica, che è del tipo
Lezione1- Divide et impera
12
6
21/10/2013
Il metodo iterativo: Esempio
• La serie geometrica converge, quando |x|<1, a
Lezione1- Divide et impera
13
Metodo iterativo: Alberi di ricorrenza
•
•
Gli alberi di ricorrenza rappresentano un modo
conveniente per visualizzare i passi di sostituzione
necessari per risolvere una ricorrenza col Metodo
Iterativo.
Utili per semplificare i calcoli ed evidenziare le
condizioni limite della ricorrenza
Lezione1- Divide et impera
14
7
21/10/2013
Metodo iterativo: Alberi di ricorrenza
•
Esempio: T(n) = 2T(n/2) + n2
Lezione1- Divide et impera
15
Metodo iterativo: Alberi di ricorrenza
•
Esempio: ( ) = ( / )+ Lezione1- Divide et impera
16
8
21/10/2013
Metodo iterativo: Alberi di ricorrenza
•
Esempio: T(n) = 2T(n/2) + n2
Lezione1- Divide et impera
17
Metodo iterativo: Alberi di ricorrenza
Lezione1- Divide et impera
18
9
21/10/2013
Metodo iterativo: Alberi di ricorrenza
• Importante focalizzarsi su due parametri
o il numero di volte in cui la ricorrenza deve essere iterata
prima di giungere alla condizione limite (o base)
o la somma dei termini che compaiono ad ogni livello della
iterazione.
Lezione1- Divide et impera
19
Metodo di sostituzione
•
•
•
•
Tentare uno schema di soluzione
Usare l’induzione matematica per trovare le costanti e
mostrane la correttezza
Utilizzato per i limiti superiore o inferiore
Esempio:
T (n) = 2T ( n / 2 ) + n
Provare la soluzione T ( n ) = O ( n log n )
Il metodo consiste nel provare che T ( n ) ≤ cn log n dove / è una costante positiva
T (n) ≤ 2(c n / 2 log( n / 2 )) + n ≤ cn log n / 2 + n
= cn log n − cn log 2 + n
= cn log n − cn + n
≤ cn log n
perc ≥ 1
Verificare che la soluzione vale per le condizioni al contorno T(1)=1
Purtroppo non si può scegliere c sufficientemente grande perchè T (1 ) ≤ c log 1 = 0
Poichè la notazione asintotica prevede T ( n ) ≤ cn log n per n ≥ n 0 per n 0 cost.
Considerare n=2 e n=3
c>=2
Lezione1- Divide et impera
20
10
21/10/2013
Metodo di sostituzione: Considerazioni
•
•
Non vi sono regole specifiche per individuare la soluzione candidata
Tentare soluzioni simili per ricorrenze simili (in genere cambiano le
costanti).
T(n) = 2T(n / 2 +17) + n
c>=35
•
Provare con funzioni che limitino superiormente ed inferiormente la
funzione ricorsiva fino ad arrivare alla soluzione corretta
•
Talvolta per dimostrare matematicamente la correttezza di una
soluzione è conveniente sottrarre dei termini di ordine inferiore
T ( n) = T (  n / 2 ) + T (  n / 2 ) + 1
Provare la soluzione T ( n ) = O ( n )
T ( n ) ≤ cn
T ( n ) ≤ cn − b
T ( n) ≤ c  n / 2 + c  n / 2 + 1
T ( n ) ≤ (c  n / 2  − b ) + (c  n / 2  − b ) + 1
= cn + 1
Sbagliato!!
= cn − 2b + 1 ≤ cn − b
Lezione1- Divide et impera
21
Metodo di sostituzione: sostituzione di variabili
•
E’ possibile semplificare alcune ricorrenze effettuando una
sostituzione delle variabili
T (2 m ) = 2T (2m / 2 ) + m
Sostituendo I = log
T ( n) = 2T (  n  ) + log n
Sostituendo S ( m ) = T ( 2 m )
S ( m) = 2 S ( m ) + m
S ( m) = O( m log m)
T (n) = O (log n log log n)
Lezione1- Divide et impera
22
11
21/10/2013
Teorema principale
Sia #( )una funzione crescente definita sugli interi
Siano α ≥ 1, β > 1, n0 ≥0 costanti
per ≤
0(1)
-( ) ≤
0
<
α-( /.) + K( ) altrimenti
1.
2.
3.
Se esiste una costante γ > 0 e ′M > 0t.c. αK
per ≥ ′M , allora
-( ) = "(#( ))se γ < 1
-( ) = "(#( )logβ )se γ = 1
-( ) = "( PQRβ α)se γ > 1
8
N
= OK
Lezione1- Divide et impera
,
23
Abbozzo di dimostrazione
Per semplicità, usiamo #( )al posto di "(#( )).
∗≤
∗
Sia S∗ il min intero t.c. /!S
T, ossia S = PQRβ + "
≤#
+ #
!
+ ⋯+
S∗
#( /!S ) = ∗
α #( /! )
{T, ,..,S∗ }
Per induzione: α #( /! ) = γ #( )poiché α#( /!) = W#( )per hp.
1.
2.
3.
-( ) ≤ ∑
γ < ⇒ ∑
γ = ⇒∑
γ > ⇒∑
= "(
S∗
T, ,..,S∗
W #
{T, ,..,S∗ } W
{T, ,..,S∗ } W
{T, ,..,S∗ } W
{T, ,..,S∗ } W
= "( ) ⇒ ( ) = "(#( ))
= S∗ + ⇒ ( ) = "(#( )PQRβ )
= "(WS ) ⇒ ( ) = "(WS #( )) induzione
#( /!S )) = "(
∗
∑
=#
∗
S∗
#(
T)) =
Lezione1- Divide et impera
"(
∗
S ∗)
= "(
PQRβ
) = "(
PQRβα)
24
12
21/10/2013
Esempi
• Ricerca binaria: T(n) = T(n/2) + O(1)
α=1, β=2, f(n)=1 ⇒ caso γ =1 e T(n) = O(log n)
• Massimo in un array: T(n) = 2 T(n/2) + O(1)
α=2, β=2, f(n)=1 ⇒ caso γ >1 e T(n) = O(nlog2 2) = O(n)
• Somma ricorsiva a due a due: T(n) = 2T(n/2) + O(n)
α=1, β=2, f(n)=n ⇒ caso γ <1 e T(n) = O(n)
• Insertion sort ricorsivo: T(n) = T(n-1) + O(n)
Generazione di sequenze binarie: T(n) = 2 T(n-1) + O(1)
Generazione delle permutazioni: T(n) = n T(n-1) + O(n)
⇒ usare l’espansione invece del teorema fondamentale
Lezione1- Divide et impera
•
α = 1, β = 2, f(n) = n
•
•
α f(n/β) = 1 x n/2 = n/2
γ f(n) = γ x n ) γ = 1/2
Lezione1- Divide et impera
25
26
13
21/10/2013
Moltiplicazione veloce di interi
•
•
•
•
•
Interi rappresentati come array di cifre
Per la somma, l'algoritmo che consiste nell'addizionare le
singole cifre propagando l'eventuale riporto, richiede
0( )passi ed è quindi ottimo
Per il prodotto, l'algoritmo elementare richiede tempo 0( 2)
3587 x
2831 =
------3587
10761
28696
7174
-------10154797
Tempo di esecuzione della moltiplicazione riducibile mediante
applicazione del divide et impera
Miglioramento significativo per numeri a precisione arbitraria
Lezione1- Divide et impera
27
Moltiplicazione veloce di interi
Ogni numero intero Ydi cifre può essere scritto come T / ×
Y[ + Y\
8
o Y[ indica il numero formato dalle cifre più significative di Y
]
•
o Y\ denota il numero formato dalle
8
]
cifre meno significative.
Per moltiplicare due numeri ^e _, vale l'uguaglianza
8
^_ = 10 ] ^` +^a
8
8
10 ] _` +_a = 108 ^` _` + 10 ] ^` _a + ^a _` + ^a _a
Decomposizione: se be channo almeno due cifre, dividili
come numeri b[ , b\ , c[ ec\ aventi ciascuno la metà delle cifre
Ricorsione: calcola ricorsivamente le moltiplicazioni
b[ c[ ,b[ c\ ,b\ c[ eb\ c\ .
Ricombinazione: combina i numeri risultanti usando
l'uguaglianza suddetta.
Lezione1- Divide et impera
28
14
21/10/2013
Divide et impera: moltiplicazione 1
3587 x 2831 = (102 x 35 + 87) x (102 x 28 + 31)
= 104 x (35 x 28)+ 102 x (35 x 31 + 87 x 28 ) + 87 x 31
= 104 x 980 + 102 x 3521 + 2697
= 10154797
• l'algoritmo esegue quattro moltiplicazioni di due numeri di
/ cifre (a un costo ( / ),e tre somme di due numeri di
cifre (a un costo "( ))
o la moltiplicazione per il valore T può essere realizzata spostando
le cifre di posizioni verso sinistra e riempiendo di 0 la parte destra
o il costo della decomposizione e della ricombinazione è
• Vale la relazione di ricorrenza
/M
per ≤ 1
-( ) ≤
4-
8
]
altrimenti
+/
Lezione1- Divide et impera
29
Divide et impera: moltiplicazione 1
per ≤ 1
/M
-( ) ≤
4-
8
]
+/
altrimenti
• Applicazione del teorema fondamentale delle
ricorrenze
o ∝= +, ! = f#( ) = o #( /!) = +( / ) = = #
del teorema con W =
o ne deriva "( ghi + ) = "( ),
quindi si applica il terzo caso
non migliorando quindi le prestazioni
Lezione1- Divide et impera
30
15
21/10/2013
Divide et impera: moltiplicazione 2
• Osservazione nella formula precedente
• Il secondo termine può essere calcolato facendo uso degli
altri due valori ^` _` e ^a _a nel modo seguente:
b[ c\ + b\ c[ = b[ c[ +
+b\ c\ % b[ % b\ Z c[ % c\
• Osservazione: a – b = a + (-b) (basta cambiare b[0])
• Quindi sono necessarie tre moltiplicazioni e non quattro
Lezione1- Divide et impera
31
Moltiplicazione veloce di interi
Lezione1- Divide et impera
32
16
21/10/2013
Moltiplicazione veloce 2
[alvie]
Lezione1- Divide et impera
33
Opus libri: grafica e moltiplicazione di
matrici
Lezione1- Divide et impera
34
17
21/10/2013
Operazioni su matrici e grafica
Lezione1- Divide et impera
35
Operazioni su matrici e grafica: scalare
(dimensione 2)
Lezione1- Divide et impera
36
18
21/10/2013
Operazioni su matrici e grafica: ruotare
(dimensione 2)
Lezione1- Divide et impera
37
Operazioni su matrici e grafica: traslare
(dimensione 2)
Lezione1- Divide et impera
38
19
21/10/2013
Sequenza di trasformazioni in una scena
Lezione1- Divide et impera
39
Moltiplicazione veloce tra matrici
Lezione1- Divide et impera
40
20
21/10/2013
Moltiplicazione veloce tra matrici
Lezione1- Divide et impera
41
Analisi della moltiplicazione
Lezione1- Divide et impera
42
21
21/10/2013
Opus libri: il problema della coppia più vicina
• Problema: trovare la coppia di punti più vicina tra un
insieme di punti del piano.
• Il problema può essere risolto in tempo0(
le distanze tra tutti i punti.
]
) calcolando
• Utilizzando la tecnica del divide et impera, il problema
può essere risolto in tempo 0 log
Lezione1- Divide et impera
43
Il problema della coppia più vicina
•
•
•
•
L'insieme ha cardinalità costante: usiamo la ricerca esaustiva.
altrimenti: lo dividiamo in due parti uguali je k, per esempio
quelli a sinistra e quelli a destra di una fissata linea verticale
o troviamo ricorsivamente le soluzioni per l'istanza per je quella
per kindividuando due coppie di punti a distanza minima, lm
e ln soluzione finale:
o o una delle due coppie già individuate
o oppure può essere formata da un punto in je uno in k
se lmn è la minima distanza tra punti aventi estremi in je k, la
soluzione finale è data dalla coppia di punti a distanza
min{lmn , lm , ln }.
Lezione1- Divide et impera
44
22
21/10/2013
Il problema della coppia più vicina
• 1° Passo base: Se l’istanza è sufficientemente piccola risolvi
tramite una ricerca esaustiva
• 2° Passo: Individuare la linea verticale:
o Ordiniamo i punti di P per ascissa non decrescente
o b punto in posizione centrale dell’ordinamento
o r = {s ∈ u: s. b ≤ b} e = {s ∈ u: s. b > b}
• 3° Passo: Risolvi ricorsivamente in S e D
o Siano lm e ln le soluzioni riportate.
• 4° Passo: Ricombina: determinare lmn
o Sia d = min{lm , ln }.
o Consideriamo la striscia r′ = {s ∈ u: b − \ ≤ s. b ≤ b} e
′ = {s ∈ u: b ≤ s. b ≤ b + \}
Lezione1- Divide et impera
45
Il problema della coppia più vicina
Lemma:
o Sia u\ la lista dei punti in rx ∪ x ordinati per ordinata non
decrescente.
o s, z ∈ rx ∪ x sono a distanza minore di dallora sono
memorizzati in due posizioni che distano al più 10in u\
Per trovare lmn è sufficiente scorrere i punti nel vettore e, per
ognuno di questi, calcolarne la distanza dai 10 punti che lo
seguono nell’ordinamento.
•
Lezione1- Divide et impera
46
23
21/10/2013
Il problema della coppia più vicina: tempo
•
•
•
•
Caso base: ≤ 2tempo costante/M
Decomposizione: Se i punti sono ordinati per ascisse ed ordinate
non decrescenti, la decomposizione costa "( ).
o NB: L’ordinamento dei punti viene fatto preliminarmente (prima della
ricorsione) costo "( ghi )
Ricombinazione: In base la lemma precedente è "( ).
Se i punti sono ordinati per ascisse ed ordinate non decrescenti,
la decomposizione costa "( ).
o NB: L’ordinamento dei punti viene fatto preliminarmente (prima della
ricorsione) costo "( ghi )
={
T Dove /M e/ sono costanti.
Per il teorema fondamentale
+
[f ≤ |P}~ $f }
= "( ghi )
Lezione1- Divide et impera
47
Esercizi
•
•
Dato un vettore ordinato contenente n interi, progettare un
algoritmo che data una chiave restituisca il numero di
occorrenze di nel vettore. L’algoritmo deve avere
complessità 0(log ).
Scrivere un algoritmo Foo(n) la cui complessità in tempo al
caso pessimo sia modellata dalla seguente relazione di
ricorrenza:
O(1)
n < 10

T ( n) = 
2
3T (n / 2) + Θ( n ) n ≥ 10
•
Infine, si risolva anche la suddetta relazione.
Es 3.10 del libro Crescenzi et al.
Lezione1- Divide et impera
48
24