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