laboratorio di asd - i progetto

Upload: alessio-chiapperini

Post on 07-Jul-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    1/35

    Laboratorio di ASDPrimo progetto

    a.a. 2006‐2007 

    Gabriele Savio ‐ Michele Di Cosmo 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    2/35

    Indice 

    1.  Introduzione ................................................. 3 

    2.  Implementazione del programma di raccolta 

    e analisi dei dati .................................................... 3 

    2.1  Generazione di numeri casuali ............. 3 

    2.2  Input (classe) ........................................ 3 

    2.2.1  getTaraRip  – Calcolo delle 

    ripetizioni della tara ...................................... 4 

    2.2.2  getTaraTime  – Calcolo del tempo 

    medio della

     tara

     ............................................

     4 

    2.3  Algoritmi (classe astratta) ..................... 4 

    2.3.1  getRipLordo  – Calcolo delle 

    ripetizioni lorde ............................................ 4 

    2.3.2  executeTest  – Calcolo del tempo 

    lordo  5 

    2.4  Funzionamento generale (classe Tester)

      5 

    2.4.1  getGranularita  – Calcolo della 

    granularità  ................................................. 5 

    2.4.2  Ciclo di test ................................... 5 

    2.5  Gerarchia .............................................. 7 

    2.6  Rilevazione dei tempi ........................... 8 

    2.7  Costanti ................................................. 8 

    3.  Descrizione ed analisi degli algoritmi ........... 9 

    3.1  BubbleSort ............................................ 9 

    3.2  InsertionSort ......................................... 9 

    3.3  MergeSort ............................................ 9 

    3.4  QuickSort ............................................. 9 

    3.5  HeapSort ............................................ 10 

    4.  Implementazione di SuperSort .................. 10 

    5.  Tabelle ........................................................ 11 

    5.1  BubbleSort ......................................... 11 

    5.2  InsertionSort ...................................... 11 

    5.3  MergeSort .......................................... 12 

    5.4  QuickSort ........................................... 12 

    5.5  HeapSort ............................................ 13 

    5.6  SuperSort ........................................... 13 

    6.  Grafici e discussione sui confronti della 

    complessità ........................................................ 14 

    6.1  BubbleSort vs. InsertionSort .............. 14 

    6.2  MergeSort vs. QuickSort .................... 14 

    6.3  InsertionSort vs. QuickSort vs. 

    SuperSort ....................................................... 15 

    6.3.1  QuickSort vs. SuperSort ............. 15 

    6.3.2  Zoom sull’intersezione ............... 16 

    6.4  MergeSort vs. QuickSort vs. HeapSort 16 

    7.  Discussione dei risultati ottenuti ............... 17 

    8.  Strumenti utilizzati ..................................... 17 

    9.  Conclusioni ................................................. 18 

    Bibliografia ......................................................... 19 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    3/35

    1. Introduzione 

    In questa analisi ci poniamo l’obiettivo di confrontare il comportamento di alcuni algoritmi di ordinamento 

    nel loro caso medio (con input casuale) in relazione alla teoria discussa nel corso. 

    E’ stato realizzato un programma in linguaggio Java atto a raccogliere i dati sperimentali ottenuti 

    eseguendo test per stimare il tempo di esecuzione degli algoritmi BubbleSort , InsertionSort , MergeSort , 

    QuickSort  e HeapSort  su un vettore di numeri interi di lunghezza 100, 200, 500, 1000, 2000, 5000, 10000. 

    Per ogni algoritmo abbiamo calcolato il tempo medio di esecuzione su diverse dimensioni di input. 

    Basandoci poi sui risultati così ottenuti abbiamo elaborato un algoritmo denominato SuperSort  che 

    ottimizza InsertionSort  e QuickSort  sfruttando il minor tempo di esecuzione del primo per input di 

    dimensione ridotta e quello del secondo per input di dimensione consistente. 

    I risultati sono stati eleborati e presentati qui in forma tabellare e grafica dando particolare risalto ai loro 

    andamenti asintotici. 

    Di seguito introduciamo l’implementazione del programma per la raccolta e l’analisi dei dati sperimentali. 

    2. Implementazione del programma di raccolta e analisi 

    dei 

    dati 

    2.1  Generazione di numeri casuali 

    Per la generazione dei numeri casuali abbiamo sfruttato la classe RandomGenerator fornita durante il 

    corso. 

    2.2  Input  (classe) 

    L’input casuale è stato realizzato tramite la classe Input istanziabile con i parametri dimension, che 

    specifica la lunghezza dell’array, e rndGen, che rappresenta una istanza di RandomGenerator (adibita alla 

    generazione di numeri casuali). 

    Si noti che in questo modo la classe RandomGenerator viene istanziata un’unica volta all’avvio del 

    programma fornendo input diversi senza la necessità di modificare il seme su istanze diverse. 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    4/35

    La classe Input fornisce i metodi copy, che restituisce un array int[   ] contenente una copia dell’input 

    rappresentato dalla classe, getTaraRip, che restituisce il numero di ripetizioni necessarie per calcolare il 

    tempo di tara e getTaraTime, che restituisce il tempo effettivo di tara. 

    2.2.1 

    getTaraRip 

    – 

    Calcolo 

    delle 

    ripetizioni 

    della 

    tara 

    Il metodo getTaraRip calcola, attraverso il codice analizzato durante il corso, il numero di ripetizioni 

    necessarie ad effettuare l’operazione copy sull’input, ovvero a copiare i dati su un vettore int[   ], in modo 

    che siano dell’ordine di grandezza che ci permetta di avere la precisione desiderata. 

    2.2.2  getTaraTime – Calcolo del tempo medio della tara 

    Il metodo getTaraTime calcola il tempo necessario a eseguire rip volte l’operazione copy sull’input, quindi 

    divide il tempo totale per il numero di ripetizioni (rip) restituendo il tempo medio dell’operazione copy. 

    2.3   Algoritmi (classe astratta) 

    L’implementazione degli algoritmi si è basata sullo pseudo‐codice elaborato durante il corso di Laboratorio. 

    Comunque, è stato necessario adattare lo pseudo‐codice al linguaggio Java. In particolare gli indici di 

    riferimento agli array sono stati modificati da 1‐based1 a 0‐based. 

    E’ stata realizzata una classe astratta Algoritmo dalla quale tutti gli algoritmi ereditano. 

    Algoritmo mette a disposizione i metodi getRipLordo per il calcolo delle ripetizioni lorde di un particolare 

    algoritmo, 

    execute per

     l’esecuzione

     unitaria

     dell’algoritmo

     ed

     

    executeTest per

     l’esecuzione

     di

     rip

     volte

     

    dell’algoritmo. In quest’ultimo caso viene restituito il tempo lordo per l’esecuzione unitaria dell’algoritmo 

    tramite execute   con  calcolato da getRipLordo. Algoritmo mette a disposizione alle classi che lo ereditano le operazioni comuni degli algoritmi: swap e 

    partition. 

    Gli algoritmi veri e propri (i.e. BubbleSort, MergeSort, ...) specificano obbligatoriamente i metodi execute

    (int[   ] input ) per l’esecuzione dell’algoritmo. 

    2.3.1  getRipLordo – Calcolo delle ripetizioni lorde 

    Il metodo getRipLordo calcola il numero di ripetizioni necessarie ad eseguire l’operazione copy su Input e 

    execute su Algoritmo affinché siano dell’ordine di grandezza che ci permetta di avere la precisione 

    desiderata. 

    1 Per 1‐based si intende un vettore il cui indice iniziale è 1 (i.e. i vettori nella convenzione del pseudo‐codice). 

    Per 0‐based

     un

     vettore

     con

     indice

     iniziale

     0 (i.e.

     i vettori

     in

     Java).

     

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    5/35

    2.3.2  executeTest  – Calcolo del tempo lordo 

    Il metodo executeTest esegue rip volte l’operazione copy su Input e execute su Algoritmo restituendo il 

    tempo medio per l’esecuzione delle due. 

    2.4 

    Funzionamento 

    generale 

    (classe 

    Tester) 

    La classe Tester è adibita a eseguire i test e presentare i risultati all’utente. 

    Vengono eseguite le seguenti operazioni di inizializzazione: 

    a) 

    Impostazione del vettore degli algoritmi e delle dimensioni su cui il test verrà eseguito e 

    istanziazione degli algoritmi 

    b) 

    Calcolo della granularità  tramite il metodo getGranularita 

    c) 

    Calcolo di

     tMin (vedi

    2

    ) d)

     

    Creazione di una istanza di RandomGenerator 

    e)  Calcolo della tara per ogni dimensione di input tramite i metodi getTaraRip e getTaraTime di 

    Input 

    Terminate tutte le operazioni di inizializzazione viene eseguito il ciclo di test (vedi par. 2.4.2), adibito al 

    calcolo vero e proprio dei dati. 

    2.4.1  getGranularita – Calcolo della granularità 

     

    Per il calcolo della granularità  utilizziamo lo pseudo‐codice visto durante il corso. 

    La granularità del sistema è la risoluzione dell’orologio di sistema e dipende dalle caratteristiche della 

    macchina e dal sistema operativo. Rappresenta la risoluzione del nostro sistema di misura. 

    2.4.2  Ciclo di test  

    Il ciclo di test è il cuore della raccolta e analisi dei dati sperimentali. 

    Inizialmente viene eseguito un ciclo sugli algoritmi da testare. 

    Successivamente viene eseguito un secondo ciclo annidato sulle dimensioni dei vettori di input. 

    Quindi si entra in un terzo ciclo annidato per eseguire totInput  volte le ripetizioni con dimensione di input 

    fissa. All’interno di questo ciclo vengono eseguite le seguenti operazioni: 

    2 Dato che l’errore di misurazione scelto è 5% ( 0,05), bisogna misurare un tempo  / che chiameremo  ·  dove  1/. Nel nostro caso avremo  20. 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    6/35

    a)  Viene istanziata una classe Input contenente numeri casuali 

    b)  Vengono calcolate le ripetizioni lorde tramite il metodo getRipLordo di Algoritmo 

    c)  Viene eseguito l’algoritmo tramite il metodo executeTest di Algoritmo e calcolato tLordo 

    Per ogni

     ciclo

     sulla

     dimensione

     viene

     calcolo

              con TaraTime e TaraRip 

    calcolati in precedenza e ∆     1  (vedi 3) usato per determinare l’intervallo di 

    confidenza. 

    3  0,05 quindi la funzione di distribuzione normale 1  1,96. 

    La 

    varianza 

    campionaria 

    è 

    invece 

    definita 

    come 

      

    ∑   ,   .

     

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    7/35

    2.5  Gerarchia 

    Fig. 1 ‐ Schema UML 

    Nota: Le  frecce “uses”  indicano che  la 

    classe  necessita  di  quella  indicata  per 

    poter  funzionare.  Le  frecce  normali 

    indicano  eredità.  Sono  stati  omessi  i 

    parametri 

    delle 

    funzioni 

    per 

    sobrietà. 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    8/35

    Tutti gli algoritmi ereditano dalla classe astratta Algoritmo. 

    Gli algoritmi, gli input e la classe RandomGenerator vengono istanziati direttamente dalla procedura main 

    di Tester. 

    Algoritmo necessita di Input,  Input necessita di RandomGenerator e Tester necessita di tutte le classi. 

    2.6  Rilevazione dei tempi 

    La rilevazione dei tempi è stata effettuata tramite la funzione System.currentTimeMillis() che 

    restituisce la differenza, misurata in millisecondi, tra il tempo attuale e la mezzanotte del primo gennaio 

    1970 UTC. 

    Il tempo viene calcolato dalla funzione executeTest memorizzando l’istante in cui viene avviata 

    l’esecuzione di ripLordo istanze di input di dimensione uguale. Al termine dell’esecuzione viene sottratto il 

    tempo attuale a quello precedentemente memorizzato, quindi diviso per ripLordo. Il procedimento viene 

    ripetuto per totInput  volte pari alla cardinalità del campione dei dati su input diversi, ma di stessa 

    dimensione. Il tempo totale viene sommato in tLordo, quindi diviso per totInput  in modo da ottenere il 

    tempo lordo per l’esecuzione unitaria dell’algoritmo. Sottraendo il tempo medio della tara al tempo lordo si 

    ottiene tMedio. 

    La scelta di totInput  è stata determinata dall’osservazione del variare dell’intervallo di confidenza con 

    diversi esperimenti. In conclusione un valore pari a 500 ci ha fornito una stima sufficientemente accurata. 

    E’ stato scelto di calcolare il numero di ripetizioni lorde necessarie per ottenere una stima accurata ogni 

    qualvolta venisse istanziato un nuovo input. Questo perché un input generato casualmente potrebbe venir 

    ordinato in un tempo inferiore a quello medio e pertanto rendere inaccurate tutte le rilevazioni effettuate 

    con quel numero di ripetizioni. 

    2.7  Costanti 

    Sono state

     usate

     le

     seguenti

     costanti:

     

    Parametro  Valore  Descrizione 

    Seed  12345  Seme usato da RandomGenerator 

    totInput  500  Istanze del problema (campione dei dati) 

    tMinFatt  5 %  Errore di misurazione minimo ammesso 

      5 %  Esperimenti “cattivi” consentiti 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    9/35

    3. Descrizione ed analisi degli algoritmi 

    3.1  BubbleSort  

    BubbleSort 

    opera 

    scambiando 

    ripetutamente 

    gli 

    elementi 

    adiacenti 

    che 

    non 

    sono 

    ordinati. 

    (Vedi 

    appendice) 

    E’ un algoritmo in‐place e ha complessità nel caso medio Θ. 

    3.2  InsertionSort  

    InsertionSort opera scandendo gli elementi del vettore e inserendoli uno ad uno creando una porzione 

    ordinata del vettore. (Vedi appendice) 

    E’ un algoritmo in‐place efficiente per ordinare un piccolo numero di elementi. Ha complessità nel caso 

    medio Ο. 

    3.3  MergeSort  

    MergeSort è un algoritmo divide et impera che si divide in tre passi: 1) divide l’array a metà; 2) ordina 

    ricorsivamente i due sotto‐array; 3) combina i due sotto‐array tramite un’operazione di Merge. (Vedi 

    appendice) 

    E’ un algoritmo non in‐place perché la procedura Merge fa uso di un vettore ausiliario. Ha complessità nel 

    caso medio

     Θlog. 

    3.4  QuickSort  

    QuickSort è anch’esso un algoritmo divide et impera che si divide in due passi: 1) partiziona l’array tramite 

    la procedura Partition in due sotto‐array tali che ogni elemento del primo sia minore o uguale ad ogni 

    elemento del secondo; 2) ordina ricorsivamente i due sotto‐array. (Vedi appendice) 

    E’ un algoritmo in‐place con complessità nel caso medio Θlog. 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    10/35

    10 

    3.5  HeapSort  

    HeapSort fa uso della struttura dati heap binario4. Opera trasformando l’array di input in una max‐heap 

    tramite la procedura Build-Max-Heap quindi isola la radice (elemento massimo) diminuendo la dimensione 

    della heap e ricostruisce la Max‐Heap fino a quando essa contiene un solo elemento. (Vedi appendice) 

    E’ un algoritmo in‐place perché la heap viene creata sul vettore stesso di input e i numeri ordinati viengono 

    scritti nella parte dell’array non utilizzata dalla heap. Ha complessità nel caso medio Θlog. 

    4. Implementazione di SuperSort  

    Per definire SuperSort abbiamo creato una variante ottimizzata di QuickSort che sfrutta la logica 

    dell’algoritmo InsertionSort quando la dimensione della porzione del vettore da ordinare è minore di una 

    costante  23 ottenuta analizzando sperimentalmente l’andamento di QuickSort e InsertionSort per un intorno di quelle dimensioni (Grafico 5). (Vedi appendice) 

    Sperimentalmente l’analisi dell’andamento di SuperSort mostra che questa ottimizzazione porta a risultati 

    migliori di QuickSort e InsertionSort (Grafico 5). 

    4 Un heap binario è un albero quasi‐completo (dove al più l’ultimo livello non è completo) in cui per ogni nodo , suo 

    figlio sinistro e suo figlio destro hanno   se max‐heap,   se min‐heap. Gli heap sono

     facilmente

     astraibili

     con

     un

     array.

     

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    11/35

    11 

    5. Tabelle 

    5.1  BubbleSort  

    Dimensione 

     

    (ms) 

    ∆ 

    100  0,04651132 0,00065345 

    200  0,19358528 0,00186868 

    500  1,22663323 0,00751779 

    1.000  4,88183009 0,02096474 

    2.000  19,33478251 0,06594697 

    5.000  120,68626697 0,24930691 

    10.000 

    488,23728590 0,80984848 

    Tabella 1 BubbleSort 5.2  InsertionSort  

    Dimensione   (ms)  ∆ 20  0,00090130  0,00005229 

    22  0,00117964  0,00006711 

    25  0,00211966  0,00009983 

    27 

    0,00283034 

    0,00010082 

    30  0,00338565  0,00011112 

    100  0,01692947  0,00067249 

    200  0,05232697  0,00133433 

    500  0,31523047  0,00361702 

    1.000  1,25857539  0,01010853 

    2.000  5,05570130  0,03253404 

    5.000 

    31,53726697 

    0,12220216 

    10.000  128,63578590  0,36066356 

    Tabella 2 InsertionSort 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    12/35

    12 

    5.3  MergeSort  

    Dimensione   (ms)  ∆ 100  0,04783971  0,00064583 

    200 

    0,10019670 

    0,00128948 

    500  0,25924933  0,00319480 

    1.000  0,54040438  0,00632333 

    2.000  1,12835039  0,01340325 

    5.000  2,98157387  0,03350689 

    10.000  6,44205221  0,07194485 

    Tabella 3 MergeSort 

    5.4 

    QuickSort  

    Dimensione   (ms)  ∆ 20  0,00112556  0,00006559 

    22  0,00164684  0,00008800 

    25  0,00175486  0,00009401 

    27  0,00154499  0,00007430 

    30  0,00195073  0,00009638 

    100 

    0,00863412 

    0,00027761 

    200  0,02042939  0,00058420 

    500  0,09500950  0,00339026 

    1.000  0,23962539  0,00700631 

    2.000  0,51707368  0,01538605 

    5.000  1,19446648  0,04321511 

    10.000  2,36016754  0,08689184 

    Tabella 4 QuickSort

     

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    13/35

    13 

    5.5  HeapSort  

    Dimensione   (ms)  ∆ 100  0,02144417  0,00043223 

    200 

    0,04872353 

    0,00089396 

    500  0,14086080  0,00233500 

    1.000  0,30641316  0,00475792 

    2.000  0,67663084  0,01033735 

    5.000  1,86855921  0,02666333 

    10.000  4,05616864  0,05613868 

    Tabella 5 HeapSort 

    5.6 

    SuperSort  

    Dimensione   (ms)  ∆ 20  0,00089380  0,00004988 

    22  0,00103655  0,00005460 

    25  0,00119389  0,00005965 

    27  0,00130817  0,00006661 

    30  0,00151031  0,00007182 

    100 

    0,00736295 

    0,00026318 

    200  0,01761005  0,00053509 

    500  0,05261323  0,00141684 

    1.000  0,11814652  0,00301975 

    2.000  0,26202100  0,00643948 

    5.000  0,73965388  0,01674467 

    10.000  1,66480147  0,04378098 

    Tabella 6 SuperSort

     

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    14/35

    14 

    6. Grafici e discussione sui confronti della complessità 

    6.1  BubbleSort  vs. InsertionSort  

    Grafico 1 BubbleSort vs. InsertionSort 

      Errore asintotico standard % err.BubbleSortTrend     4,87907 · 10  5,320 · 10  0,10900 % InsertionSortTrend     1,28486 · 10  2,412 · 10  0,18770 % 

    6.2 

    MergeSort  

    vs. 

    QuickSort  

    Grafico 2 MergeSort vs. QuickSort 

      Errore asintotico standard % err.MergeSortTrend     4,85910 · 10 · log   2,742 · 10  0,56420 % QuickSortTrend     1,82076 · 10 · log   4,498 · 10  2,47000 % 

    0

    100

    200

    300

    400

    500

    600

    100 200 500 1000 2000 5000 10000

        t    M    e     d     i    o     (    m    s     )

    Dimensione dell'input

    BubbleSort

    InsertionSort

    BubbleSortTrend

    InsertionSortTrend

    0

    1

    2

    3

    4

    5

    6

    7

    100 200 500 1000 2000 5000 10000

        t    M    e     d     i    o     (    m    s     )

    Dimensione dell'input

    MergeSort

    QuickSort

    MergeSortTrend

    QuickSortTrend

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    15/35

    15 

    6.3  InsertionSort  vs. QuickSort  vs. SuperSort  

    Grafico 3 InsertionSort vs. QuickSort vs. SuperSort 

      Errore asintotico standard % err.InsertionSortTrend     1,28486 · 10  2,412 · 10  0,18770 % QuickSortTrend     1,82076 · 10 · log   4,498 · 10  2,47000 % SuperSortTrend     1,24282 · 10 · log   8,284 · 10  0,66650 % 

    6.3.1 

    QuickSort  

    vs. 

    SuperSort  

    Grafico 4 QuickSort vs. SuperSort 

    0

    20

    40

    60

    80

    100

    120

    140

    100 200 500 1000 2000 5000 10000

        t    M    e     d     i    o     (    m    s     )

    Dimensione dell'input

    InsertionSort

    QuickSort

    SuperSort

    InsertionSortTrend

    QuickSortTrend

    SuperSortTrend

    0,0

    0,5

    1,0

    1,5

    2,0

    2,5

    3,0

    100 200 500 1000 2000 5000 10000

        t    M    e     d     i    o     (    m    s     )

    Dimensione dell'input

    QuickSort

    SuperSort

    QuickSortTrend

    SuperSortTrend

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    16/35

    16 

    6.3.2  Zoom sull’intersezione 

    Grafico 5 Zoom di InsertionSort vs. QuickSort vs. SuperSort 

    6.4  MergeSort  vs. QuickSort  vs. HeapSort  

    Grafico 6 MergeSort vs. QuickSort vs. HeapSort 

      Errore asintotico standard % err.MergeSortTrend     4,85910 · 10 · log   2,742 · 10  0,56420 % QuickSortTrend     1,82076 · 10 · log   4,498 · 10  2,47000 % HeapSortTrend     3,05156 · 10 · log   3,051 · 10  0,09998 % 

    0,0000

    0,0005

    0,0010

    0,0015

    0,0020

    0,0025

    0,0030

    0,0035

    0,0040

    20 22 25 27 30

        t    M    e     d     i    o     (    m    s     )

    Dimensione dell'input

    InsertionSort

    QuickSort

    SuperSort

    0

    1

    2

    3

    4

    5

    6

    7

    100 200 500 1000 2000 5000 10000

        t    M    e     d     i    o     (    m

        s     )

    Dimensione dell'input

    MergeSort

    QuickSort

    HeapSort

    MergeSortTrend

    QuickSortTrend

    HeapSortTrend

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    17/35

    17 

    7. Discussione dei risultati ottenuti 

    Di seguito esponiamo le nostre analisi. 

    Dal 

    Grafico 

    possiamo 

    confrontare 

    l’andamento 

    dei 

    due 

    algoritmi 

    di 

    complessità 

    quadratica: 

    BubbleSort 

    InsertionSort. 

    Notiamo 

    che 

    BubbleSort 

    impiega 

    notevolmente 

    più 

    tempo 

    ordinare 

    input 

    di 

    grandi 

    dimensioni rispetto a InsertionSort; peraltro questo comportamento era ampiamente previsto dagli studi 

    teorici 

    dato 

    che 

    l’algoritmo 

    BubbleSort 

    esegue 

    sempre 

    comunque 

    confronti. 

    Al 

    contrario, 

    InsertionSort 

    esegue solo  confronti  in caso di elementi già ordinati. 

    Dal 

    Grafico 

    dal 

    Grafico 

    possiamo 

    osservare 

    con 

    attenzione 

    l’andamento 

    dei 

    tre 

    algoritmi 

    di 

    complessità Θ log . Gli studi teorici non avevano messo in risalto le costanti moltiplicative di tali 

    algoritmi, 

    precludondoci 

    la 

    possibilità 

    di 

    analizzare 

    quale 

    fosse 

    effettivamente 

    il 

    più 

    efficiente. 

    Dai dati osserviamo che MergeSort risulta il “più lento” fra i tre analizzati, nel senso che richiede più 

    elaborazione per ordinare vettori di grandi dimensioni. 

    Al contrario QuickSort si pone come la migliore scelta tra i tre ordinando in un tempo minore sia di 

    MergeSort che di HeapSort. 

    Dopo esserci posti il problema di dover creare un algoritmo che avesse una costante moltiplicativa migliore 

    rispetto 

    agli 

    altri 

    algoritmi 

    studiati, 

    abbiamo 

    deciso 

    di 

    usare 

    due 

    algoritmi 

    che 

    su 

    dimensioni 

    differenti 

    si 

    comportavano meglio: InsertionSort su piccole dimensioni e QuickSort su grandi dimensioni (Grafico 5). 

    Abbiamo 

    quindi 

    creato 

    SuperSort: 

    una 

    variante 

    di 

    QuickSort 

    che 

    richiama 

    al 

    suo 

    interno 

    InsertionSort 

    quando QuickSort si trova a trattare input di dimensione minore di  23 (con  ottenuto empiricamente 

    osservando il Grafico 5) (vedasi paragrafo 4, pag. 10). Quindi abbiamo analizzato il comportamento di 

    quest’ultimo 

    che, 

    in 

    relazione 

    QuickSort 

    agli 

    altri 

    algoritmi, 

    risulta 

    esser 

    migliore 

    (vedasi 

    paragrafo 

    6.3.1). 

    8. 

    Strumenti 

    utilizzati 

    Per l’esecuzione del programma di raccolta e analisi dei dati sperimentali è stato utilizzato un calcolatore 

    con processore Intel Pentium 4 con una frequenza di 3,00 GHz e 1,00 GB di RAM. La macchina è stata 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    18/35

    18 

    eseguita su una clean‐install5 del sistema operativo è Windows XP Home Edition con Service Pack 2 su cui 

    sono stati installati J2SDK 1.4.2.13, JavaSE‐RE 6 e BlueJ 2.1.3. 

    Per la post‐elaborazione dei dati sono stati usati Microsoft Excel 2007. 

    Le funzioni interpolanti sono state ottenute con il metodo fit di gnuPlot 4.2.0 compilato su piattaforma 

    win32. Tale metodo utilizza un’implementazione dell’algoritmo NLLS (“nonlinear lest‐squares Marquardt‐

    Levenberg algorithm”). 

    Per la presentazione dei dati sono stati usati Microsoft Word 2007 e Microsoft Visio 2007. 

    9. Conclusioni 

    In conclusione possiamo dire che lo studio sperimentale degli algoritmi basati su confronto studiati durante 

    il corso, ci ha permesso di confrontarci con molte problematiche sull’implementazione degli algoritmi, sulla 

    rilevazione dei tempi infinitesimali del calcolatore e su una realizzazione gerarchica flessibile del codice. 

    Inoltre, queste problematiche ci hanno aiutato a comprendere il valore di una buona analisi statistica, come 

    ad esempio la scelta di un buon campione di esperimenti. 

    Abbiamo compreso l’importanza di escegliere un buon algoritmo adeguato alle proprie esigenze e di 

    migliorarlo in

     base

     alla

     situazione

     specifica.

     

    Concludendo possiamo affermare che le analisi sperimentali si sono rivelate complementari e necessarie 

    agli studi teorici. 

    5

     Per

     clean

    ‐install

     si

     intende

     un

     sistema

     operativo

     appena

     installato

     senza

     applicativi

     addizionali.

     

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    19/35

    19 

    Bibliografia 

    ‐  Introduzione agli algoritmi e strutture dati (T. H. Cormin, C. E. Leiserson, R. L. Rivest, C. Stein) 

    McGraw‐Hill  – 2° edizione 

    ‐ Java

      –

     fondamenti

     di

     progettazione

     software

     (J.

     Lewis,

     W.

     Loftus)

     Addison

    ‐Wesley

      –

     1°

     edizione

     

    ‐  Dispense del corso di Laboratorio di algoritmi e strutture dati (S. Scalabrin) 2007 

    ‐  Appunti del corso di Algoritmi e strutture dati 

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    20/35

    1 / ** Quest a cl asse cont i ene i l codi ce per esegui r e i t est sugl i al gor i t mi2   * e present are al l ' ut ent e i r i sul t at i3   *4   *5   * @aut hor ( G. Savi o, M. Di Cosmo)6   * @ver si on ( 23/ 04/ 2007 - 23. 48)7   * /89 publ i c  c l ass  Test er

    10 {

    11   publ i c  st at i c  f i nal   i nt   seed = 12345; / / Seme per l a generazi one di vet t ori connumer i casual i12   publ i c  st at i c  f i nal   i nt   t ot I nput = 500; / / Numer o di vol t e che l ' al gor i t mo vi ene

    esegui t o su un dat o i nput13   publ i c  st at i c  f i nal   i nt   t Mi nFat t = 5; / / % Er r or e ammesso14   publ i c  st at i c  f i nal   doubl e  del t aConst = 1. 96; / / Cost ant e di del t a, vedi t abel l a.15   publ i c  st at i c  i nt [ ] i nput Di mensi on; / / Di mensi one degl i i nput16   publ i c  st at i c  i nt [ ] i nput Tar aRi p; / / N° di r i pet i z i oni del l a t ar a per una

    det ermi nat a di mensi one di i nput17   publ i c  st at i c  l ong[ ] i nput Tar aTi me; / / Tempo del l a t ara per una det ermi nat a

    di mensi one di i nput18   publ i c  st at i c  l ong  granul ar i t a; / / Granul ar i t à19   publ i c  st at i c  l ong  t Mi n; / / t Mi n20   publ i c  st at i c  Al gori t mo  al gor i t mi [ ] ; / / Ar r ay di al gor i t mi su cui ver r à esegui t o

      i l t est

    21   publ i c  st at i c  RandomGener at or   r ndGen;22  23   publ i c  st at i c  voi d  mai n( St r i ng[ ] a rgs ){24   mai n( ) ;25   }26  27   publ i c  st at i c  voi d  mai n( ) {28  29   l ong  st ar t Ti me = Syst em. cur rent Ti meMi l l i s ( ) ;30  31   Syst em. out . pr i nt l n ( " " ) ;32   Syst em. out . pr i nt l n ( " >" ) ;33  34   / ** Modi f i care l e seguent i i mpostaz i oni per ot t enere i r i sul t at i vol ut i ** /35

    36   / / I mpost o l e di mensi oni degl i i nput37   i nput Di mensi on = new  i nt [ 7 ] ;38   i nput Di mensi on[ 0] = 100;39   i nput Di mensi on[ 1] = 200;40   i nput Di mensi on[ 2] = 500;41   i nput Di mensi on[ 3] = 1000;42   i nput Di mensi on[ 4] = 2000;43   i nput Di mensi on[ 5] = 5000;44   i nput Di mensi on[ 6] = 10000;4546   / / I mpost o gl i al gor i t mi47   al gori t mi = new  Al gori t mo[ 6 ] ;48   al gor i t mi [ 0] = new  Super Sor t ( ) ;49   al gor i t mi [ 1] = new  Qui ckSor t ( ) ;50   al gor i t mi [ 2] = new  HeapSor t ( ) ;

    51   al gor i t mi [ 3] = new  Mer geSor t ( ) ;52   al gor i t mi [ 4] = new  I nser t i onSor t ( ) ;53   al gor i t mi [ 5] = new  Bubbl eSor t ( ) ;54  55   / ** Fi ne sezi one i mpost azi oni ut ent e **/56  57   / * * I ni t * */58   / / Cal col o l a granul ar i t à59   gr anul ar i t a = get Gr anul ar i t a( ) ;60   Syst em. out . pr i nt l n ( "% Gr anul ari t à = "   + gr anul ari t a);61  62   / / Cal col o t Mi n63   l ong  t Mi nGr anCoef f = ( l ong) ( ( f l oat ) 1 / ( ( f l oat ) t Mi nFat t / ( f l oat ) 100) ) ;64   t Mi n = gr anul ari t a * t Mi nGr anCoef f ;65   Syst em. out . pr i nt l n ( " % Er r or e ammess o = "   + t Mi nFat t + " %" ) ;

    66   Syst em. out . pr i nt l n ( "% t Mi n = "   + t Mi n + " ( granul ar i t à * "   + t Mi nGr anCoef f +" )" ) ;

    67   Syst em. out . pr i nt l n ( "% Cost ant e di del t a = "   + del t aConst ) ;68  69   r ndGen = new  RandomGener at or ( seed) ;

    20

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    21/35

    70   Syst em. out . pr i nt l n ( " % Seme = "   + seed) ;71  72   Syst em. out . pr i nt l n ( "% Ri pet i z i one degl i al gor i t mi su i nput di ver si = "   +

    t ot I nput ) ;73  74   / / Scr i vo l e di mensi oni75   Syst em. out . pr i nt ( " % Di mensi oni =" ) ;76   f or   ( i nt   i = 0; i < i nput Di mensi on. l engt h; i ++) {77   Syst em. out . pr i nt ( " "   + i nput Di mensi on[ i ] ) ;78   }

    79   Syst em. out . pr i nt l n ( " " ) ;80  81   / / Sc r i vo gl i al gor i t mi82   Syst em. out . pr i nt ( "% Al gor i t mi =" ) ;83   f or   ( i nt   i = 0; i < al gor i t mi . l engt h; i ++) {84   Syst em. out . pr i nt ( " "   + al gor i t mi [ i ] . get Name( ) ) ;85   }86   Syst em. out . pr i nt l n ( " " ) ;87  88   / ** Tar a **/89   / / Cal col o l a t ara degl i i nput90   i nput Tar aRi p = new  i nt [ i nput Di mensi on. l engt h] ;91   i nput TaraTi me = new  l ong[ i nput Di mensi on. l engt h] ;92   f or   ( i nt   i = 0; i < i nput Di mensi on. l engt h; i ++) {93   Syst em. out . pr i nt ( "Cal col o del l a t ar a per l a di mensi one "  + i nput Di mensi on

    [ i ] + " . . . " ) ;94  95   I nput   i nput = new  I nput ( r ndGen, i nput Di mensi on[ i ] ) ;96  97   i nput Tar aRi p[ i ] = i nput . get Tar aRi p( t Mi n) ;98   Syst em. out . pr i nt ( " r i p="   + i nput Tar aRi p[ i ] ) ;99  

    100   i nput Tar aTi me[ i ] = i nput . get TaraTi me( i nput TaraRi p[ i ] ) ;101   Syst em. out . pr i nt l n ( " t i me="   + i nput Tar aTi me[i ] ) ;102  103   }104  105   Syst em. out . pr i nt l n ( " " ) ;106   Syst em. out . pr i nt l n ( "* Tabel l a tara") ;107   Syst em. out . pr i nt l n ( " i dx\ t di m\ t t ar aRi p\ t t ar aTi me" ) ;

    108   f or   ( i nt   i = 0; i < i nput Di mensi on. l engt h; i ++) {109   Syst em. out . pr i nt l n ( i + " \ t "   + i nputDi mensi on[ i ] + " \ t "   + i nput Tar aRi p[ i ] +

      " \ t "   + i nput Tar aTi me[ i ] ) ;110   }111  112   / ** Al gor i t mi ** /113   Syst em. out . pr i nt l n ( " " ) ;114   Syst em. out . pr i nt l n ( "* Tabel l a esecuzi one al gor i t mi " ) ;115   Syst em. out . pr i nt l n ( " i dxAl g\ t i dxDi m\ t Al g. \ t Di m. \ t 1°r i pLor do\ t t Lor do\ t t Lor do 2̂\

    t t Medi o\ t Del t a\ t Ti me" ) ;116   f or   ( i nt   al g = 0; al g < al gori t mi . l engt h; al g++) {117   / ** Di mensi oni **/118   f or   ( i nt   di m = 0; di m < i nput Di mensi on. l engt h; di m++) {119  120   Syst em. out . pr i nt ( al g) ;

    121   Syst em. out . pr i nt ( " \ t "   + di m) ;122   Syst em. out . pr i nt ( " \ t "   + al gori t mi [ al g] . get Name( ) ) ;123   Syst em. out . pr i nt ( " \ t "   + i nputDi mensi on[ di m] ) ;124  125   / / I st anzi o e azzer o t Lor do126   doubl e  t Lor do = 0;127   doubl e  t Lor doQuadr at o = 0;128  129   l ong  t ot I nput Ti me = Syst em. cur r ent Ti meMi l l i s ( ) ;130  131   / ** I nput di ver s i esegui t i r i pLor do vol t e ** /132   f or   ( i nt   nI nput = 0; nI nput < t ot I nput ; nI nput ++) {133  134   / / Gener o l ' i nput135   I nput   i nput = new  I nput ( r ndGen, i nputDi mensi on[ di m] ) ;

    136  137   / / Cal col o r i pLordo138   i nt   r i pLor do = al gor i t mi [ al g] . get Ri pLor do( t Mi n, i nput ) ;139  140   i f   ( nI nput == 0) {

    21

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    22/35

    141   Syst em. out . pr i nt ( " \ t "   + r i pLor do);142   }143  144   / / Aggi ungo i l t empo l ordo i mpi egato a t Lor do145   doubl e  t Al g = al gor i t mi [ al g] . execut eTest ( i nput , r i pLor do) ;146   t Lor do = t Lor do + t Al g;147   t LordoQuadr at o = t LordoQuadr at o + ( t Al g * t Al g) ;148  149   }150   t Lor do = t Lor do / t ot I nput ;

    151   t LordoQuadr at o = t LordoQuadr at o / t ot I nput ;152   Syst em. out . pr i nt ( " \ t "   + t Lordo) ;153  154   Syst em. out . pr i nt ( " \ t "   + t Lor doQuadrat o) ;155  156   / / t Medi o157   doubl e  t Medi o = ( t Lor do - ( ( doubl e) i nput Tar aTi me[ di m] / ( doubl e)

    i nput Tar aRi p[ di m] ) ) ;158   Syst em. out . pr i nt ( " \ t "   + t Medi o) ;159  160   / / Del t a161   doubl e  Del t a = ( 1 / Mat h. sqr t ( t ot I nput ) * del t aConst * ( Mat h. s qr t

    ( t Lor doQuadr ato - ( t Medi o * t Medi o)) ) ) ;162   Syst em. out . pr i nt ( " \ t "   + Del t a) ;163  

    164   Syst em. cur r ent Ti meMi l l i s ( ) ;165   Syst em. out . pr i nt ( " \ t "   + ( Syst em. cur r ent Ti meMi l l i s ( ) - t ot I nput Ti me) ) ;166  167   Syst em. out . pr i nt l n ( " " ) ;168  169   }170   }171  172   / / Fi ne173   Syst em. out . pr i nt l n ( " " ) ;174   Syst em. out . pr i nt l n ( " < Ter mi nat o ( "   + ( Syst em. cur r ent Ti meMi l l i s ( ) - s t ar t Ti me)

    + " ms" ) ;175  176   }177  

    178   publ i c  st at i c  voi d  Test ( i nt   seed) {179  180   Syst em. out . pr i nt l n ( " " ) ;181   Syst em. out . pr i nt l n ( "Test s t art ed wi t h seed "   + seed) ;182  183   r ndGen = new  RandomGener at or ( seed) ;184  185   I nput   i nput = new  I nput ( r ndGen, 1000) ;186   i nt [ ] vect = i nput . copy() ;187  188   Syst em. out . pr i nt ( "bef or e: " ) ;189   dumpVect ( vect ) ;190  191   Al gori t mo  al g = new  Qui ckSor t ( ) ;192   Syst em. out . pr i nt ( " execut i ng "   + al g. getName( ) + " . . . " ) ;

    193  194   l ong  t 0 = Syst em. cur rent Ti meMi l l i s ( ) ;195   al g. execut e( vect ) ;196   l ong  t 1 = Syst em. cur rent Ti meMi l l i s ( ) ;197   Syst em. out . pr i nt l n ( " done i n "  + ( t 1- t 0) + " ms" ) ;198  199   Syst em. out . pr i nt ( " a f t e r : " ) ;200   dumpVect ( vect ) ;201  202   Syst em. out . pr i nt l n ( "Checki ng vect or . . . " ) ;203   i nt   val ue = vect [ 0] ;204   f or   ( i nt   i = 0; i < vect . l engt h; i ++) {205   i f   ( val ue > vect [ i ] ) {206   Syst em. out . pr i nt l n ( " ! ERROR ! @"   + i ) ;207   re turn;

    208   }el se{209   val ue = vect [ i ] ;210   }211   }212  

    22

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    23/35

    213   Syst em. out . pr i nt l n ( " Test ended") ;214   Syst em. out . pr i nt l n ( " " ) ;215   }216  217   publ i c  st at i c  l ong  get Gr anul ar i t a( ) {218   / / Cal col a l a granul ar i t à219  220   l ong  t 0 = Syst em. cur rent Ti meMi l l i s ( ) ;221   l ong  t 1 = Syst em. cur rent Ti meMi l l i s ( ) ;222  

    223   whi l e  ( t 0 == t 1) {224   t 1=Syst em. cur r ent Ti meMi l l i s ( ) ;225   }226  227   re turn  ( t 1 - t 0 ) ;228  229   }230  231   pr i vat e  s t at i c  voi d  dumpVect ( i nt [ ] vec t ){232   Syst em. out . pr i nt ( " VECT: [ "   + vect . l ength + " ] " ) ;233   f or   ( i nt   i = 0; i < vect . l engt h; i ++) {234   Syst em. out . pr i nt ( " "   + vect[ i ] ) ;235   }236   Syst em. out . pr i nt l n ( " " ) ;237   }

    238  239 }240

    23

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    24/35

    1 / **2   * Quest a cl asse ast r att a i mpl ement a l e f unzi oni di base di un al gori t mo3   * per i l t e st4   *5   * @aut hor ( G. Savi o, M. Di Cosmo)6   * @ver si on ( 23/ 04/ 2007 - 23. 48)7   * /89 publ i c  abst r act   c l ass  Al gori t mo

    10 {

    11  12   publ i c  st at i c  f i nal   i nt   ci c l i Er r at i = 5;13  14   publ i c  abst r act   St r i ng  get Name( ) ;1516   / / I mpl ement a l ' esecuzi one ver a e pr opr i a del l ' al gor i t mo17   publ i c  abst r act   voi d  execut e( i nt [ ] i nput ) ;18  19   publ i c  doubl e  execut eTest ( I nput   i nput , i nt   r i p) {20   / / Esegue l ' al gor i t mo sul l ' i nput passat o r i p vol t e21   / / Vi ene rest i t ui t o t Lordo22  23   doubl e  t 0 = Syst em. cur r ent Ti meMi l l i s ( ) ;24  25   f or   ( i nt   i = 0; i < r i p; i ++) {

    26 / / Syst em. out . pr i nt l n ( "esecuzi one " + i + " / " + r i p) ;27   execut e( i nput . copy( ) ) ;28   }29  30   doubl e  t 1 = Syst em. cur r ent Ti meMi l l i s ( ) ;31 / / Syst em. out . pr i nt l n ( " Tempo su un ci cl o r i p da " + r i p + ": " + ( t 1 - t 0) + "ms") ;32  33   return  ( t 1 - t 0) / r i p;34  35   }36  37   publ i c  i nt   get Ri pLor do( l ong  t Mi n, I nput   i nput ) {38   / / Cal col a r i pLor do per questo al gor i t mo39  40   l ong  t 0 = 0;

    41   l ong  t 1 = 0;42   i nt   r i p = 1;43   i nt [ ] vect = i nput . copy() ;44  45   whi l e  ( t 1 - t 0

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    25/35

    76   }77  78   return  max;79  80   }81  82   pr ot ect ed  st at i c  voi d  swap( i nt [ ] vet t , i nt   i , i nt   j ) {83   / / Scambi a l ' el ement o i con j nel vet t or e vet t84   i nt   t emp=vet t [ i ] ;85   vet t [ i ] =vet t [ j ] ;

    86   vet t [ j ] =t emp;87   }88  89   pr ot ect ed  st at i c  i nt   par t i t i on( i nt [ ] vet t , i nt   p, i nt   r ) {90   / / Esegue l a procedura par t i t i on sul vet t ore vet t dal l ' i ndi ce p al l ' i ndi ce r91   i nt   x = vet t [ r ] ;92   i nt   i = p - 1;93   f or   ( i nt   j = p; j < r ; j ++) {94   i f   ( vet t [ j ]

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    26/35

    1 / **2   * I mpl ement a l ' al gor i t mo Bubbl eSort3   *4   * @aut hor ( G. Savi o, M. Di Cosmo)5   * @ver si on ( 23/ 04/ 2007 - 23. 48)6   * /78 publ i c  c l ass  Bubbl eSor t   ext ends  Al gori t mo9 {

    10  

    11   publ i c  St r i ng  get Name( ) {12   return  "Bubbl eSort " ;13   }1415   publ i c  voi d  execut e ( i nt [ ] i nput ) {16  17   i nt   n = i nput . l engt h - 1;18  19   f or   ( i nt   j = n; j > 0; j - - ) {20   f or   ( i nt   i = 0; i < j ; i ++) {21   i f   ( i nput [ i ] > i nput [ i +1 ] ){22   swap( i nput , i , i +1) ;23   }24   }25   }

    26  27   }2829 }30

    26

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    27/35

    1 / **2   * I mpl ement a l ' al gor i t mo Mer geSort3   *4   * @aut hor ( G. Savi o, M. Di Cosmo)5   * @ver si on ( 23/ 04/ 2007 - 23. 48)6   * /78 publ i c  c l ass  Mer geSor t   ext ends  Al gor i t mo9 {

    10  

    11   publ i c  St r i ng  get Name( ) {12   return  " Mer geSor t " ;13   }1415   publ i c  voi d  execut e( i nt [ ] i nput ) {16   execut e( i nput , 0, i nput . l engt h - 1) ;17   }18  19   publ i c  voi d  execut e( i nt [ ] i nput , i nt   p, i nt   r ) {20   i f   ( p < r ) {21   i nt   q = ( i nt ) Mat h. f l oor ( ( p + r ) / 2) ;22   execut e( i nput , p, q) ;23   execut e( i nput , q+1, r ) ;24   Mer ge( i nput , p, q, r ) ;25   }

    26   }27  28   pr i vat e  voi d  Mer ge( i nt [ ] vet t , i nt   p, i nt   q, i nt   r ) {29   i nt   i = p;30   i nt   j = q + 1;31   i nt [ ] t empvet t = new  i nt [ r - p + 1] ;3233   f or   ( i nt   k = 0; k < r - p + 1; k++) {34   i f   ( ( i

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    28/35

    1 / **2   * I mpl ement a l ' al gor i t mo I nsert i onSor t3   *4   * @aut hor ( G. Savi o, M. Di Cosmo)5   * @ver si on ( 23/ 04/ 2007 - 23. 48)6   * /78 publ i c  c l ass  I nser t i onSor t   ext ends  Al gori t mo9 {

    10  

    11   publ i c  St r i ng  get Name( ) {12   return  " I nser t i onSor t " ;13   }1415   publ i c  voi d  execut e ( i nt [ ] i nput ) {16  17   i nt   n = i nput . l engt h;18  19   f or   ( i nt   j = 1; j < n; j ++) {20   i nt   t emp = i nput [ j ] ;21   i nt   i = j - 1;22   whi l e  ( ( i >= 0) && ( i nput [ i ] > t emp) ) {23   i nput [ i + 1] = i nput [ i ] ;24   i - - ;25   }

    26   i nput [ i + 1] = t emp;27   }28  29   }3031 }

    28

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    29/35

    1 / **2   * I mpl ement a l ' al gor i t mo HeapSor t3   *4   * @aut hor ( G. Savi o, M. Di Cosmo)5   * @ver si on ( 23/ 04/ 2007 - 23. 48)6   * /78 publ i c  c l ass  HeapSor t   ext ends  Al gori t mo9 {

    10  

    11   pr i vat e  i nt   heapsi ze = 0;1213   publ i c  St r i ng  get Name( ) {14   return  " HeapSor t " ;15   }1617   publ i c  voi d  execut e( i nt [ ] i nput ) {18   bui l dHeap( i nput ) ;19   f or   ( i nt   i = i nput . l engt h - 1; i > 0; i - - ) {20   swap( i nput , 0, i ) ;21   heapsi ze- - ;22   heapi f y( i nput , 0) ;23   }24   }25  

    26   pr i vat e  i nt   l ef t ( i nt   i ) {return  2* i ; }27   pr i vat e  i nt   r i ght ( i nt   i ) {return  2* i +1; }28   pr i vat e  i nt   par ent ( i nt   i ) {return  ( i nt ) Mat h. f l oor ( i / 2) ; }29  30   pr i vat e  voi d  bui l dHeap( i nt [ ] v e t t ) {31   heapsi ze = vet t . l engt h - 1;32   f or   ( i nt   i = ( i nt ) Mat h. f l oor ( ( v et t . l engt h - 1) / 2) ; i >= 0; i - - ) {33   heapi f y( v et t , i ) ;34   }35   }36  37   pr i vat e  voi d  heapi f y( i nt [ ] vet t , i nt   i ) {38   i nt   max;39   i nt   l = l ef t ( i ) ;40   i nt   r = r i ght ( i ) ;

    41   i f   ( ( l vet t [ i ] ) ) {42   max = l ;43   }el s e{44   max = i ;45   }46   i f   ( ( r = vet t [ max] ) ) {47   max = r ;48   }49   i f   ( max ! = i ) {50   swap( vet t , i , max);51   heapi f y(vet t , max);52   }53   }54  55 }

    29

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    30/35

    1 / **2   * I mpl ement a l ' al gor i t mo Mer geSort3   *4   * @aut hor ( G. Savi o, M. Di Cosmo)5   * @ver si on ( 23/ 04/ 2007 - 23. 48)6   * /78 publ i c  c l ass  Qui ckSor t   ext ends  Al gor i t mo9 {

    10  

    11   publ i c  St r i ng  get Name( ) {12   return  "Qui ckSort " ;13   }1415   publ i c  voi d  execut e( i nt [ ] i nput ) {16   execut e( i nput , 0, i nput . l engt h - 1) ;17   }18  19   publ i c  voi d  execut e( i nt [ ] i nput , i nt   p, i nt   r ) {20   i f   ( p < r ) {21   i nt   q = par t i t i on ( i nput , p, r ) ;22   execut e( i nput , p, q- 1) ;23   execut e( i nput , q + 1, r ) ;24   }25   }

    26  27 }

    30

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    31/35

    1 / **2   * I mpl ement a l ' al gor i t mo Super Sor t3   *4   * @aut hor ( G. Savi o, M. Di Cosmo)5   * @ver si on ( 23/ 04/ 2007 - 23. 48)6   * /78 publ i c  c l ass  Super Sor t   ext ends  Al gor i t mo9 {

    10  

    11   publ i c  st at i c  f i nal   i nt   k = 23;1213   publ i c  St r i ng  get Name( ) {14   return  "SuperSor t " ;15   }16  17   publ i c  voi d  execut e( i nt [ ] i nput ) {18   execut e( i nput , 0, i nput . l engt h - 1) ;19   }20  21   publ i c  voi d  execut e( i nt [ ] i nput , i nt   p, i nt   r ) {22   i f   ( r - p t emp) ) {38   i nput [ i + 1] = i nput [ i ] ;39   i - - ;40   }

    41   i nput [ i + 1] = t emp;42   }43   }44  45 }

    31

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    32/35

    1 / **2   * Rappr esent azi one di un i nput vet t or i al e3   *4   * @aut hor ( G. Savi o, M. Di Cosmo)5   * @ver si on ( 23/ 04/ 2007 - 23. 48)6   * /78 publ i c  c l ass  I nput9 {

    10  

    11   publ i c  st at i c  f i nal   i nt   ci c l i Er r at i = 5;12   pr i vat e  RandomGener at or   r ndGen;1314   pr i vat e  i nt [ ] i nput Vector ;1516   publ i c  I nput ( RandomGener at or   r ndGen, i nt   di mensi on) {17   / / Cr ea un ar r ay di di mensi one di mensi on18   t hi s. r ndGen = r ndGen;19   i nput Vect or = new  i nt [ di mensi on] ;20   popul at e( ) ;21   }22  23   pr i vat e  voi d  popul at e( ) {24   / / Popol a l ' ar r ay con val or i casual i25   f or   ( i nt   i = 0; i < i nput Vect or. l engt h; i ++) {

    26   i nput Vect or [ i ] = ( i nt ) Mat h. r ound ( r ndGen. get( ) * i nput Vect or . l engt h) ;27   }28   }29  30   publ i c  i nt [ ] copy( ){31   / / Rest i t ui sce un i nput i n format o i nt [ ] dupl i cat o da quel l o rappr esent at o

    dal l a c l asse32   i nt [ ] ret = new  i nt [ i nput Vector . l engt h] ;33   f or   ( i nt   i = 0; i < i nput Vect or. l engt h; i ++) {34   re t [ i ] = i nput Vec tor [ i ] ;35   }36   return  r e t ;37   }38  39   publ i c  l ong  get TaraTi me( i nt   tareRi p) {

    40   / / Rest i t ui sce i l t empo di t ar a per quest o i nput41  42   l ong  t 0 = Syst em. cur r ent Ti meMi l l i s ( ) ;43  44   f or   ( i nt   i = 0; i < t ar eRi p; i ++) {45   copy() ;46   }47  48   l ong  t 1 = Syst em. cur r ent Ti meMi l l i s ( ) ;49  50   return  ( t 1 - t 0 ) ;51   }52  53   publ i c  i nt   get Tar aRi p( l ong  t Mi n) {54   / / Rest i t ui sce l e r i pet i z i oni mi ni me per l a t ara

    55  56   l ong  t 0 = 0;57   l ong  t 1 = 0;58  59   i nt   r i p = 1;60  61   whi l e  ( t 1 - t 0

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    33/35

    75   i nt   mi n = r i p / 2;76  77   whi l e  ( max - mi n >= ci cl i Er r at i ) {78  79   r i p = ( max + mi n) / 2;80   t 0 = Syst em. cur r ent Ti meMi l l i s ( ) ;81  82   f or   ( i nt   i = 1; i

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    34/35

    1 / /2 / / Cl asse che genera numeri casual i ,3 / / mi gl i or e del r andom di s i st ema4 / /5 publ i c  c l ass  RandomGener at or   {6   / /7   / / get( ) : r est i t ui sce un numero compr eso t r a 0 e 189   publ i c  doubl e  get ( )

    10   {

    11   / /12   / / Cost ant i13   / /14   f i nal   i nt   a = 16087;15   f i nal   i nt   m = 2147483647;16   f i nal   i nt   q = 127773;17   f i nal   i nt   r = 2836;1819   / /20   / / Var i abi l i21   / /22   doubl e  l o, hi , t est ;2324   hi = Mat h. cei l ( seed / q) ;25   l o = seed - q * hi ;

    26   t est = a * l o - r * hi ;27   i f   ( t est < 0. 0) {28   seed = t est + m;29   } el s e  {30   seed = t est ;31   } / * endi f * /32   return  seed / m;33   }3435   / /36   / / get Seed( ) : r est i t ui sce i l val or e cor r ent e del seme37   / /38   publ i c  doubl e  get Seed( )39   {40   return  seed;

    41   }4243   / /44   / / setSeed( s) : i mpost a i l val or e del seme a s45   / /46   publ i c  voi d  set Seed( doubl e  s)47   {48   seed = s;49   }5051   / /52   / / cost r ut t ore del l a cl asse, genera un' i st anza di RandomGenerat or,53   / / f i ssando i l seme i ni z i al e a s .54   / /55   publ i c  RandomGener at or ( doubl e  s)

    56   {57   seed = s;58   }5960   pr i vat e  doubl e  seed;6162   / /63   / / esempi o di uso del l a cl asse RandomGenerat or,64   / / st ampa 10 numer i casual i compr esi t r a 1 e 10065   / /66   publ i c  s t at i c  voi d  mai n( St r i ng[ ] args)67   {68   l ong  n, i ;69   / /70   / / cr ea un i st anza del l a cl asse RandomGenerat or

    71   / /72   RandomGener at or   r = new  RandomGener at or ( 123456789) ;7374   Syst em. out . pr i nt l n( " I l val ore i ni z i al e del seme e' : "   + r . get Seed( ) ) ;75

    34

  • 8/19/2019 Laboratorio Di ASD - I Progetto

    35/35

    76   f or   ( i = 1; i