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.

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
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.
Strutture dati lineari
Lez. 51 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Complessita'
Lez. 10a1 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Strategie per.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
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.
Heap Sort. L’algoritmo heap sort è il più lento di quelli di ordinamento O(n * log n) ma, a differenza degli altri (fusione e quick sort) non richiede.
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
Esercizi su alberi binari di ricerca
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.
Algoritmi e Strutture Dati
Esercizio 4 Data una stringa P di lunghezza m e definita sullalfabeto, scrivere un programma PERL per calcolare la seguente funzione: PREFIX_FUNCTION:
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
Progetto di algoritmi: metodologia "Divide et Impera"
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
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:
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
memoria gestita staticamente:
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,…),
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
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
void binario(int n); …………………
Massimo Comun Divisore
Programmazione di Calcolatori
Programmazione di Calcolatori
Esercizi Liste.
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Esercizi su alberi binari di ricerca
I vettori Le grandezze fisiche si dividono in Direzione
28 ottobre Mergesort F. Bombi 28 ottobre 2003.
ALGORITMI a.
Algoritmi CHE COS’è UN ALGORITMO di ORDINAMENTO?
A LGORITMI DI ORDINAMENTO Cinzia Reverberi. COS’È UN ALGORITMO? Un algoritmo è un insieme ben ordinato di operazioni non ambigue ed effettivamente calcolabili.
Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.
Array (ordinamento) CORDA – Informatica A. Ferrari.
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
CORSO DI PROGRAMMAZIONE II
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Esercizi.
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
Quick sort void quick_sort (int a[],int l, int r) { int i, j,v, t; if (r>l) { v=a[r];//L’elemento “pivot” è quello più a dx i=l-1; j=r; // i scorre da.
L’ALGORITMO Un algoritmo è un procedimento formale che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante.
Divide et Impera Parte 11 - Risoluzione di problemi per divisione in sottoproblemi “bilanciati” Corso A: Prof. Stefano Berardi
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Divide et Impera Quicksort Mergesort Charles Antony Richard Hoare
Divide et Impera Quicksort Mergesort
Transcript della presentazione:

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 di mergesort sulla prima metà. 3. chiamata ricorsiva di mergesort sulla seconda metà. 4. fusione (merging) delle due metà ordinate. } Pseudocodice per il mergesort

mergesort2 Implementazione su liste concatenate if (n>1) /* la lista concatenata contiene almeno due elementi. */ {1. Dividi la lista in due metà. /* passo 1 ha un costo lineare, opera localmente */ 2. chiamata ricorsiva di mergesort sulla prima metà. 3. chiamata ricorsiva di mergesort sulla seconda metà. 4. fusione (merging) delle due metà ordinate. /*passo 4 ha un costo lineare, opera localmente */ }

mergesort3 Due modi di dividere una lista in due sottoliste di circa uguale lunghezza: Idea 1: Si creano una lista contenente gli elementi di posto pari, e una con quelli di posto dispari ( solo spostando puntatori) Idea 2: Si usa usano due puntatori per scorrere la lista, uno avanza di un record alla volta e laltro di due, quando il secondo ha raggiunto la fine della lista, si usa il primo puntatore come puntatore iniziale della seconda lista. Implementazione su liste concatenate

mergesort4 Implementazione su vettori if (n>1) /* il vettore contiene almeno due elementi. */ {1. Dividi il vettore in due metà. /*Passo 1 facile: costo costante */ 2. chiamata ricorsiva di mergesort sulla prima metà. 3. chiamata ricorsiva di mergesort sulla seconda metà. 4. fusione (merging) delle due metà ordinate /* Passo 4 ha costo lineare nella somma delle dimensioni dei due vettori da fondere e necessita di un vettore di appoggio */ }

mergesort5 void merge_sort (ELEMENT v[], int start, int end) { int middle; if (start < end) /* ci sono almeno 2 elementi */ { middle = (start + end) / 2; /* calcola il punto mediano */ merge_sort (v, start, middle); merge_sort (v, middle+1, end); merge (v, start, middle, end); /* fonde le due metà ordinate */ } Implementazione su vettori:

mergesort6 void merge(ELEMENT v[], int start, int middle, int end) { /* fonde i sottovettori v[start..middle] e v[middle+1..end], restituendo il risultato in v. *prec: v[start]<=…<=v[middle] && v[middle+1]<=…<=v[end] Postc: v[start]<=…<=v[end] */ ELEMENT a[]; int m = start, p = middle +1,q = start; /* m è l'indice di scorrimento della prima metà, p della seconda, q del nuovo vettore nel quale viene temporaneamente memorizzato il vettore ordinato risultante */ while ((m <= middle) && (p <= end)) /*invariante: a[start]<=…<=a[q] */ if (v[m] <= v[p]) {a[q] = v[m]; m = m+1;} else {a[q] = v[p]; p = p+1;} q = q+1;} if (m end) ha provocato l'uscita dal while */ do a[q] = v[m]; m = m+1; q = q+1 while (q > end); /* l'uscita si è avuta per (m > middle), non c'è bisogno di fare niente: gli elementi v[p],...,v[end] sono già al posto giusto */ for (m = start; m < q; m++) v[m] = a[m]; }

mergesort m p q m p Chiamata merge(v,0,3, 7); uscita (p > end) while ((m <= middle) && (p <= end)) { if (v[m] <= v[p]) {a[q] = v[m]; m = m+1;} else {a[q] = v[p]; p = p+1;} q = q+1;} if (m end) ha provocato l'uscita dal while */ do a[q] = v[m]; m = m+1; q = q+1 while (q > end); v= a= v=

mergesort m p q q Chiamata merge(V,0,3, 7); uscita (p > end) while ((m <= middle) && (p <= end)) { if (v[m] <= v[p]) {a[q] = v[m]; m = m+1;} else {a[q] = v[p]; p = p+1;} q = q+1;} if (m end) ha provocato l'uscita dal while */ do a[q] = v[m]; m = m+1; q = q+1 while (q > end); v= a=

mergesort m p q m p Chiamata merge(v,0,3, 7);uscita (m > middle) while ((m <= middle) && (p <= end)) { if (v[m] <= v[p]) {a[q] = v[m]; m = m+1;} else {a[q] = v[p]; p = p+1;} q = q+1;} if (m end) ha provocato l'uscita dal while */ do a[q] = v[m]; m = m+1; q = q+1 while (q > end); /* l'uscita si è avuta per (m > middle) : gli elementi v[p],...,v[end] sono già al posto giusto */ for (m = start; m < q; m++) v[m] = a[m]; v= a= v=

mergesort10 while ((m <= middle) && (p <= end)) /*invariante: a[start]<=…<=a[q] */ if (v[m] <= v[p]) {a[q] = v[m]; m = m+1;} else {a[q] = v[p]; p = p+1;} q = q+1;} Invariante vero allinizio, perchè q=start. Supponendo vero linvariante all(i-1)-sima esecuzione, con m < middle e p < end, facciamo vedere che è vero per li-sima, formalmente: Dimostriamo che a[start] a[start]<=…<=a[i] dopo li-sima esecuzione. Caso 1: i=q e ((m=m e p = p+1) Caso 2 : i=q e (m = m+1 e p = p) Caso 1 v[m] <= v[p] ? Se sì caso 1.1 se no caso 1.2. Caso 1.1 a[q] = v[m], è a[q-1] <=a[q] ? Sì perché a[q-1] = v[p] e v[p] <= v[m] Caso 1.2 a[q] = v[p], è a[q-1] <=a[q] ? Sì perché a[q-1] = v[p] e v[p] <= v[p] Caso 2 v[m] <= v[p] ? Se sì caso 2.1 se no caso 2.2. Caso 2.1 a[q] = v[m], è a[q-1] <=a[q] ? Sì perché a[q-1] = v[m] e v[m] <= v[m] Caso 2.2 a[q] = v[p], è a[q-1] <=a[q] ? Sì perché a[q-1] = v[m] e v[m] <= v[p]

mergesort11 mergeSort(a,0, 3); mergeSort(a,2,3); mergeSort(a,0,1); merge(a,0,1,1); mergeS(a,0,0); mergeS(a,1,1); merge(a,0,1,3); merge(a,2,2,3); mergeSort(a,2,2);mergeS(a,3,3);

mergesort12 Supponiamo il numero degli elementi n sia pari a 2 h e valutiamo l albero delle chiamate della merge: al livello 0 num. chiamate = 1, ciascuna di costo <= 2 h, tot. <= 2 h al livello 1 num. chiamate = 2, ciascuna di costo <= 2 h-1,tot. <= 2 h al livello 2 num. chiamate = 4, ciascuna di costo <= 2 h-2,tot. <= 2 h... al livello h num. chiamate <=2 h, ciascuna di costo =1, tot. <= 2 h In totale costo <= h *2 h, cioè costo <= n*log 2 (n)