[Esercizio] Merge Sort iterativo

« Older   Newer »
 
  Share  
.
  1. ~Andrey™
     
    .

    User deleted


    Vi propongo un esercizio che sto svolgendo da qualche minuto: sviluppare un metodo che riceve un vettore di interi (o di oggetti comparabili) e lo ordina in senso crescente utilizzando l'algoritmo merge sort. La particolarità dell'esercizio è che il metodo non deve essere ricorsivo e non deve effettuare chiamate ad altri metodi.

    Lo scopo è ottenere un algoritmo di ordinamento più efficiente di quello ricorsivo.

    Il mio non è finito, ma comunque aspetterò un po' prima di postarlo, vediamo se qualcuno si cimenta ^_^
     
    Top
    .
  2.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Eh, serve del tempo mi sa. Esercizio interessante comunque.
     
    Top
    .
  3. ~Andrey™
     
    .

    User deleted


    L'ho appena finito :D
     
    Top
    .
  4. lumo
     
    .

    User deleted


    Intanto ne ho fatto uno al volo in Haskell, però ricorsivo.
    Lo posto sperando che non sia una ciofeca immane.
    CODICE
    mergeSort :: Ord a => [a] -> [a]
    mergeSort [] = []
    mergeSort list@(_:[]) = list
    mergeSort list = merge (mergeSort leftHand) (mergeSort rightHand)
       where
           (leftHand, rightHand) = (splitAt (length list `div` 2) list)

    merge :: Ord a => [a] -> [a] -> [a]
    merge list1 list2
       | (null list1) = list2
       | (null list2) = list1
       | x  < y       = x : (merge xs list2)
       | x >= y       = y : (merge list1 ys)
       where
           (x:xs) = list1
           (y:ys) = list2


    A breve metto su quello iterativo.

    Edited by lumo - 22/5/2012, 19:22
     
    Top
    .
  5. ~Andrey™
     
    .

    User deleted


    Visto che nessuno ci prova posto il mio (metodo generico in Java):

    CODICE
    private enum Op {SORT, MERGE};
    @SuppressWarnings("unchecked")
    public static <T extends Comparable<? super T>> void mergeSortIte(T[] v) {
           int[] infArr = new int[500], supArr = new int[500]; Op[] op = new Op[500]; // Simulano lo stack dei parametri
           int top = 0, inf = 0, sup = v.length - 1, med; // Parametri iniziali
           infArr[top] = inf; supArr[top] = sup; op[top] = Op.SORT; top++; // Prima chiamata a mergeSort
           while (top > 0) {
                   top--;
                   inf = infArr[top]; sup = supArr[top];
                   med = (inf + sup) / 2;
                   if (op[top] == Op.MERGE) {
                           T[] aux = (T[])new Comparable[sup - inf + 1];
                           int i = inf, j = med + 1, k = 0;
                           while (i <= med && j <= sup)
                                   if (v[i].compareTo(v[j]) < 0) aux[k++] = v[i++];
                                   else aux[k++] = v[j++];
                           while (i <= med) aux[k++] = v[i++];
                           while (j <= sup) aux[k++] = v[j++];
                           for (k = 0; k < aux.length; k++)
                                   v[k + inf] = aux[k];
                   } else { // SORT
                           if (inf < sup) {
                                   // Merge
                                   infArr[top] = inf; supArr[top] = sup; op[top] = Op.MERGE;
                                   top++;
                                   // Merge Sort
                                   infArr[top] = med + 1; supArr[top] = sup; op[top] = Op.SORT;
                                   top++;
                                   // Merge Sort
                                   infArr[top] = inf; supArr[top] = med; op[top] = Op.SORT;
                                   top++;
                           }
                   }
           }
    }


    Bastava comunque simulare lo stack delle chiamate ricorsive. (Potrei aggiungere l'espansione dinamica dell'array qualora non bastasse la dimensione, ma non ne ho voglia :P)
     
    Top
    .
  6. .FDB
     
    .

    User deleted


    Andrey, per curiosità, il tuo algoritmo che costo computazionale ha?
     
    Top
    .
  7. ~Andrey™
     
    .

    User deleted


    CITAZIONE (.FDB @ 2/9/2012, 14:12) 
    Andrey, per curiosità, il tuo algoritmo che costo computazionale ha?

    Cosa vuoi sapere? La complessità esatta dell'algoritmo? (Puoi calcolarla guardando il codice)

    In generale Merge Sort ha una complessità pari a O(n * log(n)), con "n" dimensione dell'array.
     
    Top
    .
  8.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (~Andrey™ @ 6/9/2012, 02:41) 
    CITAZIONE (.FDB @ 2/9/2012, 14:12) 
    Andrey, per curiosità, il tuo algoritmo che costo computazionale ha?

    Cosa vuoi sapere? La complessità esatta dell'algoritmo? (Puoi calcolarla guardando il codice)

    La calcoli in base agli assegnamenti ed alle operazioni che svolgi? O utilizzi metodi più "fini"?
     
    Top
    .
  9. .FDB
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 6/9/2012, 02:58) 
    CITAZIONE (~Andrey™ @ 6/9/2012, 02:41) 
    Cosa vuoi sapere? La complessità esatta dell'algoritmo? (Puoi calcolarla guardando il codice)

    La calcoli in base agli assegnamenti ed alle operazioni che svolgi? O utilizzi metodi più "fini"?

    Solitamente si calcola il worst-case, ovvero il caso in cui l'algoritmo impieghi più operazioni possibili nella risoluzione del problema. In questo caso l'algoritmo ha una complessità "linearitmica" (n log n) [il logaritmo viene sempre considerato in base 2] in quanto, se non ricordo male, log n indica il numero massimo di sub-array che possono essere ottenuti mentre n sono le operazioni svolte per l'ordinamento (correggetemi se dico cazzate).
     
    Top
    .
  10.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    La mia era una domanda di carattere più generale in realtà. Però mi sono reso conto che stavo errando, in quanto la stima che avrei fatto è difficile da calcolare con algoritmi di una certa complessità (e mi riferivo alla stima T, non tramite O-grande). L'analisi asintotica è decisamente preferibile insomma (anche se meno precisa; tuttavia si tratta di "dettagli trascurabili").
     
    Top
    .
  11. .FDB
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 6/9/2012, 15:01) 
    La mia era una domanda di carattere più generale in realtà. Però mi sono reso conto che stavo errando, in quanto la stima che avrei fatto è difficile da calcolare con algoritmi di una certa complessità (e mi riferivo alla stima T, non tramite O-grande). L'analisi asintotica è decisamente preferibile insomma (anche se meno precisa; tuttavia si tratta di "dettagli trascurabili").

    An ok :asd: comunque ti consiglio un bellissimo corso che sta proponendo la Princeton University su Coursera in questo periodo che tratta di algoritmi, spiega molto bene a mio avviso anche se io (pur comprendendo praticamente ogni singola parola detta) faccio fatica a capire i concetti, per me è roba quasi avanzata Link alla classe
     
    Top
    .
  12.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Io conosco qualcosa grazie ad un libro sulla programmazione e quello su IA. Però non ho mai approfondito più di tanto l'argomento.
    Grazie per il link, domani gli darò un occhiata (il mio primo problema è invece capire ogni singola parola). ^^
     
    Top
    .
  13. lumo
     
    .

    User deleted


    CITAZIONE (.FDB @ 7/9/2012, 00:28) 
    CITAZIONE (RootkitNeo @ 6/9/2012, 15:01) 
    La mia era una domanda di carattere più generale in realtà. Però mi sono reso conto che stavo errando, in quanto la stima che avrei fatto è difficile da calcolare con algoritmi di una certa complessità (e mi riferivo alla stima T, non tramite O-grande). L'analisi asintotica è decisamente preferibile insomma (anche se meno precisa; tuttavia si tratta di "dettagli trascurabili").

    An ok :asd: comunque ti consiglio un bellissimo corso che sta proponendo la Princeton University su Coursera in questo periodo che tratta di algoritmi, spiega molto bene a mio avviso anche se io (pur comprendendo praticamente ogni singola parola detta) faccio fatica a capire i concetti, per me è roba quasi avanzata Link alla classe

    Sto seguendo vari corsi su coursera tra cui quello e devo dire che è una figata assurda.

    Edited by lumo - 7/9/2012, 01:17
     
    Top
    .
  14. .FDB
     
    .

    User deleted


    CITAZIONE (lumo @ 7/9/2012, 01:09) 
    CITAZIONE (.FDB @ 7/9/2012, 00:28) 
    An ok :asd: comunque ti consiglio un bellissimo corso che sta proponendo la Princeton University su Coursera in questo periodo che tratta di algoritmi, spiega molto bene a mio avviso anche se io (pur comprendendo praticamente ogni singola parola detta) faccio fatica a capire i concetti, per me è roba quasi avanzata Link alla classe

    Sto seguendo vari corsi su coursera tra qui quello e devo dire che è una figata assurda.

    Se avessi un po' di pecunia mi comprerei volentieri il libro io, se ha la stessa qualità del corso dev'essere veramente eccezionale!
     
    Top
    .
  15. lumo
     
    .

    User deleted


    CITAZIONE (.FDB @ 7/9/2012, 01:12) 
    CITAZIONE (lumo @ 7/9/2012, 01:09) 
    Sto seguendo vari corsi su coursera tra cui quello e devo dire che è una figata assurda.

    Se avessi un po' di pecunia mi comprerei volentieri il libro io, se ha la stessa qualità del corso dev'essere veramente eccezionale!

    Boh sinceramente trovo i libri universitari sempre un po' troppo infuffati con roba teorica, sebbene mi avessero detto che il Segdewick è un libro abbastanza afferrabile a differenza di quella bibbia mastodontica "Introdution to algorithms".
    Le lezioni invece sono veramente belle, dritte al punto, ma non sommarie. E soprattutto con molti esempi.

    (Nerdare di notte: we're doing it right)
     
    Top
    .
14 replies since 19/5/2012, 22:43   526 views
  Share  
.