Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Documenti analoghi
Divide et impera. Divide et Impera

Divide et impera. Vittorio Maniezzo Università di Bologna

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Gli algoritmi ricorsivi di ordinamento. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Algoritmi di ordinamento. Sequential-sort, Bubble-sort, Quicksort

Algoritmo di ordinamento per sostituzione. Esempio : dato l array :

Allora v = v2 =

Si può fare di meglio?

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Programmazione I - Laboratorio

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Esercitazione 1. Introduzione agli algoritmi di ordinamento

Algoritmi e Strutture Dati

Algoritmi di ordinamento

Progetto Corda. Alberto Ferrari. Alberto Ferrari Ingegneria dell'informazione, UniPR. 18/12/2017 Progetto Corda

Algoritmi di Ordinamento Corso di Informatica Laurea in Fisica. prof. ing. Corrado Santoro

ALGORITMI DI ORDINAMENTO E RICERCA BINARIA. Docente: Giorgio Giacinto AA 2008/2009. problema dell ordinamento in modi diversi

Informatica (A-K) 14. Linguaggio C -4

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera:

Programmazione I - Laboratorio

Sistemi Operativi (M. Cesati)

Algoritmi di ordinamento: Array e ricorsione

Algoritmi di ordinamento

Algoritmi di ordinamento: Array e ricorsione

Gestione dinamica della memoria

Cominciamo con un esempio... Utilizzando un sottoprogramma 16/12/2017

Ricerca binaria (o dicotomica) di un elemento in un vettore

Lezione 8 Struct e qsort

Lezione 6 Struct e qsort

COMPLESSITÀ COMPUTAZIONALE. Fondamenti di Informatica A - Massimo Bertozzi

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

I puntatori /2. Ad esempio. // inizio codice. #include <stdio.h> void mostra(int); int main() {int a = 10; mostra(a); return 0;}

Esempio: Mergesort. void mergesort(int *a, int *b, int l, int r) { int i,j,k,m;

Addendum alle chiamate di sistema per la gestione processi. E Mumolo

Corso di Tecniche di Programmazione

C: panoramica. Violetta Lonati

File. Molto astratta: file ha un nome (ex. Pippo.c), ed altre caratteristiche (dimensione, tipo, etc). Operazioni: copiare, cancellare, eseguire..

MERGESORT. Abstract. In questo articolo ci proponiamo di analizzare le due tipologie ricorsive mergesort

Appunti senza pretese di P2+Lab: Pensare ricorsivamente, programmare iterativamente, parte II: Implementazione iterativa di Mergesort

Fondamenti di Informatica 2

Divide et impera (Divide and Conquer) Dividi il problema in sottoproblemi piu` semplici e risolvili ricorsivamente

Albero di Riscorsione

Quick Sort. PARTITION(A,p,r) risistema il sottoarray A[p...r] e riporta l indice q:

PROVA SCRITTA 23 MARZO 2010

Laboratorio di Algoritmi

Bubble Sort. Bubble Sort

Prima prova di esonero 2 novembre 2015

Sistemi Operativi (M. Cesati)

Fondamenti di Informatica: Ingegneria Meccanica Prova scritta del 12 luglio 2008

Fondamenti di Informatica L-A. Esercitazione 6

Esercitazione 2. Quicksort

Fondamenti di Programmazione

Sistemi Operativi (M. Cesati)

Linguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità.

Politecnico di Milano Facoltà di Ingegneria Civile, Ambientale e Territoriale. Informatica (ICA-LC) [083668]

Fondamenti di Informatica 2

ELEMENTI DI INFORMATICA. Linguaggio C

18/12/2017 Progetto Corda. Progetto Corda. Alberto Ferrari. Alberto Ferrari - unipr. file:///e:/cordanoweb/lez/array_ricerca.

Esempi di programmazione in C

L'Allocazione Dinamica della Memoria nel linguaggio C

Laboratorio di Algoritmi e Strutture Dati II Semestre 2005/2006. Ordinamenti: mergesort e quicksort

La funzione main() La funzione main(), presente in tutti i programmi C, è una funzione come tutte le altre

Aritmetica dei puntatori

Il linguaggio C. Puntatori e dintorni

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

Algoritmo di ordinamento per scambio (a bolle o bubble sort)

Due algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Gli array. impone al programma, in fase di esecuzione, di riservare dello spazio in memoria per 10 variabili di tipo int

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Funzioni come parametri

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati)

Algoritmi di ordinamento (I parte)

Esercizi per il corso di Algoritmi, anno accademico 2011/12

Per implementare l Algoritmo si devono usare 2 coppie di indici :

Algoritmi di ordinamento

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Lezione 11: Liste a Puntatori e Input/Output

Laboratorio di Programmazione Appunti sulla lezione 5: Algoritmi di ordinamento (cont.) Alessandra Raffaetà. Bubblesort

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Sistemi Operativi (M. Cesati)

Insert sort. Considero il primo elemento a 1. cerco il minimo tra gli elementi 3...N. scambio il minimo trovato con il primo e- lemento

QuickSort (1962, The Computer Journal)

Fondamenti di Informatica 12. Linguaggio C -4

Consideriamo un vettore allocato dinamicamente

Lezione 6: 12 Novembre 2013

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Laboratorio di Programmazione Appunti sulla lezione 5: Algoritmi di ordinamento (cont.) Alessandra Raffaetà

Algoritmi di ordinamento

Quicksort Moltiplicazione di interi Master Theorem Valutazione del tempo di esecuzione di algoritmi iterativi e ricorsivi

Allocazione dinamica memoria

Laboratorio di Algoritmi

Complessità algoritmi su strutture dati (riassunto)

Transcript:

Ingegneria e Scienze Informatiche - Cesena A.A. 2014-2015 pietro.dilena@unibo.it

MergeSort MergeSort MergeSort: esempio MergeSort: pseudocodice Algoritmo di ordinamento ricorsivo basato sulla tecnica Divide Et Impera. Ideato da Jon Von Neumann nel 1945 Costo computazionale: Caso pessimo: Θ(n log n) Caso medio: Θ(n log n) Caso ottimo: Θ(n log n) Algoritmo non in place: richiede O(n) di memoria ausiliaria. Implementato come algoritmo di ordinamento standard (con alcune ottimizzazioni) nelle librerie di alcuni linguaggi (Perl, Java) e alcune versioni di Linux.

MergeSort: esempio intuitivo MergeSort MergeSort: esempio MergeSort: pseudocodice

MergeSort: esempio intuitivo MergeSort MergeSort: esempio MergeSort: pseudocodice Suddivisione in sub-array di dimensione inferiore.

MergeSort: esempio intuitivo MergeSort MergeSort: esempio MergeSort: pseudocodice Suddivisione in sub-array di dimensione inferiore. Riordiniamo indipendentemente i due sotto-array (chiamate ricorsive). 2 4 5 1 3 6

MergeSort: esempio intuitivo MergeSort MergeSort: esempio MergeSort: pseudocodice Suddivisione in sub-array di dimensione inferiore. Riordiniamo indipendentemente i due sotto-array (chiamate ricorsive). 2 4 5 1 3 6 Merge dei due sotto-array ordinati (richiede memoria ausiliaria). 1 2 3 4 5 6

MergeSort: esempio intuitivo MergeSort MergeSort: esempio MergeSort: pseudocodice Suddivisione in sub-array di dimensione inferiore. Riordiniamo indipendentemente i due sotto-array (chiamate ricorsive). 2 4 5 1 3 6 Merge dei due sotto-array ordinati (richiede memoria ausiliaria). 1 2 3 4 5 6 Lista ordinata. 1 2 3 4 5 6

MergeSort: pseudocodice MergeSort MergeSort: esempio MergeSort: pseudocodice 1: procedure MergeSort(A, p, r) 2: if p < r then 3: q (p + r)/2 4: MergeSort(A, p, q) 5: MergeSort(A, q + 1, r) 6: Merge(A, p, q, r) 7: end if 8: end procedure Nota. Attenzione a come implementare il vettore di supporto B in C! 1: procedure Merge(A, p, q, r) 2: i p 3: j q + 1 4: k 1 5: while i q and j r do 6: if A[i] A[j] then 7: B[k] A[i] 8: i i + 1 9: else 10: B[k] A[j] 11: j j + 1 12: end if 13: k k + 1 14: end while 15: while i q do 16: B[k] A[i] 17: i i + 1 18: k k + 1 19: end while 20: while j r do 21: B[k] A[j] 22: j j + 1 23: k k + 1 24: end while 25: for k p to r do 26: A[k] B[k p + 1] 27: end for 28: end procedure

QuickSort QuickSort QuickSort: esempio QuickSort: pseudocodice Algoritmo di ordinamento ricorsivo basato sulla tecnica Divide Et Impera. Ideato da Tony Hoare nel 1960, in visita come studente presso la Moscow State University. Oggetto della tesi si dottorato di Robert Sedgewick nel 1975. Originariamente implementato come algoritmo di ordinamento standard nella libreria C di Unix (qsort()). Costo computazionale: Costo pessimo: Θ(n 2 ) Caso medio: Θ(n log n) Caso ottimo: Θ(n log n) Molto veloce in termini pratici, nonostante il caso pessimo quadratico. A differenza del MergeSort, il QuickSort non utilizza memoria ausiliaria (algoritmo in place).

QuickSort: esempio intuitivo QuickSort QuickSort: esempio QuickSort: pseudocodice

QuickSort: esempio intuitivo QuickSort QuickSort: esempio QuickSort: pseudocodice Scegliamo un elemento pivot random (4).

QuickSort: esempio intuitivo QuickSort QuickSort: esempio QuickSort: pseudocodice Scegliamo un elemento pivot random (4). Riorganizziamo attorno al pivot: x < pivot a sinistra, x pivot a destra. 3 2 1 6 4 5

QuickSort: esempio intuitivo QuickSort QuickSort: esempio QuickSort: pseudocodice Scegliamo un elemento pivot random (4). Riorganizziamo attorno al pivot: x < pivot a sinistra, x pivot a destra. 3 2 1 6 4 5 Riordiniamo indipendentemente i due sotto-array (chiamate ricorsive). 1 2 3 4 5 6

QuickSort: esempio intuitivo QuickSort QuickSort: esempio QuickSort: pseudocodice Scegliamo un elemento pivot random (4). Riorganizziamo attorno al pivot: x < pivot a sinistra, x pivot a destra. 3 2 1 6 4 5 Riordiniamo indipendentemente i due sotto-array (chiamate ricorsive). 1 2 3 4 5 6 Lista ordinata. 1 2 3 4 5 6

QuickSort: pseudocodice QuickSort QuickSort: esempio QuickSort: pseudocodice 1: procedure QuickSort(A, p, r) 2: if p < r then 3: q Partition(A, p, r) 4: QuickSort(A, p, q) 5: QuickSort(A, q + 1, r) 6: end if 7: end procedure 1: function Pivot(A, p, r) 2: return random number in [p,.., r] 3: end function 1: procedure Swap(A, i, j) 2: tmp A[i] 3: A[i] A[j] 4: A[j] tmp 5: end procedure 1: function Partition(A, p, r) 2: i p 3: j r 4: q Pivot(A, p, r) 5: Swap(A, q, p) 6: pivot A[p] 7: while i < j do 8: while j > p and pivot A[j] do 9: j j 1 10: end while 11: while i < r and pivot > A[i] do 12: i i + 1 13: end while 14: if i < j then 15: Swap(A, i, j) 16: end if 17: end while 18: Swap(A,p,j) 19: return j 20: end function Nota. Codice C per generare un intero random tra p e r: p + rand()%(r p + 1).

La libreria standard del C (stdlib.h) mette a disposizione una serie di implementazioni efficienti di algoritmi ordinamento In particolare: quicksort, mergesort e heapsort L interfaccia di tali implementazioni è sufficientemente generica da poter essere utilizzata con qualsiasi tipo di array di strutture La funzione di confronto tra elementi nella lista da ordinare deve essere definita dall utente

MergeSort/QuickSort in stdlib.h void qsort(void *base, size t nel, size t width, int (*compar)(const void *, const void *)); void mergesort(void *base, size t nel, size t width, int (*compar)(const void *, const void *)); base: puntatore al primo elemento della lista (convertito ad un puntatore ) nel: numero di elementi nella lista width: dimensione in byte di ogni elemento nella lista compar: puntatore ad una funzione che confronta due elementi. La funzione deve restituire un valore minore di zero, se il primo elemento deve essere posizionato prima del secondo nell ordinamento zero, se i due elementi hanno la stessa posizione nell ordinamento un valore maggiore di zero, se il primo elemento deve essere posizionato dopo il secondo nell ordinamento

MergeSort/QuickSort in stdlib.h: esempio di utilizzo con liste di interi # include <stdio.h> # include <stdlib.h> int * readlist ( char * file, int *n) { // Procedura per leggere una lista di interi } int int_compare ( const void *v1, const void * v2) { return (*( int *) v1 - *( int *) v2); } int main ( int argc, char * argv []) { int * list,i,n; list = readlist ( argv [1],& n); qsort (list,n, sizeof ( int ),int_compare ); /* mergesort (list,n, sizeof ( int ),int_compare ); */ for (i=0; i<n; i++) printf ("% d ", list [i]); printf ("\ n"); return 0; }

Confrontare i tempi di calcolo delle vostre implementazioni di mergesort e quicksort con le implementazioni fornite nella libreria C. In particolare, confrontare rispetto a Una lista (sufficientemente grande) di numeri interi generata in modo random Una lista (sufficientemente grande) di 0 e 1 generata in modo random

Nota: come generare una lista di numeri random # include <stdio.h> # include < stdlib.h> # include <time.h> int main ( int argc, char * argv []) { int i, max, size ; if( argc!=3) { fprintf ( stderr," Usage : randlist <maxint > <size >\ n"); return 1; } max=atoi ( argv [1]) ; size=atoi ( argv [2]) ; /* Inizializza il seed del generatore di numeri casuali utilizzando l orologio di sistema. */ srand ( time ( NULL )); for (i=0; i<size ; i++) printf ("% d ", rand () %( max +1) ); printf ("\ n"); return 0; }

Nota: come calcolare il tempo di CPU in un programma C # include <stdio.h> # include < stdlib.h> # include <time.h> int main ( int argc, char * argv []) { clock_t start, end ; start = clock (); // Codice della procedura end = clock (); printf (" Time : %f sec \n",( double )(end - start )/ CLOCKS_PER_SEC ); return 0; }