Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
II Prova in itinere
18 maggio 2018
Esercizio 3
Si consideri il seguente frammento di codice:
int somma=0;
j=0;
for (i=0; i<N; i++){
j=0;
while (j < i^2){
somma=somma + funzione(N);
j++;
}
}
SOLUZIONE
Se k<=1 viene valutata la condizione ed eseguito il rame else: questo richiede un tempo di
esecuzione costante c che è in Θ(1)
Se k>1 si valuta la condizione, si esegue un ciclo per 100 volte (un numero costante di volte) e
si richiama la funzione stessa passando come parametro la metà (il valore restituito dalla
funzione viene moltiplicato per 2): questo richiede pertanto un tempo di esecuzione costante +
il tempo necessario per eseguire la funzione stessa su k/2
T(k) = c se k<=1
T(k) = d + T(k/2) se k>1
Si può risolvere per sostituzione oppure utilizzando le formule di ricorrenza comune, come
riportato nelle slide (quest'esempio viene presentato a lezione): si ottiene Θ(log k)
Analisi della complessità del frammento di codice:
Verrà eseguito:
All'interno dei due cicli viene richiamata funzione sempre con parametro N, quindi con
complessità Θ(log n)
Si consideri un albero binario contenente valori interi. Si scriva una funzione C++ che riceve in
ingresso un valore k, che verifica se è un albero binario pieno e tutte le foglie si trovano ad una
profondità maggiore o uguale a k. La funzione deve restituirà true se le condizioni sono
verificate, false altrimenti.
SOLUZIONE
#define TRUE 1
#define FALSE 0
Si poteva anche
- effettuare esplicitamente il controllo per i nodi con un singolo figlio
- utilizzare una variabile da passare come parametro alla funzione per calcolare la profondità e
confrontare quella con k
- effettuare una visita in ampiezza