Algoritmi e strutture dati
Esercizi 3
Rossano Venturini
[email protected]
7 aprile 2014
Esercizio 1
Dati k array A1 [1, n1 ], A2 [1, n2 ], . . . , Ak [1, nk ] ordinati,
1. progettare un algoritmo che stampi gli elementi che occorrono in almeno due dei k array;
2. progettare un algoritmo che stampi l’unione, senza ripetizioni, dei k
array.
Hint: utilizzare un Min-Heap.
Esercizio 2 Dato un array A[1, n] non ordinato e fissato un parametro
intero k, si vogliono restituire i k valori più grandi in A ordinati.
1. Progettare un algoritmo che risolva il problema in tempo Θ(n log n);
2. progettare un algoritmo che richieda tempo Θ(n log k);
3. [*] progettare un algoritmo che richieda tempo O(n + k log k) al caso
medio.
Esercizio 3 Si vuole progettare un algoritmo che, ricevuto in ingresso un
intero k > 0 e un Min-Heap H contenente n > 2k interi distinti, stampi i k
elementi più piccoli di H:
1. descrivere un algoritmo che richieda tempo Θ(k log n);
2. fornire un esempio di heap per n = 9 e k = 3, in cui le tre chiavi più
piccole occupano i primi tre livelli dello heap;
3. descrivere un algoritmo che richieda tempo Θ(2k k);
4. descrivere un algoritmo che richieda tempo Θ(2k log k), raffinando la
soluzione al punto precedente.
1
Esercizio 4 Sia T un albero binario di n nodi, scrivere una funzione che
verifichi se T è un albero binario di ricerca.
Esercizio 5 Provare che un qualunque algoritmo basato su confronti in
grado di costruire un albero binario di ricerca a partire da un array A[1, n]
non ordinato, richiede tempo Ω(n log n) al caso pessimo.
Hint: utilizzare il limite inferirore Ω(n log n) per l’ordinamento nel modello
a confronti.
Esercizio 6 Qual è la differenza fra la proprietà degli alberi binari di
ricerca e la proprietà Max-Heap? Mostrare che non è possibile utilizzare la
seconda per elencare in modo ordinato le chiavi di un Heap di n nodi in
tempo O(n).
Esercizio 7 Dato un array A di n interi, progettare un algoritmo che
costruisca un albero binario di ricerca di altezza Θ(log n) con gli elementi di
A in tempo Θ(n log n).
Esercizio 8 Dato un albero binario T , scrivere una funzione che calcoli il
numero di foglie di T .
Esercizio 9 Dato un albero binario T , scrivere una funzione che calcoli
l’altezza di T .
Esercizio 10 Dato un albero binario di ricerca T , scrivere una funzione
che stampi, in ordine non decrescente, le chiavi di tutti i nodi di T che hanno
profondità k.
Esercizio 11 Dato un albero binario di ricerca T , siamo interessati a
calcolare R(u) e S(u) per ogni nodo u, dove R(u) è la somma delle chiavi
che si trovano sul cammino che dalla radice porta ad u e S(u) è la somma
delle chiavi nel sottoalbero radicato in u. Fornire un algoritmo lineare per
il calcolo di R e S.
2