Sei sulla pagina 1di 5

Esercizi di Algoritmi e Strutture Dati

Moreno Marzolla marzolla@cs.unibo.it 12 ottobre 2010

Vero o falso?

Per ciascuna delle seguenti aermazioni, dire se ` vera o falsa, fornendo una e dimostrazione: 1. 3n = O(2n ) 2. 2n = O(3n ) 3. 22n = O(2n ) 4. 2n+1 = O(2n ) 5. log3 n = (log2 n) 6. ln n = O(n ), per ogni > 0 (ln ` il logaritmo naturale). e

Soluzione 1. Verichiamo se esiste una costante c > 0 tale che 3n c2n per n n0 . Dividendo entrambi i membri per 2n si richiederebbe the (3/2)n c per una qualche costante c. Poich limn+ (3/2)n = +, si ha che e la relazione di cui sopra non pu` essere vericata per n arbitrariamente o grande. Concludiamo quindi che laermazione ` falsa. e 2. Verichiamo se esiste una costante c > 0 tale che 2n c3n per n n0 . Possiamo scrivere: 2n c3n (2/3)n c Osserviamo che per ogni n 0 si ha (2/3)n 1 (infatti la successione e (2/3)0 , (2/3)1 , (2/3)2 , . . . (2/3)i , . . . ` strettamente decrescente), quindi possiamo porre n0 = 0 e c = 1 per vericare la disuguaglianza. Concludiamo quindi che laermazione ` vera. e

3. Verichiamo se esiste una costante c > 0 tale che, per valori sucientemente grandi di n, valga: 22n c2n Si noti che 22n = (22 )n = 4n . Seguendo la stessa argomentazione del punto precedente, si richiede che 4n c2n per una qualche costante c. Concludiamo quindi che laermazione ` falsa. e 4. Proviamo a vericare se esiste una costante c > 0 tale che, per valori sucientemente grandi di n, valga: 2n+1 c2n Si noti che 2n+1 = 2 2n , per cui possiamo scrivere 2 2n c2n che ` certamente vericata ponendo ad esempio c = 2, per ogni n 0. e Quindi laermazione ` vera. e 5. Verichiamo se c1 log2 n log3 n c2 log2 n per opportune costanti c1 e c2 , e per valori di n sucientemente grandi. Sia x = log3 n. Dalla denizione di logaritmo, si ha che 3x = n. Prendendo il logaritmo in base 2 di entrambi i membri, otteniamo: log2 (3x ) = log2 n da cui x log2 3 = log2 n e quindi, ricordando che x era log3 n si ha: log3 n = log2 n log2 3

In generale, per ogni y > 0, b, c > 1 vale la propriet` di cambio di base a dei logaritmi (descritta in appendice nel libro di testo) per cui loga y = logb y logb a

Tornando al problema iniziale, si tratta ora di trovare costanti c1 > 0, c2 > 0 tali che log2 n c1 log2 n c2 log2 n log2 3 che ` vericata se c1 = c2 = 1/ log2 3. Quindi laermazione ` vera. e e 6. Verichiamo se ln n cn , per una opportuna costante c > 0 e per n sucientemente grande. Per fare questo, studiamo il limite seguente:
n+

lim 2

ln n n

Derivando numeratore e denominatore (regola di de lHpital) si ottiene o ln n 1/n 1 = lim = lim =0 1 n+ n n+ n n+ n lim Dalla denizione di limite, possiamo concludere che laermazione ln n = O(n ) ` vera. e

Il numero mancante

Si consideri una permutazione dei primi n numeri interi 1, 2, . . . n da cui sia tolto un valore. Supponiamo che la permutazione con il valore mancante sia memorizzata in un array di n 1 elementi A[1, . . . n 1]. Scrivere un algoritmo eciente che, dato larray A, individua il valore mancante. Ad esempio, dato A = [1, 4, 2, 5], lalgoritmo deve restituire il risultato 3; dato A = [7, 1, 8, 6, 2, 3, 4] lalgoritmo deve restituire 5. (Suggerimento: ` suciente una singola scansione e dellarray A, senza ricorrere ad ulteriori array dappoggio). Soluzione Sfruttiamo lidea seguente: sappiamo che la somma dei primi n numeri interi vale n(n + 1)/2; sottraendo da tale quantit` i valori contenuti nel a vettore, quello che ci rimane ` esattamente il numero mancante. Lalgoritmo ` e e quindi il seguente: algoritmo trova_mancante( array A[1..n-1] di interi ) -> intero S := n*(n+1)/2; for i:=1 to n-1 do S := S-A[i]; endfor return S;

Dimostrazioni per induzione

Il seguente esercizio mostra come sia particolarmente importante prestare attenzione a come si fanno le dimostrazioni per induzione Consideriamo la seguente relazione di ricorrenza: T (n) = 2T ( n/2 ) + 1 1 n>1 n=1

` E relativamente facile rendersi conto che T (n) = O(n). Riuscite a dimostrare per induzione che T (n) cn, per una opportuna costante c > 0? Riuscite a dimostrare che T (n) cn b, per opportune costanti c > 0 e b arbitraria?

Soluzione Proviamo a dimostrare che T (n) cn per una opportuna costante c > 0. Il caso base T (1) = 1 c ` valido per qualunque c 1. Vediamo ora il e passo induttivo: T (n) = 2T ( n/2 ) + 1

2c(n/2) + 1 = cn + 1 A questo punto per` non possiamo proseguire aermando cn + 1 cn, o perch questo non sarebbe vero. Il problema si risolve usando cn b al posto di e cn nella dimostrazione sopra. Infatti, in questo caso il passo induttivo risulta essere T (n) = = 2T ( n/2 ) + 1 2(c(n/2) b) + 1 cn 2b + 1 cn b

che risulta essere vericato se b 1. Il caso base: T (1) = 1 c b risulta vericato scegliendo c b + 1, il che completa la dimostrazione.

Problema con il caso base

Il seguente esercizio mostra un esempio in cui si presenta un problema con il caso base, facilmente aggirabile. Consideriamo la seguente relazione di ricorrenza: T (n) = 2T ( n/2 ) + n 1 n>1 n=1

Dimostrare per induzione che T (n) = O(n log n), ossia dimostrare che T (n) cn log n per una opportuna costante c > 0 e per ogni n n0 . Soluzione Partiamo alla rovescia, dal passo induttivo: = 2T ( n/2 ) + n per lipotesi induttiva

T (n)

2c(n/2) log(n/2) + n = cn log(n/2) + n = cn(log n 1) + n = cn log n cn + n = cn log n + n(1 c) cn log n 4

(poich n ` un intero positivo, lultimo passaggio vale purch sia c > 1). e e e Vediamo ora il caso base: 1 = T (1) c log 1 = 0 Il caso base non funziona per n = 1. Fortunatamente, in questi casi possiamo sfruttare a nostro vantaggio il fatto che la relazione T (n) cn log n non deve necessariamente valere a partire da n = 1, ma solo per n n0 con n0 scelto opportunamente. In particolare scegliamo come n0 un valore per cui valga la relazione che dobbiamo dimostrare. Esaminiamo i valori n = 2, 3, . . .: 2T (1) + 2 = 4 c2 log 2 2T (1) + 3 = 5 c3 log 3 2T (2) + 4

T (2) T (3) T (4)

= = =

Si noti che possiamo individuare un valore c > 1 che soddis le prime due equazioni (ossia T (2) c2 log 2 e T (3) c3 log 3): basta prendere c > max{1, 4/(2 log 2), 5/(3 log 3)}. Usando n = 2 e n = 3 come casi base, possiamo sfruttare la dimostrazione del passo induttivo a partire da n = 4 in poi.

Analisi di complessit` a

Si consideri la funzione Fun(n), con n 1 intero, denita dal seguente algoritmo ricorsivo: algoritmo Fun(int n) -> int if (n <= 2) then return n; else return Fun(n-1) - 2*Fun(n-2); endif Calcolare un limite superiore e inferiore del tempo di esecuzione T (n) della funzione Fun. Soluzione La relazione di ricorrenza che descrive il tempo T (n) richiesto dallalgoritmo di cui sopra ` la seguente: e T (n) = c1 T (n 1) + T (n 2) + c2 se n 2 se n > 2

Coms i pu` osservare, la relazione di ricorrenza ` la stessa che si ottiene dallanalisi o e dellalgoritmo ricorsivo per il calcolo delln-esimo numero di Fibonacci, per cui si rimanda ai lucidi delle lezioni per il calcolo dei limiti superiori