Algoritmi e strutture dati
Esercitazione in laboratorio del 30 maggio 2002
1. Accendere il PC e collegarsi alla sessione di Windows 2000
2. Verificare la presenza del supporto minimo per Java
a. jdk1.2 o successivo
b. JCreator Lite v. 2.00
3. Procurarsi la classe ConsoleReader (file ConsoleReader.java, disponibile sul
sito Web del corso all’indirizzo
http://www.dis.uniroma1.it/~damore/asd/listati/ConsoleReader/ConsoleReader.
java.html)
a. Trattasi di una classe per agevolare l’input da console, distribuita
assieme al volume: C. S. Horstmann. Concetti di informatica e fondamenti
di Java 2. Apogeo, 2000.
b. Esaminarne la documentazione nonché i metodi disponibili
i. readInt(), readDouble(), readLine() ecc.
ii. esempio di uso (lettura di una stringa da console):
ConsoleReader lettore = new
ConsoleReader(System.in);
String s = lettore.readLine();
iii. Attenzione: la lettura di caratteri a 8 bit (ad es., le vocali
accentate) non funziona correttamente!
4. Procurarsi la classi Sorts e Heap (v.
http://www.dis.uniroma1.it/~damore/asd/listati/lab20020530/ConfrontoSort/
), contenenti metodi che implementano: SelectionSort, InsertionSort,
MergeSort, QuickSort, HeapSort; è inoltre disponibile un metodo
(quicksort2) che implementa la variante di QuickSort in cui, se l’array da
ordinare è “piccolo”, si ricorre all’InsertionSort. I metodi lavorano su array di
Comparable. Un esempio di main che usa le due classi è disponibile nella classe
SortsTest, in cui si è fatto riferimento a un array di Integer; notare che per
ogni ordinamento eseguito viene mostrato il tempo (millisecondi) impiegato.
5. Eseguire i vari algoritmi di ordinamento cercando di individuare, per ciascuno di
essi, una tipologia di input particolarmente sfavorevole. La valutazione dovrebbe
essere basata su tempo di esecuzione (è possibile valutare il tempo di
esecuzione come mostrato nel main della classe SortsTest, sfruttando la
classe java.utils.date e il suo metodo getTime()) e/o numero di
operazioni dominanti eseguite (è necessario modificare il codice delle classi
Sorts e Heap, inserendo opportune variabili di conteggio). Si suggerisce di
creare dei file di testo con 1000, 2000, 10000, 20000 e 100000 elementi da
usare come input per i vari algoritmi (utilizzare il reindirizzamento
dell’input/output disponibile in DOS; es., java NomeClasse <
MioInput.txt, oppure java NomeClasse > MioOutput.txt).
6. Scrivere una classe ConfrontaSort allo scopo di effettuare un confronto
sperimentale fra i sei algoritmi di sort disponibili. I parametri su cui effettuare
il confronto sono tempo di esecuzione e numero di operazioni dominanti
effettuate. Il confronto dovrebbe considerare un certo numero di file in input
di dimensione via via crescente. Valutare l’andamento dei rapporti
Tempo(n )/f (n ) e #OperazioniDominanti(n )/f (n ), per f (n ) = n, f (n ) = n log2n
e f (n ) = n 2, in cui n è il numero di elementi da ordinare.