-
~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. -
.
Eh, serve del tempo mi sa. Esercizio interessante comunque. . -
~Andrey™.
User deleted
L'ho appena finito . -
lumo.
User deleted
Intanto ne ho fatto uno al volo in Haskell, però ricorsivo.
Lo posto sperando che non sia una ciofeca immane.CODICEmergeSort :: 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. -
~Andrey™.
User deleted
Visto che nessuno ci prova posto il mio (metodo generico in Java): CODICEprivate 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 ). -
.FDB.
User deleted
Andrey, per curiosità, il tuo algoritmo che costo computazionale ha? . -
~Andrey™.
User deleted
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.. -
.
La calcoli in base agli assegnamenti ed alle operazioni che svolgi? O utilizzi metodi più "fini"?. -
.FDB.
User deleted
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).. -
.
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"). . -
.FDB.
User deleted
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 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. -
.
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). ^^. -
lumo.
User deleted
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 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. -
.FDB.
User deleted
An ok 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!. -
lumo.
User deleted
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).