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.