Sei sulla pagina 1di 62

Analisi di Algoritmi Ricorsivi

Liliana Lo Presti
Algoritmi ricorsivi
• Descriviamo il tempo di esecuzione attraverso una relazione di
ricorrenza
• Il tempo speso dall’algoritmo è pari a: il tempo speso all’interno della
procedura + il tempo speso nelle chiamate ricorsive
• Per la ricercar binaria:

𝑇 𝑛 = 𝑂 1 + 𝑇 𝑛/2
• Il problema diventa quello di manipolare tale relazione per ottenere
un costo che sia funzione di n
Algoritmi ricorsivi – Metodi di analisi
• Metodo dell’iterazione: “Srotoliamo” la relazione

• Metodo della sostituzione: usiamo l’induzione

• Oppure
• Usiamo il teorema fondamentale delle ricorrenze
• Utile quando il problema è risolvibile con la tecnica del divide et impera
Tecnica del divide et impera
• Dato un problema di dimensione n, lo si divide in k sotto-problemi di
dimensione n/b (quindi di dimensione più piccola)
• Si risolvono i sotto-problemi ricorsivamente

• Si combinano le soluzioni dei sotto-problemi per risolvere quello originario

• Il costo di esecuzione può esser scritto come:

𝑛
𝑇 𝑛 =𝑘%𝑇 + 𝑓(𝑛)
𝑏
f(n) è il costo necessario per dividere il problema in k sotto-problemi e combinarne le
soluzioni
Es.: Ricerca binaria
Algorithm 4 Search the value v among the n ordered elements of S
1: function binarySearch(S, v, first, last)
2: if first > last then
3: return 0
4: m b first+last
2 c
5: if S[m] = v then
6: return m
7: else if S[m] > v then
8: return binarySearch(S, v, first, m 1)
9: else
10: return binarySearch(S, v, m + 1, last)

Il problema è suddiviso in sotto-problemi. In questo esempio, un solo sotto-problema è


risolto ogni volta
Albero - wiki
• In informatica, un albero o struttura ad albero (tree in inglese) è la struttura dati che si
riconduce al concetto di albero con radice presente nella teoria dei grafi.
• Un albero si compone di due tipi di sottostrutture fondamentali:
• il nodo, che in genere contiene informazioni,
• l'arco, che stabilisce un collegamento gerarchico fra due nodi: si parla allora di un nodo padre dal
quale esce un arco orientato che lo collega ad un nodo figlio.
• … ogni nodo ha al massimo un unico arco entrante,
• … dai nodi possono uscire diversi numeri di archi uscenti.
• … un unico nodo privo di arco entrante: questo nodo viene detto radice (root)
dell'albero.
• … Ogni nodo che non presenta archi uscenti è detto foglia (leaf node)

• L'altezza o profondità dell'albero è il massimo delle lunghezze dei suoi cammini


massimali, cammini che vanno dalla radice alle sue foglie.
Albero della ricorsione
• Le chiamate ricorsive possono essere rappresentate attraverso un
albero
• Nodo radice rappresenta la prima chiamata

• I figli rappresentano le chiamate ricorsive

• Per semplicità, assumiamo che la ricorsione termini quando n = 1


Albero della ricorsione
1° chiamata Livello 0: k figli, 1 nodo
n

n/b n/b n/b Livello 1: k2 figli, k nodi


K chiamate
K chiamate

n/b2 n/b2 n/b2 n/b2 n/b2 n/b2 Livello 2: k3 figli, k2 nodi

K chiamate
Proprietà
• I sotto-problemi al livello i hanno dimensione !⁄"!

• Considerato che il costo di esecuzione dell’algoritmo è


𝑛
𝑇 𝑛 =𝑘+𝑇 + 𝑓(𝑛)
𝑏
• Escludendo il costo delle chiamate ricorsive, ogni sotto-problema
(ogni nodo) contribuisce al costo di esecuzione complessivo con
𝑓 !⁄"!
!
• Poichè la ricorsione termina quando "! = 1, allora 𝑛 = 𝑏# e 𝑖 = log " 𝑛
• Quindi il numero massimo di livelli nell’albero è pari a 𝑖 = log " 𝑛
Proprietà
• Ogni nodo ha k figli ed il numero di livelli è i
• Il numero totale di nodi al generico livello i è pari a 𝑘 #
• Ogni nodo contribuisce al costo con 𝑓 !⁄"!

• In definitiva:
&'(" !
𝑛
𝑇 𝑛 = 4 𝑘#𝑓
𝑏#
#$%
Per il teorema che segue, è inoltre necessario
sapere che:
Se 𝒇𝟏 𝒏 = 𝑶(𝒈𝟏 𝒏 ) e 𝒇𝟐 𝒏 = 𝑶(𝒈𝟐 𝒏 ), allora

𝑓# 𝑛 + 𝑓$ 𝑛 = 𝑂(max 𝑔# 𝑛 ; 𝑔$ 𝑛 )

Dimostrazione
𝒇𝟏 𝒏 ≤ 𝒄𝟏 𝒈 𝟏 𝒏
𝒇𝟐 𝒏 ≤ 𝒄𝟐 𝒈 𝟐 𝒏
Sia 𝒈𝑴 (𝒏) = 𝒎𝒂𝒙{𝒈𝟏 𝒏 ; 𝒈𝟐 𝒏 }
allora
𝒇𝟏 𝒏 ≤ 𝒄𝟏 𝒈 𝑴 𝒏
𝒇𝟐 𝒏 ≤ 𝒄𝟐 𝒈 𝑴 𝒏
e sommando:
𝒇𝟏 𝒏 + 𝒇𝟐 𝒏 ≤ (𝒄𝟏 +𝒄𝟐 )𝒈𝑴 𝒏
Esempi
Se 𝒇𝟏 𝒏 = 𝑶(𝒏𝟐) e 𝒇𝟐 𝒏 = 𝑶(𝒏 𝒍𝒐𝒈 𝒏), allora

𝑓+ 𝑛 + 𝑓, 𝑛 = 𝑂(𝒏𝟐)

Se 𝒇𝟏 𝒏 = 𝑶(𝒍𝒐𝒈 𝒏) e 𝒇𝟐 𝒏 = 𝑶(𝟏), allora

𝑓+ 𝑛 + 𝑓, 𝑛 = 𝑂(log 𝑛)
Teorema Master
Teorema Master
Teorema Master
Teorema Master

Per le proprietà dei logaritmi

k è il numero di livelli dell’albero.


a è il numero di figli di ogni nodo.
Lc è il numero di foglie (nodi con costo T(1))
Teorema Master

Il costo totale T(n) = Lc + Ic dove Ic è il costo dei nodi interni ed Lc il costo dei nodi foglia
Teorema Master

Il costo totale T(n) = Lc + Ic dove Ic è il costo dei nodi interni ed Lc il costo dei nodi foglia
Teorema Master Ic per livello
Teorema Master Ic per livello

Lc

T(n) =
Teorema Master
T(n) =

Per capire quanto costa l’algoritmo


dobbiamo comparare il costo dei nodi
foglia e del corpo della funzione

Ci sono 3 casi:
Teorema Master
T(n) =

Ci sono 3 casi:

1. Il costo cresce
geometricamente dalla radice
alle foglie
Lc cresce asintoticamente più di Il costo delle foglie predomina!
f(n) di un fattore polinomiale
nepsilon
Teorema Master
T(n) =

Ci sono 3 casi:

1. Il costo cresce 2. Il costo è approssimativamente


geometricamente dalla radice uguale in ciascuno dei logb n
alle foglie livelli dell’albero.
Lc cresce asintoticamente più di La crescita di Lc è
f(n) di un fattore polinomiale asintoticamente uguale a quella
nepsilon di f(n)
Teorema Master
T(n) =

Ci sono 3 casi:

1. Il costo cresce 2. Il costo è approssimativamente 3. Il costo decresce


geometricamente dalla radice uguale in ciascuno dei logb n geometricamente dalla radice alle
alle foglie livelli dell’albero. foglie
Lc cresce asintoticamente più di La crescita di Lc è La crescita di Lc è asintoticamente
f(n) di un fattore polinomiale asintoticamente uguale a quella minore di quella di f(n) di un
nepsilon di f(n) fattore polinomiale nepsilon
Attenzione
• Cosa significa che Lc cresce asintoticamente più di f(n) di un fattore
polinomiale?

&-. / !#$%" &


𝑓 𝑛 <𝑛 "
0(!)
≥ 𝑐𝑛3 = Ω(𝑛3 )
Attenzione
• Cosa significa che Lc decresce asintoticamente più di f(n) di un fattore
polinomiale?

0(!)
𝑓 𝑛 > 𝑛&'(" / ≥ 𝑐𝑛3 = Ω(𝑛3 )
!#$%" &
Teorema fondamentale delle ricorrenze
(detto anche Teorema Master)
• La relazione di ricorrenza
𝑛
𝑘%𝑇 + 𝑓(𝑛) 𝑠𝑒 𝑛 > 1
𝑇 𝑛 =< 𝑏
1 𝑠𝑒 𝑛 = 1
Ha soluzione:

𝜽 𝑛&'(! ) se f 𝑛 = 𝑶 𝑛&'(! )*+ con 𝜖 > 0 Caso 1


𝜽 𝑛&'(! ) log 𝑛 se f 𝑛 = 𝜣 𝑛&'(! ) Caso 2

𝑇 𝑛 = se f 𝑛 = 𝜴 𝑛&'(! ),+ per 𝜖 > 0 e Caso 3


𝜽 𝑓(𝑛) 𝑛
𝑘𝑓 ≤ 𝑐𝑓 𝑛 per c < 1 ed n ≫ 0
𝑏
Teorema fondamentale delle ricorrenze
(detto anche Teorema Master)

• In ciascuno dei 3 casi confrontiamo 𝒇(𝒏) con la funzione 𝒏𝐥𝐨𝐠𝒃 𝒌

• La soluzione della ricorrenza è determinate dalla più grande tra le due funzioni:

• Caso 1: 𝑛&'(! ) è più grande di 𝑓(𝑛), allora 𝑇 𝑛 = 𝜃 𝑛&'(! )

• Caso 3: 𝑓(𝑛) è più grande di 𝑛&'(! ) , allora 𝑇 𝑛 = 𝜃 𝑓(𝑛)

• Caso 2: le due funzioni hanno la stessa dimensione, allora moltiplichiamo per un fattore
logaritmico 𝑇 𝑛 = 𝜃 𝑓(𝑛) log 𝑛 = 𝜃 𝑛&'(! ) log 𝑛
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

Esempi
Sia T(n) = 3T(n/9) + c
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

Esempi
Sia T(n) = 3T(n/9) + c
k=3, b=9, f(n)=c
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

Esempi
Sia T(n) = 3T(n/9) + c
k=3, b=9, f(n)=c
𝑐 = 𝑂 𝑛&'(( 893 = 𝑂 𝑛+/,93
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

Esempi
Sia T(n) = 3T(n/9) + c
k=3, b=9, f(n)=c
𝑐 = 𝑂 𝑛&'(( 893 = 𝑂 𝑛+/,93
siamo nel caso 1 del teorema (non valgono limitazioni inferiori)
𝑇 𝑛 = Θ( 𝑛)
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

Esempi
Sia T(n) = 3T(n/9) + n
k=3, b=9, f(n)=n à 𝑛&'(( 8 = 𝑛+/,
𝑛 ≥ 𝑛+/,
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

Esempi
Sia T(n) = 3T(n/9) + n
k=3, b=9, f(n)=n
)
;3
n= Ω 𝑛&'(( 8;3 =Ω 𝑛 * àpotremmo essere nel terzo caso
! +
3 < ≤ 𝑐𝑛 ogni 𝑐 > 8 . Poiché c<1, siamo nel caso 3
𝑇 𝑛 = Θ(𝑛)
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

Esempi
Sia T(n) = 2T(n/2) + n
k=2, b=2, f(n)=n à log , 2 = 1 à 𝒏𝒍𝒐𝒈𝒃 𝒌= 𝒏𝟏 = 𝒏
n= Θ(𝑛) à siamo nel caso 2

𝑇 𝑛 = Θ(𝑛 log 𝑛)
𝒏 Caso 1: 𝐟 𝒏 = 𝑶 𝒏𝒍𝒐𝒈𝒃 𝒌*𝝐 con 𝝐 > 𝟎 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌
𝒌7𝑻 + 𝒇(𝒏) 𝒏>𝟏
𝑻 𝒏 =6 𝒃 Caso 2: 𝐟 𝒏 = 𝜣 𝒏𝒍𝒐𝒈𝒃 𝒌 ⇒ 𝑻 𝒏 = 𝜽 𝒏𝒍𝒐𝒈𝒃 𝒌 𝒍𝒐𝒈 𝒏
Esercizi𝟏 𝒏=𝟏
Caso 3: 𝐟 𝒏 = 𝜴 𝒏𝒍𝒐𝒈𝒃 𝒌,𝝐 , 𝝐 > 𝟎,
𝒏 ⇒ 𝑻 𝒏 = 𝜽 𝒇(𝒏)
𝒌𝒇 ≤ 𝒄𝒇 𝒏 , 𝒄 < 𝟏
𝒃

• Usando il Teorema Master, calcolare la soluzione delle seguenti


relazioni di ricorrenza

!
1. 𝑇 𝑛 = 4𝑇 ,
+𝑛
!
2. 𝑇 𝑛 = 4𝑇 ,
+ 𝑛,
!
3. 𝑇 𝑛 = 4𝑇 ,
+ 𝑛8
!
4. 𝑇 𝑛 = 3𝑇 8
+𝑛
Soluzioni
1. 𝑇 𝑛 = Θ 𝑛,
2. 𝑇 𝑛 = Θ 𝑛, log 𝑛
3. 𝑇 𝑛 = Θ 𝑛8
4. 𝑇 𝑛 = Θ(𝑛 log 𝑛)
Quando posso applicare il Teorema?
!
• 𝑇 𝑛 =𝑎+𝑇 "
+𝑓 𝑛
• a>0
• b>1
• f(n) gode di condizioni di regolarità ovvero
a f(n/b) <= c f(n) con 0<c<1

Il rapporto tra la funzione f(n) e Lc soddisfa una delle seguenti:

Se f(n) è un polinomio, normalmente possiamo applicare il TM


I dubbi nascono quando nella funzione appare un logaritmo
Cosa possiamo dire di log n?
Cerchiamo di capire la relazione tra log(n) e nz

La funzione logaritmo cresce molto più lentamente di qualsiasi potenza di n con


esponente positivo, ovvero
log 𝑛 ≤ 𝑛 ! 𝑐𝑜𝑛 𝑧 > 0 e per valori di n che tendono a infinito

Questo si può dimostrare calcolando il seguente limite con il de l’Hopital:


log 𝑛 1
lim = lim ! = 0
"→$ 𝑛 ! "→$ 𝑧𝑛

Da cui
log 𝑛 = 𝑂(𝑛 ! ) ogni z>0
Posso usare il teorema master in questo
caso?
• T(n) = 2 T(n/2) + n log n
Posso usare il teorema master in questo
caso?
• T(n) = 2 T(n/2) + n log n

Individuo f(n): f(n) = n log n


Condizioni su k e b: a=2 >1 e b = 2 > 0 le condizioni sono verificate!
Individuo g(n): logba = 1 quindi Lc = g(n) = n

!@-. !
!
= log 𝑛 che è 𝑂(𝑛3 ) e non Omega!

Non posso usare il teorema master


Posso usare il teorema master in questo
caso?
• T(n) = 3 T(n/4) + n log n

Individuo f(n): f(n) = n log n


Condizioni su k e b: a=3 >1 e b = 4 > 0 le condizioni sono verificate!
Individuo g(n): logba < 1 quindi 𝑔 𝑛 = 𝑛%&'! (

")*+ "
= 𝑛-.%&'! ( log 𝑛 ≥ 𝑛-.%&'! ( = 𝑛/ 𝑐𝑜𝑛 𝜖 = 1 − log 0 3>0
""#$! %

Quindi f(n)=Omega(𝑛%&'! ( ) potrei essere nel caso 3. Devo verificare la condizione di


regolarità ecc….
posso usare il teorema master
Posso usare il teorema master in questo
caso?
• T(n) = 4 T(n/2) + n log n

Individuo f(n): f(n) = n log n


Condizioni su k e b: a=4 >1 e b = 2 > 0 le condizioni sono verificate!
Individuo g(n): logba = 2 quindi 𝑔 𝑛 = 𝑛#

𝑛# 𝑛
= .
𝑛 𝑙𝑜𝑔 𝑛 log 𝑛
$ $
Ricordando che log n < nz ogni z>0 allora ≥ !
%&'( (

( (
Quindi ≥ ≥ 𝑛$,- 𝑐ℎ𝑒, 𝑐𝑜𝑛 𝑢𝑛 0 < 𝑧 < 1, 𝑝𝑜𝑠𝑠𝑜 𝑖𝑛𝑡𝑒𝑟𝑝𝑟𝑒𝑡𝑎𝑟𝑒 𝑐𝑜𝑚𝑒 𝑛.
)*+ ( (!
Quindi f(n)=O(𝑛#,. ) e siamo nel caso 1 del TM. Quindi T(n) = Theta(n2)

posso usare il teorema master


Analisi dell’albero della ricorsione
• Per poter applicare il teorema Master è necessario che la relazione sia
del tipo
𝑛
𝑘%𝑇 + 𝑓(𝑛) 𝑠𝑒 𝑛 > 1
𝑇 𝑛 =< 𝑏
1 𝑠𝑒 𝑛 = 1

• Una relazione come


𝑛 2𝑛
𝑇 𝑛 =𝑇 +𝑇 +𝑛
3 3
• Non può esser risolta con il teorema Master
Analisi dell’albero della ricorsione
• Possiamo però tracciare ed analizzare l’albero della ricorsione

𝑛 2𝑛
𝑇 𝑛 =𝑇 +𝑇 +𝒏
3 3
n Pe
rc
=n
ors
op

lu n
go
n/3 2n/3 =n/3+2n/3=n

n/32 2n/32 2n/32 4n/32 =n/9+2n/9+2n/9+4n/9=n


Analisi dell’albero della ricorsione
• Possiamo quindi tracciare l’albero della ricorsione e analizzarlo

𝑛 2𝑛
𝑇 𝑛 =𝑇 +𝑇 +𝒏
3 3
n Ogni livello abbiamo un costo pari ad n
Il numero di livelli è log =/$ 𝑛
n/3 Quindi, un upper bound del tempo è
2n/3
O(n log n)

n/32 2n/32 2n/32 4n/32


Cambiamenti di variabile
• In alcuni casi, un cambio di variabile semplifica il calcolo

• Es.:
𝑇 𝑛 =𝑇 𝑛 + 𝑂(1)

• Ponendo 𝑛 = 2B (ovvero x = log n) si ottiene

𝑇 2B = 𝑇 2B/, + 𝑂(1)
Cambiamenti di variabile
𝑇 2B = 𝑇 2B/, + 𝑂(1)

• Ponendo 𝑅 𝑥 = 𝑇 2B , si ottiene

𝑥
𝑅 𝑥 =𝑅 + 𝑂(1)
2
Che può essere risolta con una delle tecniche già viste (per es. Ricade nel caso 2
del Teo. Master) ottenendo
• 𝑅 𝑥 = Θ(log 𝑥)
• 𝑇 𝑛 = Θ(log log 𝑛)
Analisi di Algoritmi Randomizzati
• Un algoritmo si dice randomizzato se il suo comportamento è
determinato non solo dal suo input ma anche da un generatore di
numeri casuali
• Gli algoritmi non randomizzati sono detti deterministici

• Poichè il tempo di esecuzione di un algoritmo randomizzato non


dipende solo dal suo input ma anche dal generatore di numeri
casuali, per tali algoritmi calcoliamo il tempo atteso

𝐸𝑡 𝐼 = 𝑇CBD 𝐼 = 4 𝑃(𝑅) + 𝑡(𝐼, 𝑅)


ECFGC!HC
I/!J-K L
Analisi di Algoritmi Randomizzati
• Nel caso peggiore, su istanze di dimensione n

𝑇CBD 𝑛 = max 4 𝑃(𝑅) + 𝑡(𝐼, 𝑅)


M(!)
ECFGC!HC
I/!J-K L

Che differenza con analisi del caso medio per algoritmi deterministici
(riportate di seguito)?

𝑇N-IEO 𝑛 = max{𝑡(𝐼)} 𝑇/P. = ∑M(!) (𝑝 𝐼 + 𝑡 𝐼 )


M(!)
Es.: Ricerca randomizzata

Algorithm 14 Ricerca Randomizzata: cerca elemento x nella lista L


1: function ricercaRandomizzata(L, x)
2: permuta casualmente L
3: for all y 2 L do
4: if y = x then
5: return True
6: return False

Quando potrebbe convenire?


Es.: Ricerca randomizzata

Algorithm 14 Ricerca Randomizzata: cerca elemento x nella lista L


1: function ricercaRandomizzata(L, x)
2: permuta casualmente L
3: for all y 2 L do
4: if y = x then
5: return True
6: return False

Quando potrebbe convenire?


Quando l’operazione di confronto è molto più costosa dell’operazione di
permutazione.
Es.: Ricerca randomizzata

Algorithm 14 Ricerca Randomizzata: cerca elemento x nella lista L


1: function ricercaRandomizzata(L, x)
2: permuta casualmente L
3: for all y 2 L do
4: if y = x then
5: return True
6: return False

𝑇CBD 𝑛 = max 4 𝑃(𝑝) + 𝑇(𝑥, 𝑝(𝐿))


B,R
DCIK.D
Con p che indica la permutazione, p(L) che indica la lista permutata
Es.: Ricerca randomizzata
• All’interno di L, x può occupare una posizione qualsiasi tra 1 ed n che indichiamo con
pos(X)
• Partizioniamo le permutazioni in base alla posizione di x in p(L)
F

l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿)) = l l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿))


?@AB.? DE# ?:𝒑𝒐𝒔 𝒙 E𝒊
DF ?(M)
Es.: Ricerca randomizzata
• All’interno di L, x può occupare una posizione qualsiasi tra 1 ed n che indichiamo con
pos(X)
• Partizioniamo le permutazioni in base alla posizione di x in p(L)
F

l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿)) = l l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿))


?@AB.? DE# ?:?NO P ED
DF ?(M)
• Poichè ci sono n! permutazioni, 𝑃 𝑝 = #⁄F!
Es.: Ricerca randomizzata
• All’interno di L, x può occupare una posizione qualsiasi tra 1 ed n che indichiamo con
pos(X)
• Partizioniamo le permutazioni in base alla posizione di x in p(L)
F

l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿)) = l l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿))


?@AB.? DE# ?:?NO P ED
DF ?(M)
• Poichè ci sono n! permutazioni, 𝑃 𝑝 = #⁄F!
• Solo 𝑛 − 1 ! permutazioni hanno pos(x)= 𝑖. Tali permutazioni richiedono 𝑖 confronti
Es.: Ricerca randomizzata
• All’interno di L, x può occupare una posizione qualsiasi tra 1 ed n che indichiamo con
pos(X)
• Partizioniamo le permutazioni in base alla posizione di x in p(L)
F

l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿)) = l l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿))


?@AB.? DE# ?:?NO P ED
DF ?(M)
• Poichè ci sono n! permutazioni, 𝑃 𝑝 = 𝟏⁄𝒏!
• solo 𝑛 − 1 ! permutazioni hanno pos(x)= 𝑖. Tali permutazioni richiedono 𝒊 confronti
F
𝑛−1 !
l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿)) = l 𝒊
𝑛!
?@AB.? DE#
Es.: Ricerca randomizzata
• All’interno di L, x può occupare una posizione qualsiasi tra 1 ed n che indichiamo con
pos(X)
• Partizioniamo le permutazioni in base alla posizione di x in p(L)
F

l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿)) = l l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿))


?@AB.? DE# ?:?NO P ED
DF ?(M)
• Poichè ci sono n! permutazioni, 𝑃 𝑝 = #⁄F!
• solo 𝑛 − 1 ! permutazioni hanno pos(x)= 𝑖. Tali permutazioni richiedono 𝑖 confronti
F
𝑛−1 ! 1 𝑛(𝑛 + 1) 𝑛 + 1
l 𝑃(𝑝) % 𝑇(𝑥, 𝑝(𝐿)) = l 𝑖= =
𝑛! 𝑛 2 2
?@AB.? DE#
Analisi Ammortizzata - Cenni
• Spesso dobbiamo eseguire un algoritmo ripetutamente nel tempo.
• Alcune operazioni potrebbero richiedere molto tempo per
configurazioni svantaggiose dei dati in input ed essere veloci in altre
configurazioni. L’analisi nel caso peggiore stimerebbe tempi molto
elevati
• In tali casi, è più conveniente analizzare le prestazioni di una
operazione algoritmica in media su una sequenza di esecuzioni,
piuttosto che su una singola esecuzione nel caso peggiore.
• Questo tipo di analisi viene chiamata analisi ammortizzata e spesso
caratterizza in modo più preciso le prestazioni di una operazione
algoritmica
Costo ammortizzato
• Definiamo il costo ammortizzato Tam(n) di una operazione su una
sequenza di k operazioni che richiedono tempo totale T (n, k) nel caso
peggiore come:
Tam(n) = T (n, k) / k

• Esistono tecniche avanzate per il calcolo del costo ammortizzato


(approfondimento personale)
Riepilogo
• Data una relazione di ricorrenza, possiamo risolverla con
• Metodo iterativo
• Metodo di sostituzione (se intuiamo costo computazionale)
• Teorema Master (se espresso in una particolare forma)
• Analizzando l’albero della ricorsione
• Sfruttando un cambiamento di variabile

• Per gli algoritmi randomizzati


• calcoliamo il tempo atteso considerando la distribuzione di probabilità delle
sequenze randomiche

Potrebbero piacerti anche