30 ottobre 20021 Mergesort F. Bombi 30 ottobre 2002.

Slides:



Advertisements
Presentazioni simili
Metodi di Ottimizzazione University Timetabling Bombardi Fabio, Crociani Michele.
Advertisements

                      Insertion-Sort
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Capitolo 8 Array Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl.
Le gerarchie di tipi.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Mergesort1 if (n>1) /* la collezione contiene almeno due elementi. */ {1. Dividi la collezione in due di circa la metà degli elementi. 2. chiamata ricorsiva.
Algoritmi Paralleli e Distribuiti a.a. 2008/09
Algoritmi e strutture Dati - Lezione 7
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) JAVA: i commenti Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Esercitazione 2 (3 dicembre 2008)
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. A)
Algoritmi e Strutture Dati IV. Heap e Code di Priorità
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Progetto di algoritmi: metodologia "Divide et Impera"
Algoritmi di ordinamento
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
Selezione (=scelta) con “if-else”
Lalgoritmo MergeSort Applica la strategia del divide et impera Divide: suddivide la sequenza di n elementi data in due sottosequenze di n/2 elementi Impera:
Seminario Swarm Seminario su Swarm Pietro Terna web.econ.unito.it/terna.
Fondamenti di Informatica1 Ripetizioni di segmenti di codice Spesso è necessario ripetere più volte uno stesso segmento dell'algoritmo (e.g. I/O, elaborazioni.
Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),
Autovalutazione 2000/2001 Questionario per alunni della Scuola Elementare e della Scuola Media di Cles (la diapositiva cambia automaticamente ogni 15 secondi;
Fibonacci Heaps e il loro utilizzo nell’algoritmo di Prim
JAVA Franco Bombi 8 ottobre FB Introduzione Java è un linguaggio di impiego generale, basato su classi e orientato agli oggetti Java.
Elementi di Informatica di base
COMPENSAZIONE ADATTATIVA DELLE VIBRAZIONI NEGLI HARD DISK
Problema dell’ordinamento di un array: Il metodo Bubble Sort.
Analisi del movimento in ambito clinico
Passo 3: calcolo del costo minimo
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
Introduzione agli algoritmi e strutture dati 3/ed T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein Copyright © 2010 – The McGraw-Hill Companies srl.
Corso di Programmazione in Java – Esercizio n° 001
1 Applet ed HTML Fondamenti di Informatica Corso D.
28 ottobre Mergesort F. Bombi 28 ottobre 2003.
Teoria degli algoritmi e della computabilità Terza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione.
Array (ordinamento) CORDA – Informatica A. Ferrari.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
1 Un esempio con iteratore: le liste ordinate di interi.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
1 Record, tabelle, relazioni F. Bombi 1 novembre 2001.
Strutture di dati F. Bombi 23 ottobre 2002.
1 novembre I nomi in Java F. Bombi 1 novembre 2002.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
TECNICA DIVIDE ET IMPERA
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
10/10/20021 Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
Complessità Computazionale
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
Capitolo 4 Ordinamento: lower bound Ω(n log n) e MergeSort ((*) l’intera lezione) Algoritmi e Strutture Dati.
Transcript della presentazione:

30 ottobre Mergesort F. Bombi 30 ottobre 2002

2Lalgoritmo Lalgoritmo di ordinamento mergesort o per fusione è un algoritmo efficiente in quanto ha una complessità temporale O(nlog(n)) e può essere utilizzato per ordinare un vettore di oggetti Comparable oppure una lista Lalgoritmo si basa sullesistenza di un algoritmo efficiente in grado di fondere due vettori (o due liste) ordinate in un vettore (o in una lista) ordinata in un tempo O(n+m) essendo n ed m la lunghezza dei due vettori

30 ottobre Fusione di due liste ordinate Due liste l1 e l2 ordinate di lunghezza n e m possono essere fuse in ununica lista ordinata con il seguente algoritmo Sia l una nuova lista vuota mentre le due liste l1 e l2 non sono vuote se testa(l1) < testa(l2) accoda(testa(l1)) a l; l1 = resto(l1) altrimenti accoda(testa(l2)) a l; l2 = resto(l2) se l1 non è vuota accoda l1 a l altrimenti accoda l2 a l

30 ottobre 20024Analisi Ogni operazione elementare richiede un tempo costante, alla fine la lista l avrà una lunghezza pari a n+m e di conseguenza le operazioni necessarie sono n+m e quindi lalgoritmo ha una complessità O(n+m) Il numero di confronti necessari è al minimo pari a n (o m ) se una delle due liste è composta da elementi minori degli elementi dellaltra lista, è invece O(n+m) se gli elementi delle due liste sono intercalati Lalgoritmo può essere usato per fondere due vettori parzialmente riempiti in un vettore ordinato con efficienza analoga, si utilizzeranno tre cursori per tenere traccia della posizione della testa dei due vettori dorigine e della posizione della coda nel vettore risultato

30 ottobre private void merge (Lista l, Lista l1, Lista l2) { Iteratore i1 = new Iteratore(l1); Iteratore i2 = new Iteratore(l2); while (i1.hasNext() && i2.hasNext()) { if (((Comparable)i1.get()).compareTo(i2.get()) < 0) l.addLast(l1.removeFirst()); else l.addLast(l2.removeFirst()); } while (i1.hasNext()) l.addLast(l1.removeFirst()); while (i2.hasNext()) l.addLast(l2.removeFirst()); } Fusione di due liste

30 ottobre 20026Ordinare Sia l la lista da ordinare se la lista ha lunghezza > 1 copiare la lista l in due liste l1 e l2 (alternando un elemento per lista) ordinare ricorsivamente l1 ordinare ricorsivamente l2 fondere l1 e l2 in l NB: il caso base si ha quando la lista ha lunghezza 0 o 1

30 ottobre private void ms (Lista l) { Lista l1 = new Lista(); Lista l2 = new Lista(); while (l.size() > 0) { l1.addLast(l.removeFirst()); if (l.size() > 0) l2.addLast(l.removeFirst()); } if (l1.size() > 1) ms(l1); if (l2.size() > 1) ms(l2); merge(l, l1, l2); } NB: il codice effettua le chiamate ricorsive solo per liste di lunghezze maggiore di 1

30 ottobre , 7, 6, 5, 4, 3, 2, 1 8, 6, 4, 27, 5, 3, 1 8, 46, 27, 35, , 8 2, 6 3, 7 1, 5 2, 4, 6, 81, 3, 5, 7 1, 2, 3, 4, 5, 6, 7, 8 private void ms (Lista l) { Lista l1 = new Lista(); Lista l2 = new Lista(); while (l.size() > 0) { l1.addLast(l.removeFirst()); if (l.size() > 0) l2.addLast(l.removeFirst()); } if (l1.size() > 1) ms(l1); if (l2.size() > 1) ms(l2); merge(l, l1, l2); } Albero delle chiamate ricorsive per una lista di 8 elementi

30 ottobre import catena.*; public class Fusione { public Fusione (Lista x) { ms(x); } private void ms (Lista l) {…} private void merge (Lista l, Lista l1, Lista l2) {…. } }

30 ottobre import catena.*; import java.io.*; public class Ordina { public static void main (String[] arg) throws IOException { BufferedReader in = new BufferedReader(new FileReader(arg[0])); String str; Lista l = new Lista(); while ((str = in.readLine()) != null) l.addLast(str); System.out.println(l); new Fusione(l); System.out.println(l); } Ordinare le righe di un file

30 ottobre Analisi di mergesort Vogliamo dimostrare che mergesort ha una complessità temporale O(n log(n)) Supponiamo che ogni operazione sulle liste richieda un tempo costante Per semplicità supponiamo anche che la lunghezza n della lista da ordinare sia una potenza di 2 e quindi si possa dire che n = 2 k Analizziamo il tempo in funzione di k

30 ottobre A meno di costanti (inessenziali nella valutazione del comportamento asintotico dellalgoritmo) possiamo dire che: T(k) = 2 T(k-1) + 2 k T(0) = 1 La ricorrenza ha come soluzione T(k) = (k+1)2 k Infatti questo è vero per k = 0, supponendo che sia vero per un valore qualsiasi di k= k avremo che T(k) = (k+1) 2 k

30 ottobre Dobbiamo dimostrare che è vero T(k+1) = (k+1+1)2 k+1 Infatti dalla ricorrenza iniziale abbiamo: T(k+1) = 2 T(k+1-1) + 2 k+1 Dallipotesi fatta per k = k si ha: T(k+1) = 2(k+1)2 k + 2 k+1 E quindi: T(k+1) = (k+1+1)2 k+1 Che era quanto volevamo dimostrare Ora dato che k=log(n) abbiamo che T(n) = n(log(n)+1) = O(n log(n))

30 ottobre Per ordinare un vettore Dividere il vettore s d c s1d1s2d2

30 ottobre Per ordinare un vettore Fondere due vettori 214 s1 d1 s2 d2 Vettore temporaneo