Sei sulla pagina 1di 7

Politecnico di Milano

Algoritmi e Calcolo Parallelo


Prof. Pier Luca Lanzi Ing. Daniele Loiacono
Prima prova in itinere
15 Novembre 2010

COGNOME E NOME

Risolvere i seguenti esercizi, scrivendo le risposte ed eventuali


tracce di soluzione negli spazi disponibili. possibile usare il
libro di testo e un manuale di C++ privo di annotazioni. Non
permesso usare supporti contenente esercizi svolti
(eserciziari, slide, ecc.). Non possibile consegnare
esercizi scritti in matita. Non consegnare altri fogli. Tutti
gli esercizi hanno un punteggio massimo di 3 e minimo di
-3. Un esercizio lasciato in bianco corrisponde a 0 punti.

Spazio riservato ai docenti

MATRICOLA

Esercizio 1. Dato un vettore A di n elementi che rappresenta la distribuzione di probabilit di una


variabile X aleatoria con valori da 0 a n-1 (ovvero A[i] la probabilit che la variabile X abbia valore
i), scrivere una funzione C++ che generi un valore casuale di X secondo la distribuzione di probabilit
specificata dal vettore A. Si assuma che esista una funzione random() che restituisce un valore reale
tra 0 e 1 secondo una distribuzione di probabilit uniforme. Calcolare la complessit della funzione. Se
invece di una funzione a se stante, la stessa funzionalit fosse inclusa in una classe
DistribuzioneDiscreta, cambierebbe la complessit della generazione di un singolo valore dalla
distribuzione rappresentata da A?

Esercizio 2. Una matrice di dimensioni NxN sparsa se il numero di elementi diversi da zero
proporzionale a N o meno. Si supponga di voler rappresentare una matrice sparsa andando a
memorizzare solo gli elementi diversi da zero. A questo scopo si definisca una classe C++,
SparseMatrix, implementando il costruttore, la funzione put che assegna un valore alla posizione (i,j)
e la funzione get che restituisce il valore della matrice in posizione (i,j). Calcolare la complessit delle
tre operazioni. Discutere se la complessit ottenuta ottima.
class SparseMatrix {
SparseMatrix(int N)
void put(int i, int j, double val)
double get(int i, int j)
}

// a[i][j] = val
// restituisce a[i][j]

Esercizio 3. Il triangolo di Tartaglia una disposizione geometrica (a forma di triangolo) dei


coefficienti dello sviluppo di un binomio a+b elevato a una qualsiasi potenza n>0.

Scrivere una funzione ricorsiva C++ coefficiente(n,i) che dato lesponente n e lindice i calcoli il
coefficiente i-esimo di (a+b)n senza utilizzare altro che le somme dei coefficienti dei binomi di grado
inferiore. Ad esempio, coefficiente(2,0) restituisce 1, coefficiente(2,1) restituisce 2, coefficiente(2,2)
restituisce 1. Scrivere quindi una funzione C++ coefficienti(n) che, utilizzando la funzione
precedente, dato n, restituisce un vettore contenente tutti i coefficienti di (a+b)n.
Calcolare la complessit della funzione coefficienti(n). Ricordando che la stessa funzione in versione
iterativa vista a lezione, richiede un tempo di Theta(n2), si confronti la complessit della versione
ricorsiva e si discuta le motivazioni delleventuale similarit o differenza in termini di complessit.

Esercizio 4. Scrivere una funzione C++ che, dato un vettore, restituisce true, se il vettore
rappresenta una heap, false altrimenti. La funzione deve utilizzare il minor numero di confronti
possibili.

Esercizio 5. Data la seguente classe che implementa un albero binario:


template <class Key>
class BinTree {
public:
Key
key;
BinTree
*left;
BinTree
*right;
BinTree() {left = NULL; right = NULL;}
}
Scrivere una funzione C++ che, dato un albero binario di ricerca, contenente chiavi distinte,
determina se la radice di T contiene l'elemento mediano dell'insieme delle chiavi contenute in T.