Esercizi – parte 1 MODELLO RAM E DIMENSIONE DELL’INPUT 1. Si consideri il seguente algoritmo per il calcolo del massimo in un array di n elementi: int arrayMax(int A[], int n) { int i; int currentMax=A[0]; for (i=0; i < n; i++) if (A[i] > currentMax) currentMax=A[i]; return currentMax; } Supponiamo di considerare una piattaforma particolare e di aver stabilito (ad esempio mediante misurazioni sperimentali) che su tale piattaforma i tempi di esecuzione delle operazioni che ci interessano sono i seguenti: • Assegnazione di una variabile intera: 20 ns. • Test: 10 ns. • Incremento di una variabile intera (ad esempio i nel ciclo for): 30 ns. • Attivazione della funzione (allocazione della memoria per le variabili locali, creazione del record di attivazione ecc.): 50 ns. • Esecuzione dell’istruzione return:30ns. Si consideri l’input {7, 1, 4} e si confrontino i costi dell’algoritmo su tale input quando i) si considerano i tempi di calcolo delle operazioni visti sopra e ii) si considerano i tempi di calcolo secondo il modello RAM. 2. Si supponga che l’input a un problema sia costituito da n numeri interi rappresentati da 2 byte ciascuno. Qual e’ la dimensione dell’input secondo i) il modello RAM e ii) espresso in bit? 3. L’input a un problema e’ rappresentato da un numero intero N. Qual e’ la dimensione dell’input? ANALISI DEL CASO PEGGIORE 4. Si supponga che un algoritmo per il calcolo del prodotto di due matrici nxn a elementi interi richieda 3n3 operazioni nel caso peggiore. Si supponga per semplicita’ che tutte le operazioni richiedano 10ns per l’esecuzione su una certa piattaforma Hw/Sw. Qual e’ il tempo di esecuzione nel caso peggiore sulla piattaforma considerata quando a) n=100 e b) n=1000? Qual e’ il rapporto tra i tempi di esecuzione nei due casi? 5. Si consideri l’algoritmo dell’esercizio 1: int arrayMax(int A[], int n) { int i; int currentMax=A[0]; for (i=0; i < n; i++) if (A[i] > currentMax) currentMax=A[i]; return currentMax; } Se ne valuti la complessita’ nel caso peggiore. COMPLESSITA’ ASINTOTICA 6. Si dimostri che la complessita’ dell’algoritmo al punto 5 e’ O(n). asintotica 7. Mostrare che N lnN = O(N3/2) (es. 2.23 sul testo). 8. Si supponga di sapere che il tempo di calcolo dell’algoritmo A e’ O(N logN) e quello di B e’ (N3). Cosa implicano queste asserzioni circa le prestazioni relative dei due algoritmi? RICORRENZE 9. Ricavare la formula Dimostrare che CN=O(N2). 2.1 sul testo (pag. 49). 10. Dimostrare che, se CN = CN/2 + 1 allora, CN = O(logN), dove con logN indichiamo il logaritmo in base 2 di N. Si usi il metodo di sostituzione. Si assuma N 2. 11. Dimostrare il seguente corollario del risultato precedente: se CN = CN/2 + a, con a una costante positiva, allora, CN = O(logN). 12. Dimostrare che, se CN = CN/2 + N allora, CN = O(N). Si usi il metodo di sostituzione. Si assuma N 2. ANALISI DI ALGORITMI 13. Si valuti la complessita’ asintotica del seguente metodo per la ricerca sequenziale di un intero in un array di interi positivi: int seqsearch(int A[], int n, int val) { int i ; for (i=0; i < n; i++) if (A[i] == val) return i; return -1; /* Restituisce –1 se val non trovato in A */ } 14. Si valuti la complessita’ asintotica del seguente metodo Java per la ricerca binaria di un valore in un array di interi positivi. Si supponga che A contenga almeno 2 elementi. int binsearch(int A[], int n, int val) { /* Restituisce –1 se val non presente/* /* Altrimenti restituisce il primo indice i tale che A[i] == val */ return binsearch(A, 0, n-1, val); /* Invoca metodo con stesso nome e diversa segnatura N/ } int binsearch(int A[], int l, int r, int val) { int m = 0; while (r >=l) { m = (l+r)/2; if (val == A[m}) return m; if (val < A[m]) r = m-1; else l = m+1; } return -1; } APPLICAZIONI 15. Giovanni ha a disposizione due programmi A e B per l’ordinamento di array interi. Il primo ha costo 2n2 nel caso peggiore, mentre il secondo ha costo 15nlogn nel caso peggiore, dove n e’ il numero di elementi presenti nell’array. Per quali valori di n potrebbe essere conveniente usare l’algoritmo A? Motivare la risposta. Si supponga che 2 sia la base del logaritmo.