Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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;
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.
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)
(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
= = =
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