Algoritmi e strutture dati Esercitazione in laboratorio del 5 giugno 2003 (questa pagina è disponibilke alla URL http://www.dis.uniroma1.it/~damore/asd/laboratorio/200203/20030605/Esercitazione3ASDCan1.doc) La classe JBSTtreeDemo fornisce un’interfaccia grafica che consente di lavorare con un albero binario di ricerca: l’albero è la variabile tree della classe. Per utilizzare l’interfaccia occorre selezionare l’operazione da compiere tramite il corrispondente radio button, introdurre i dati nel campo di testo opportuno e premere il bottone “Go”. Il campo di testo "last op (ms)" visualizzerà automaticamente una stima del tempo di esecuzione (ms) dell'l'ultima operazione eseguita. Il radio button “Exercise” e i due campi di testo “exercise 1” ed “exercise 2” sono stati inseriti nell'interfaccia allo scopo di consentire la definizione di un'ulteriore operazione, richiesta durante la presente esercitazione. Per programmare l’operazione è sufficiente modificare il metodo exercise(). Gli elementi del BST sono istanze della classe asd_library.BaseObject, che essenzialmente è una classe wrapper di interi che implementa l’interfaccia Comparable. 1. Compiere uno studio sperimentale delle prestazioni del BST, rispetto all’operazione di inserimento. In particolare, prenderemo in esame l’inserimento di: Chiavi casuali uniformemente distribuite in un intervallo Chiavi monotone crescenti (caso peggiore) Chiavi casuali con polarizzazione monotona crescente. I costi da valutare sono: Il tempo approssimativo impiegato per compiere un’operazione L’altezza del BST. Dunque si richiede di compilare le seguenti tabelle: Tempo operaz. n=1000 n=10000 n=100000 n=1000 n=10000 n=100000 Unif. distrib. Monotona Polarizzata k=1 Polarizzata k=4 Altezza BST Unif. distrib. Monotona Polarizzata k=1 Polarizzata k=4 L’operazione che introduce n chiavi con distribuzione uniforme è già implementata. Invece occorre implementare: l’operazione che introduce, nell’ordine, n chiavi: 1, 2, 3, ..., n; l’operazione che introduce n chiavi con distribuzione polarizzata. Si generano n valori nell’intervallo [0, max]. Alla i-esimo valore generato in tale intervallo si somma l'addendo i*k*max/n. In tal modo, si ottengono chiavi generate con distribuzione uniformi in intervalli "mobili". Per esempio per k=1: o 1° estrazione: unif. distr. in [0+1*max/n, max+1*max/n] o 2° estrazione: unif. distr. in [0+2*max/n, max+2*max/n] o ... o n° estrazione: unif. distr. in [0+max, max+max] I valori di n e k devono essere forniti in input; un valore adeguato per max può essere 1000000. Attenzione! Prima di calcolare i prodotti, si consiglia di convertire gli int in long, per evitare il trabocco. In seguito, riconvertire la chiave generata in int. Nota: per generare un valore uniformemente distribuito in [0, max], si può invocare il metodo rand.nextInt(max). Nota2: verificare che la chiave che si vuole inserire non sia già presente nell’albero! Per esempio, vedere come funziona il metodo randomInsert(). 2. Aggiungere un’operazione “RangeSearch” che, ricevendo in input due chiavi a, b, restituisca ordinatamente tutte le chiavi appartenenti all’intervallo [a, b]. Suggerimento: quale algoritmo di visita può essere utilizzato per visitare ordinatamente tutti i nodi del BST?