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?