Esame del corso di ALGORITMI E STRUTTURE DATI - Appello del 17/7/2002 Tempo a disposizione: 120 minuti 1. Si consideri il seguente array: 7 4 1 15 3 6 10 2 Si illustri l’esecuzione dell’algoritmo Merge Sort su tale array. 2. Considerare la seguente versione del MergeSort, in cui n si assume per semplicità potenza di 2 e maggiore o uguale di 4: MergeSort(int A[1,..,n]) { if(n == 1) return; MergeSort(A[1,…,n/4]); MergeSort(A[(n/4)+1,…,(1/2)*n]; MergeSort(A[(1/2)*n+1,…,(3/4)*n]; MergeSort(A[(3/4)*n+1,…,n]); merge(A[1,…,n/4]), A[(n/4)+1,…,(1/2)*n], A[(1/2)*n+1,…,(3/4)*n], A[(3/4)*n+1,…,n]); /*merge ha costo O(n) */ return; } Mostrare che l’algoritmo ha complessità O(n logn). 3. Dire se la seguente matrice di adiacenza rappresenti o meno un grafo semplice (non diretto). Motivare la risposta. 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 4. Si consideri una classe BinSearchTree che implementi il tipo albero binario di ricerca con chiavi intere. La classe è costruita a partire dalla classe BinNode, che implementa il generico nodo dell’albero binario. Si supponga che le due classi abbiano già, tra gli altri, i seguenti campi e metodi: - int BinNode.key valore della chiave associata al nodo in considerazione. - BinNode BinNode.left figlio sinistro del nodo in considerazione. - BinNode BinNode.right figlio destro del nodo in considerazione. - BinNode BinTree.root restituisce la radice dell’albero binario di ricerca. Scrivere un metodo void ordineInverso() della classe BinSearchTree che stampi le chiavi di tutti i nodi in ordine decrescente. 5. Si definiscano le proprietà di un albero B di ordine m. Dire quale sia l’ordine di grandezza della profondità massima di un albero B di ordine m (non occorre dimostrare il risultato). Spiegare infine, in base a quanto esposto, per quale motivo gli alberi di tipo B siano usati per implementare dizionari su memoria secondaria. Es. 2: sia C(n) il costo per input di dimensione n nel caso peggiore. Allora, nel caso peggiore, avremo: C(n)<= 4C(n/4) (costo delle 4 invocazioni di MergeSort nel caso peggiore) + cn+a (costo di merge nel caso peggiore), dove a e c sono costanti opportune. Tale equazione di ricorrenza si può risolvere per sostituzione. Es. 3: la matrice di un grafo semplice deve essere simmetrica. Es. 4: Basta fare una visita simmetrica invertita (sia p il nodo generico, si mostra solo la porzione fondamentale del metodo): visita(p.right); System.out.println(p.key); visita(p.left);