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,…),

Slides:



Advertisements
Presentazioni simili
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
Advertisements

Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Dallalgoritmo minimax allalgoritmo alfa-beta. MINIMAX int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO.
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.
Esercizi su alberi binari
Tail recursion: esempio
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.
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari di ricerca
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Usa la tecnica del.
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati Introduzione. Gli argomenti di oggi Analisi della bontà degli algoritmi Modello Computazionale Tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati (Mod. B)
Progetto di algoritmi: metodologia "Divide et Impera"
APPUNTI SUL LINGUAGGIO C
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su alberi binari
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:
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
La Programmazione Ricorsiva
Calcolo del Massimo Comun Divisore
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
30 ottobre Mergesort F. Bombi 30 ottobre 2002.
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Corso di informatica Athena – Periti Informatici
Massimo Comun Divisore
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.
Esercizi su File.
Esercizi Liste.
Esercizi su File e Liste
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Teoria degli algoritmi e della computabilità Terza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
11/21/2014E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo –
Esercitazioni su liste
alberi completamente sbilanciati
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Soluzione 6: Algoritmo Quicksort
TECNICA DIVIDE ET IMPERA
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Prog2 a.a. 2001/ Albero binario di ricerca Un albero binario di ricerca é un albero binario in cui ogni nodo ha un’etichetta.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
APPUNTI SUL LINGUAGGIO C
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C Alberi Binari – primi esercizi
Transcript della presentazione:

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,…), (SPLIT) 2. Ordina le due liste separatamente (MERGESORT) 3. Fondi le due liste ottenute (ordinate) in una unica lista ordinata (MERGE)

MERGE (di due liste ordinate L 1,L 2 M) Algoritmo dipende dalla rappresentazione delle liste Usiamo LISTE A PUNTATORI: ogni elemento della lista è una struttura typedef struct CELL *LIST struct CELL{ int element /* elemento della lista*/ LIST next /* puntatore alla successiva struttura (elemento)*/ } (a 1,a 2,…,a n ) a 1 a 2 … a n

MERGE (di due liste ordinate L 1,L 2 M) -Trova il minimo tra il primo elemento di L1 e di L2, rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti -LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else if (list1->element element) /* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ { list1->next=merge(list1->next, list2); return list1; } else /*entrambe le liste non vuote ed il primo elemento di list2 è minore del primo di list1*/ { list2->next=merge(list1, list2->next); return list2; }

MERGE (di due liste ordinate L 1,L 2 M) -Trova il minimo tra il primo elemento di L1 e di L2, rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti -LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else if (list1->element element) /* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ { list1->next=merge(list1->next, list2); return list1; } else /*entrambe le liste non vuote ed il primo elemento di list2 è minore del primo di list1*/ { list2->next=merge(list1, list2->next); return list2; }

MERGE (di due liste ordinate L 1,L 2 M) -Trova il minimo tra il primo elemento di L1 e di L2, rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti -LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else /* entrambe le liste non vuote*/ if (list1->element element) /* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ { list1->next=merge(list1->next, list2); return list1; } else /*entrambe le liste non vuote ed il primo elemento di list2 è minore del primo di list1*/ { list2->next=merge(list1, list2->next); return list2; }

MERGE (di due liste ordinate L 1,L 2 M) LIST merge (LIST list1, LIST list2) { if (list1==NULL) return list2 else if ( list2== NULL) return list1 else if ( list1->element element ) {/* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ list1->next=merge(list1->next, list2); return list1;} else …} list1 a 1 a 2 … a n list2 b 1 b 2 … b n a 2 … a n list1 a 1 merge b 1 … b n

MERGE (di due liste ordinate L 1,L 2 M) list list list1=merge(list1, list2) merge (2-4-7, )

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, )

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9)

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9)

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9)

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9) = merge(, ) merge(7, 9)

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9) = merge(, ) merge(7, 9) = merge(NULL, )= merge(, 9) 9

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9) = merge(, ) = merge(7, 9) 7

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, )= merge(7, 6-9) 6

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) merge(4-7, 5-6-9) = merge(, ) = merge(7, 5-6-9) 5

MERGE (di due liste ordinate L 1,L 2 M) list list Merge(list1, list2) merge (2-4-7, ) merge( list2) merge(4-7, ) = merge(, ) = merge(4-7, 5-6-9) 4

MERGE (di due liste ordinate L 1,L 2 M) list list list1=merge(list1, list2) merge (2-4-7, ) merge( list2)=list2 merge(4-7, ) list2 3

MERGE (di due liste ordinate L 1,L 2 M) list list list1=merge(list1, list2) merge (2-4-7, ) list1 2

SPLIT (di L in due liste ordinate L 1,L 2 ) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell; } L=(a 1,a 2, a 3, a 4, …, a n ) L 1 =(a 1, a 3, …), L 2 =(a 2, a 4, …)

SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n

SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n pSecondcell

SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n pSecondcell

SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n Split di pSecondcell

MERGESORT BASE: Se la lista contiene 0 o 1 elemento, stop Ind.: Split di (a 1,a 2, …) in (a 1,a 3,…) e (a 2,a 4,…) Mergesort delle due liste separatamente Merge delle 2 liste ordinate

MERGESORT LIST Mergesort (LIST list) { List SecondList; if (list==NULL) return NULL else if (list->next==NULL) return list else {/* list contiene almeno 2 elementi (da ordinare)*/ SecondList=split(list); return merge(mergesort(list),mergesort(ScondList)); } BASE: Se la lista contiene 0 o 1 elemento, stop Ind.: Split di (a 1,a 2, …) in (a 1,a 3,…) e (a 2,a 4,…) Mergesort delle due liste separatamente Merge delle 2 liste ordinate

R.T. della funzione SPLIT LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} Sia n=|list|. Si ha la relazione di ricorrenza T(0)=T(1)=O(1) T(n)=c+T(n-2), per n>1 Quindi T(n)=O(n)

R.T. del MERGE LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else if (list1->element element) { list1->next=merge(list1->next, list2); return list1; } else { list2->next=merge(list1, list2->next); return list2;} } Siano n1=|list1|, n2=|list2|, n=n1+n2. Si ha la relazione di ricorrenza T(0)=T(1)=O(1) (almeno 1 lista vuota) T(n)=c+T(n-1), per n>1 Quindi T(n)=O(n)

R.T. MERGESORT LIST Mergesort (LIST list) {List SecondList; if (list==NULL) return NULL else if (list->next==NULL) return list else /* list contiene almeno 2 elementi (da ordinare)*/ {SecondList=split(list); return merge(mergesort(list),mergesort(ScondList));} } Sia n=|list|. Si ha la relazione di ricorrenza T(0)=T(1)=O(1) (list contiene 0 o 1 elemento) T(n)=O(n) + O(n) +T(n/2) +T(n/2) =O(n) + 2 T(n/2), per n>1 Quindi T(n)=O(n log n)

R.T. MERGESORT T(0)=T(1)=O(1) T(n)=c n + 2 T(n/2), per n>1 Si assuma per semplicità che n=2 m (cioè m=log n) T(2 m )=c 2 m + 2 T(2 m-1 ) =c 2 m + 2 (c 2 m T(2 m-2 ))= c 2 m + c 2 m +4 T(2 m-2 ) = 2c 2 m + 4 T(2 m-2 ) = 2c 2 m +4 (c 2 m T(2 m-3 ))=2c 2 m + c 2 m +8T(2 m-3 ) = 3c 2 m + 8 T(2 m-3 ) …… = i c 2 m + 2 i T(2 m-i ) Scegliendo i=m=log n si ha T(n)= T(2 m ) = m c 2 m + 2 m T(2 0 )= m c n + n a= = c n log n + a n = O(n log n)

Correttezza MERGESORT LIST Mergesort (LIST list) {List SecondList; if (list==NULL) return NULL else if (list->next==NULL) return list else /* list contiene almeno 2 elementi (da ordinare)*/ {SecondList=split(list); return merge(mergesort(list),mergesort(ScondList));} } Assumiamo correttezza delle funz.split e merge (esercizio) Per induzione completa su n=|list|. Base. Se n=0 o n=1, restituisce lista inalterata, ok. Passo (n>1). Assumiamo per i.i. mergesort(list), mergesort(ScondList) restituiscono liste input ordinate. Quindi Split divide gli elementi lista input con n elementi tra list e Secondlist; mergesort(list),mergesort(ScondList) ordina le liste; Merge fonde le liste restituendo in output una lista ordinata contenete gli stessi n elementi della lista input.