Esercizio - algoritmo ibrido e valore ottimo della soglia (compito del 27 gennaio 2025, es. 1)
In questa pagina 4
Testo (compito d'esame del 27 gennaio 2025 di Algoritmi per l'Ingegneria, Ing. Informatica UniPD, seconda parte, esercizio 1, 17 punti). Sia una potenza di due. Dato un problema , sia un algoritmo ricorsivo per la cui complessità in tempo obbedisce alla ricorrenza Sia un ulteriore algoritmo per di complessità .
- (a) [4 punti] Per e parametro costante potenza di due, si descriva la struttura dello pseudocodice dell'algoritmo ibrido ottenuto utilizzando per e la strategia ricorsiva altrimenti.
- (b) [3 punti] Si dimostri induttivamente che .
- (c) [6 punti] Si determini la complessità dell'algoritmo ibrido.
- (d) [4 punti] Si determini il valore del parametro che garantisce la migliore complessità alle costanti del risultante algoritmo ibrido.
Teoria usata: Albero della ricorrenza e formula generale per le ricorrenzeL'albero della ricorrenza ha la forma dell'albero delle chiamate dell'istanza peggiore e T(n) è la somma dei lavori dei nodi. Per la famiglia T(n) = s(n)T(f(n)) + w(n) con base T0 per n <= n0, contando i nodi per livello con le iterate di f e il livello f*(n,n0) si ottiene la formula chiusa T(n) = somma_l [prodotto_j s(f^(j)(n))] w(f^(l)(n)) + [prodotto s] T0, verificata per induzione e applicata a esempi (merge sort, Hanoi, ricorrenze con radice).Albero della ricorrenza e formula generale per le ricorrenze → (in particolare e la taglia delle foglie), Master Theorem - enunciato, casi e applicazioniMaster Theorem per T(n) = aT(n/b) + w(n): si confronta w(n) con la funzione soglia n^(log_b a). Caso 1 (w minore di una potenza polinomiale): Theta(n^(log_b a)); caso 2 (w della stessa taglia): Theta(n^(log_b a) log n); caso 3 (w maggiore e regolare): Theta(w(n)). Prova completa dai livelli dell'albero, versione estesa (parti intere, n0 qualsiasi), esempi, e l'uso scorretto quando nessun caso si applica (w = n log n).Master Theorem - enunciato, casi e applicazioni →, Principio di induzionePer dimostrare una proprietà per ogni n basta il passo base e il passo induttivo da n a n+1.Principio di induzione →.
L'idea dell'ibridazione: un algoritmo ricorsivo asintoticamente migliore () può essere battuto, sulle istanze piccole, da uno asintoticamente peggiore ma con costanti piccole ( batte per ). Si ferma allora la ricorsione a una taglia e si passa a .
(a) Pseudocodice dell'algoritmo ibrido
Si cambia solo il caso base del codice di : invece di fermarsi a ci si ferma a e si chiama . La ricorrenza di ha sottoistanze di taglia e lavoro (Divide più Conquer); il resto del codice resta quello di , con le chiamate ricorsive a HYBRID.
HYBRID(i, n0) {n0 potenza di due, costante}
n <- size(i)
[B]: if n <= n0 then return A2(i) // costo n^4
[D]: <i_1, ..., i_6> <- A_D(i) // Divide di A1: 6 sottoistanze di taglia n/2
[R]: for j <- 1 to 6 do s_j <- HYBRID(i_j, n0) // il parametro n0 resta fisso
[C]: return A_C(s_1, ..., s_6) // Conquer di A1La correttezza segue da quella dei due algoritmi: sulle istanze di base si usa (corretto per ipotesi) e sulle altre la stessa proprietà di sottostruttura di .
(b)
Si pone e si procede per induzione su .
- [B] : , .
- [HP] (la tesi per ).
- [TH] .
Coerente con il Master Theorem: , , soglia , con regolarità , quindi Caso 3: .
(c) La complessità dell'algoritmo ibrido
La ricorrenza dipende da due parametri, e (con potenze di due): Formula generale con , , , taglia di base e costo di base (tutte le foglie hanno taglia esattamente ). Per si ha : i livelli non di base sono con , e le foglie, al livello , sono . Dunque
Somma dei livelli. , quindi, con la somma geometrica di ragione ,
Riscrittura in potenze di e . Con si ha , e , quindi Allora:
- (perché );
- .
Sommando, con :
Controlli. Per ( a taglia costa invece di ): , quindi ; per dà . La formula coincide con la ricorrenza per ogni e ogni (verificato con Python). Per si ha e : coincide con , perché a taglia i due algoritmi costano uguale ().
(d) Il valore ottimo di
Il coefficiente del termine dominante, , non dipende da : l'ibridazione può agire solo sulla costante del termine di ordine inferiore (esponente ). Il costo è minimo dove è minimo (più negativo). Si studia il segno della derivata: Poiché , il segno è quello della parentesi, che è negativa per piccolo, si annulla in e poi è positiva: decresce fino a e cresce dopo. Il minimo tra le potenze di due sta in una delle due più vicine a , cioè o . Per confrontarle si usa e ; il secondo termine di è : Poiché , la soglia migliore è
Errore nella soluzione del corso. La soluzione ufficiale riporta e conclude con . Ma il secondo termine di è , non : la soluzione ha riusato il fattore di , e così invece del corretto . Con il valore giusto vince . Lo conferma la ricorrenza valutata direttamente per :
| 4 | 8 | 16 | 32 | 64 | 128 | |
|---|---|---|---|---|---|---|
Il guadagno è modesto: a il costo scende da (puro , o ) a , circa il , perché agisce solo su un termine di ordine inferiore. Per l'ibrido è peggiore di ().
import math
from functools import lru_cache
@lru_cache(None)
def Th(n, n0):
return n**4 if n <= n0 else 6 * Th(n // 2, n0) + 16 * n**3
L = math.log2(3)
c = lambda n0: -64 * n0**(2 - L) + n0**(3 - L)
n = 2**14
for j in range(2, 8):
n0 = 2**j
pred = 64 * n**3 + c(n0) * n**math.log2(6)
assert abs(Th(n, n0) - pred) < 1e-9 * pred
print(min(range(15), key=lambda j: Th(n, 2**j))) # 4, cioe' n0 = 16
print(round(c(16), 2), round(c(32), 2)) # -151.7 -134.85Versione ripasso
Testo. , ; costa . (a) pseudocodice di HYBRID, per [4 punti]; (b) per induzione [3]; (c) [6]; (d) ottimo [4].
Teoria: Albero della ricorrenza e formula generale per le ricorrenzeL'albero della ricorrenza ha la forma dell'albero delle chiamate dell'istanza peggiore e T(n) è la somma dei lavori dei nodi. Per la famiglia T(n) = s(n)T(f(n)) + w(n) con base T0 per n <= n0, contando i nodi per livello con le iterate di f e il livello f*(n,n0) si ottiene la formula chiusa T(n) = somma_l [prodotto_j s(f^(j)(n))] w(f^(l)(n)) + [prodotto s] T0, verificata per induzione e applicata a esempi (merge sort, Hanoi, ricorrenze con radice).Albero della ricorrenza e formula generale per le ricorrenze →, Master Theorem - enunciato, casi e applicazioniMaster Theorem per T(n) = aT(n/b) + w(n): si confronta w(n) con la funzione soglia n^(log_b a). Caso 1 (w minore di una potenza polinomiale): Theta(n^(log_b a)); caso 2 (w della stessa taglia): Theta(n^(log_b a) log n); caso 3 (w maggiore e regolare): Theta(w(n)). Prova completa dai livelli dell'albero, versione estesa (parti intere, n0 qualsiasi), esempi, e l'uso scorretto quando nessun caso si applica (w = n log n).Master Theorem - enunciato, casi e applicazioni →.
- (a) Si cambia solo il caso base:
if n <= n0 then return A2(i); poi Divide di (6 sottoistanze di taglia ), 6 chiamate HYBRID, Conquer di . - (b) Base ; passo .
- (c) (), ; , , foglie di costo : Con : , . Controlli: ; ().
- (d) Il termine non dipende da : si minimizza . , nullo in . Potenze di due vicine: , : , .
- Errore del corso: la soluzione riporta (, con al posto di nel secondo termine) e sceglie . Con la ricorrenza diretta per : .
- Errori tipici: cercare ottimo con un solo confronto invece dei due vicini di ; sbagliare ; porre invece di .
- Tabella di controllo (): per ; . Guadagno su (): circa , perché agisce solo su un termine di ordine inferiore; per l'ibrido peggiora ().