Corso di Tecniche di Programmazione



Похожие документы
Corso di Tecniche di Programmazione

10 - Programmare con gli Array

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

Semplici Algoritmi di Ordinamento

Algoritmi di Ricerca. Esempi di programmi Java

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

Algoritmi di ordinamento

Esempi di algoritmi. Lezione III

Algoritmi e Strutture Dati

GESTIONE INFORMATICA DEI DATI AZIENDALI

Informatica 3. LEZIONE 21: Ricerca su liste e tecniche di hashing. Modulo 1: Algoritmi sequenziali e basati su liste Modulo 2: Hashing

Complessità Computazionale

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Esercizi per il corso di Algoritmi e Strutture Dati

Esercizi Capitolo 6 - Alberi binari di ricerca

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

B+Trees. Introduzione

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Corso di Informatica

4.1 Modelli di calcolo analisi asintotica e ricorrenze

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Funzioni in C. Violetta Lonati

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Studente: SANTORO MC. Matricola : 528

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Sistema operativo: Gestione della memoria

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

La selezione binaria

Algoritmi di ordinamento in linguaggio C

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Calcolatori: Algebra Booleana e Reti Logiche

Appunti sulla Macchina di Turing. Macchina di Turing

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

Vettori Algoritmi elementari di ordinamento

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

B-Tree. Struttura dati usata in applicazioni che necessitano di gestire insiemi di chiavi ordinate Una variante (B+-Tree) è diffusa in:

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Sistemi Operativi GESTIONE DELLA MEMORIA SECONDARIA. D. Talia - UNICAL. Sistemi Operativi 11.1

Sistemi Operativi. Memoria Secondaria GESTIONE DELLA MEMORIA SECONDARIA. Struttura del disco. Scheduling del disco. Gestione del disco

Esercitazione Informatica I AA Nicola Paoletti

Algoritmi e diagrammi di flusso

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

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Informatica 3. LEZIONE 23: Indicizzazione. Modulo 1: Indicizzazione lineare, ISAM e ad albero Modulo 2: 2-3 trees, B-trees e B + -trees

( x) ( x) 0. Equazioni irrazionali

Che cosa è un VIRUS?

Programmazione dinamica

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Soluzione dell esercizio del 12 Febbraio 2004

Introduzione al MATLAB c Parte 2

Laboratorio di Informatica

Iniziamo con un esercizio sul massimo comun divisore: Esercizio 1. Sia d = G.C.D.(a, b), allora:

Uso di base delle funzioni in Microsoft Excel

Cluster. Vicino alla temperatura critica gli spin formano grandi gruppi (cluster)

Parte 1. Vettori di bit - AA. 2012/13 1.1

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

4 3 4 = 4 x x x 10 0 aaa

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Librerie digitali. Video. Gestione di video. Caratteristiche dei video. Video. Metadati associati ai video. Metadati associati ai video

Lezione 8. La macchina universale

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

I motori di ricerca. Che cosa sono. Stefania Marrara Corso di Sistemi Informativi

Gestione della memoria centrale

Ricorsione. (da lucidi di Marco Benedetti)

Sono casi particolari di MCF : SPT (cammini minimi) non vi sono vincoli di capacità superiore (solo x ij > 0) (i, j) A : c ij, costo di percorrenza

RICERCA DI UN ELEMENTO

CALCOLO COMBINATORIO

Consideriamo due polinomi

Corso di Fondamenti di Informatica Algoritmi su array / 2

Oggetti Lezione 3. aspetti generali e definizione di classi I

Introduzione all analisi dei segnali digitali.

Appunti di informatica. Lezione 2 anno accademico Mario Verdicchio

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Cosa è un foglio elettronico

Inizializzazione, Assegnamento e Distruzione di Classi

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Arduino: Programmazione

Транскрипт:

Corso di Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica Anno Accedemico 003/004 Proff. Giuseppe De Giacomo, Luca Iocchi, Domenico Lembo Dispensa : Algoritmi di Ordinamento Problema: Data una sequenza di elementi in ordine qualsiasi, ordinarla. Questo è un problema fondamentale, che si presenta in moltissimi contesti, ed in diverse forme: ordinamento degli elementi di un array in memoria centrale ordinamento di una collezione in memoria centrale ordinamento di informazioni memorizzate in un file su memoria di massa (file ad accesso casuale su disco, file ad accesso sequenziale su disco o su nastro) Noi consideriamo solo la variante base del problema dell ordinamento. Problema: Dato un vettore a di n elementi in memoria centrale non ordinato, ordinarne gli elementi in ordine crescente. Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 1

Ordinamento per selezione del minimo (selection sort) Esempio: Ordinamento di una pila di carte: seleziono la carta più piccola e la metto da parte delle rimanenti seleziono la più piccola e la metto da parte mi fermo quando rimango con una sola carta Quando ho un vettore: per selezionare l elemento più piccolo tra quelli rimanenti uso un ciclo mettere da parte significa scambiare con l elemento che si trova nella posizione che compete a quello selezionato Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 Ordinamento per selezione del minimo (selection sort) Implementazione: public static void selectionsort(int[] a) { int n = a.length; for (int i=0; i<n-1; i++) { // trova il piu piccolo elemento da i a n-1 int jmin = i; for (int j=i+1; j<n; j++) { if (a[j]<a[jmin]) jmin = j; // scambia gli elementi i e jmin int aux = a[jmin]; a[jmin] = a[i]; a[i] = aux; Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 3

Complessità dell ordinamento per selezione Doppio ciclo = O(n ) Più in dettaglio: Istruzione dominante è il confronto (a[j] < a[jmin]). Viene eseguita (n 1)+(n ) + ++1= n (n 1) = O(n ) operazioni volte. La complessità è O(n ) in tutti i casi (anche se il vettore ègià ordinato). Numero di scambi: nel caso migliore: 0 nel caso peggiore: O(n) 0 1 3 4 0 1 3 4 Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 4 Ordinamento a bolle (bubble sort) Idea: Si fanno salire gli elementi più piccoli ( più leggeri ) verso l inizio del vettore ( verso l alto ), scambiandoli con quelli adiacenti. L ordinamento è suddiviso in n 1 fasi: fase 0: 0 o elemento (il più piccolo) in posizione 0 fase 1: 1 o elemento in posizione 1 fase n : (n ) o elemento in posizione n, e quindi (n 1) o elemento in posizione n 1 Nella fase i: cominciamo a confrontare dal basso e portiamo l elemento più piccolo (più leggero) in posizione i Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004

Ordinamento a bolle (bubble sort) Implementazione (semplificata): public static void bubblesortnaive(int[] a) { int n = a.length; for (int i=0; i<n-1; i++) { for (int j=n-1; j>i; j--) if (a[j-1] > a[j]) { int aux = a[j-1]; a[j-1] = a[j]; a[j] = aux; Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 6 Osservazione: Se durante una fase non avviene alcuno scambio, allora il vettore è ordinato. Se invece avviene almeno uno scambio, non sappiamo se il vettore è ordinato o meno. = Possiamo interrompere l ordinamento appena durante una fase non avviene alcuno scambio. Implementazione: public static void bubblesort(int[] a) { int n = a.length; boolean ordinato = false; for (int i=0; i<n-1 &&!ordinato; i++) { ordinato = true; for (int j=n-1; j>i; j--) if (a[j-1] > a[j]) { int aux = a[j-1]; a[j-1] = a[j]; a[j] = aux; ordinato=false; Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004

Complessità della versione ottimizzata nel caso migliore (vettore già ordinato correttamente): O(n) confronti, 0 scambi nel caso peggiore (vettore ordinato al contrario): n 1 fasi = (n 1)+(n ) + ++1= n (n 1) O(n ) confronti, O(n ) scambi confronti e scambi Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 8 Ordinamento per inserimento (insertion sort) L ordinamento per inserimento è un metodo di ordinamento che risulta essere tra i più efficienti metodi di ordinamento naive (cioè, intrinsecamente O(n )). L idea di base dell insertionsort è la seguente: consideriamo di aver già ordinato gli elementi tra 0 e i-1 di un array a, allora possiamo facilmente inserire l elemento i-esimo nella posizione giusta scalando gli elementi piu grandi di lui. Si noti, simile a come si ordina una carta nuova in una mano di carte di un tipico gioco di carte (scopone, bridge, ecc.) Esempio: a = 8 6 3 8 6 3 elem 0-esimo ordinato (banalmente) 8 6 3 elem 0..1 ordinati 8 6 3 elem 0.. ordinati 8 6 3 elem 0..3 ordinati 6 8 3 elem 0..4 ordinati 3 6 8 elem 0.. ordinati (tutti) Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004

Ordinamento per inserimento (insertion sort) Implementazione: public static void insertionsort(int[] a) { for (int i = 1; i < a.length; i++) { // gli elementi tra 0 e i-1 sono gia ordinati // inserisci l elemento i tra gli elementi ordinati //nella giusta posizione int tmp = a[i]; int j; for (j = i; j > 0 && a[j-1] > tmp; j--) a[j] = a[j-1]; a[j] = tmp; Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 10 Ordinamento per inserimento (insertion sort) Costo: Nell algoritmo di ordinamento insertion sort il caso peggiore si presenta quando l array è ordinato all inverso. In tal caso l istruzione dominante (tmp < a[j-1]) viene ripututa per 1++...n +n 1=n (n 1)/ volte. Quindi il suo costo è O(n ). Si noti che il caso migliore si ha quando l array ègià ordinato. In tal caso l istuzione dominante (tmp < a[j-1]) viene eseguita n 1 volte. Quindi il costo in tal caso è O(n). Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 11

Ordinamento per fusione (merge sort) Per ordinare 1000 elementi usando un algoritmo di complessità O(n ) (ordinamento per selezione o a bolle): sono necessarie 10 6 operazioni Idea: Divido i 1000 elementi in due gruppi da 00 elementi ciascuno: ordino il primo gruppo in O(n ): 0 000 operazioni ordino il secondo gruppo in O(n ): 0 000 operazioni combino (fondo) i due gruppi ordinati: si può fare in O(n) = 1000 operazioni Totale: 01 000 operazioni (contro le 10 6 ) Il procedimento può essere iterato: per ordinare le due metà non uso un algoritmo di complessità O(n ), ma applico lo stesso procedimento di divisione, ordinamento separato e fusione. La suddivisione in due metà si ferma quando si arriva ad un gruppo costituito da un solo elemento (che è già ordinato). Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 1 algoritmo ordina per fusione gli elementi di A da iniziale a finale if iniziale < finale (ovvero, c è più di un elemento tra iniziale e finale, estremi inclusi) then mediano (iniziale + finale) / ordina per fusione gli elementi di A da iniziale a mediano ordina per fusione gli elementi di A da mediano +1 finale fondi gli elementi di A da iniziale a mediano con gli elementi di A da mediano +1 a finale restituendo il risultato nel sottovettore di A da iniziale a finale Esempio: 1 3 1 3 1 3 1 3 1 3 1 3 4 4 4 4 4 4 1 3 4 Dividi Fondi Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 13

Per effettuare la fusione di due sottovettori ordinati e contigui ottenendo un unico sottovettore ordinato: si utilizzano un vettore di appoggio e due indici per scandire i due sottovettori il più piccolo tra i due elementi indicati dai due indici viene copiato nella prossima posizione del vettore di appoggio, e viene fatto avanzare l indice corrispondente quando uno dei due sottovettori è terminato si copiano gli elementi rimanenti dell altro nel vettore di appoggio alla fine si ricopia il vettore di appoggio nelle posizioni occupate dai due sottovettori Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 14 Ordinamento per fusione (merge sort) Implementazione: public class MergeSort { public static void sort(int v[]) { sort(v,0,v.length-1); private static void mergesort(int[] v, int inf, int sup) { if (inf < sup) { int med = (inf+sup)/; mergesort(v,inf,med); mergesort(v,med+1,sup); merge(v,inf,med,sup); Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 1

private static void merge(int[] v, int inf, int med, int sup) { int[] a = new int[sup-inf+1]; int i1 = inf; int i = med+1; int i = 0; while ((i1 <= med)&&(i <= sup)) { // entrambi i vettori //contengono elementi if (v[i1] <= v[i]) { a[i] = v[i1]; i1++; i++; else { a[i] = v[i]; i++; i++; if (i > sup) // e finito prima il secondo pezzo del vettore Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 16 for (int k = i1; k <= med; k++) { a[i] = v[k]; i++; else // e finito prima il primo pezzo del vettore for (int k = i; k <= sup; k++) { a[i] = v[k]; i++; // copiamo il vettore ausiliario nel vettore originario for(int k = 0; k < a.length; k++) v[inf+k] = a[k]; funzione merge effettua la fusione funzione sort effettua l ordinamento di un sottovettore compreso tra due indici iniziale e finale funzione mergesort chiama sort sull intervallo di indici da 0 a n 1 Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 1

Complessità dell ordinamento per fusione Sia T (n) il costo di ordinare per fusione un vettore di n elementi. se il vettore ha 0 o 1 elementi: T (n) =c 1 se il vettore ha più di un elemento: T (n) = costo dell ordinamento della prima metà + costo dell ordinamento della seconda metà + costo della fusione = T (n/) + T (n/) + c n Otteniamo un equazione di ricorrenza la cui soluzione è la funzione di complessità cercata: T (n) = { c1 se n 1 T (n/) + T (n/) + c n se n>1 La soluzione, ovvero la complessità dell ordinamento per fusione è T (n) =O(n log n). Questo è quanto di meglio si possa fare. Si può infatti dimostrare che nel caso peggiore sono necessari n log n confronti per ordinare un vettore di n elementi. Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 18 Ordinamento veloce (quick sort) L ordinamento veloce si basa sulla seguente idea: si prende in esame un elemento X dell array (qualsiasi in generale) che viene detto pivot, e si partiziona (riorganizza) l array in modo che: il pivot si trovi nella posizione corretta (sia essa k); tutti gli elementi più piccoli del pivot siano nelle posizioni precedenti k; tutti gli elementi più grandi del pivot siano nelle posizioni seguenti k. Esempio: : a = 6 1 8 4 3 1 pivot = 6 k = 4 a = 4 3 1 6 1 8 A questo punto i due vettori a 1 =[431] e a = [1 8 ] possono essere ricosivamente ordinati allo stesso modo. La scelta del pivot può essere effettuata secondo diversi criteri. Nell implementazione che segue viene scelto semplicemente il primo elemento del vettore. Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 1

Ordinamento veloce (quick sort) Implementazione: public class QuickSort { public static void sort(int[] a) { quicksort(a,0,a.length-1); public static void quicksort(int[] a,int inf, int sup) { if (inf >= sup) return; else { int pospivot sceglipivot(a,inf,sup); int k = partition(a, inf, sup, pospivot); quicksort(a,inf,k); quicksort(a,k+1,sup); Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 0 private static int sceglipivot(int[] a, int inf, int sup) { //si consulti un libro di alg. e stutt. dati //per criteri di scelta avanzati. //Noi scegliamo semplicemente il primo elemento return inf; private static int partition(int[] a, int inf, int sup, int pospivot) { int i = inf; int j = sup; int pivot = a[pospivot]; while (i < j) { while (a[i] < pivot) i++; while (a[j] > pivot) j--; if (i < j) { // ora a[i] > pivot e a[j] < pivot // quindi scambio a[i] e a[j] int tmp = a[i]; a[i] = a[j]; Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 1

a[j] = tmp; return i; Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 Ordinamento veloce (quick sort) Costo: Il quick sort funziona bene quando ad ogni passo si riesce a partizionare il vettore in due vettori di dimensione circa n/. In questo caso la complessità è O(n log n) - l analisi è molto simile a quella del merge sort. Nel caso peggiore, che si verifica ad esempio se il vettore ègià ordinato, si ha una complessità di O(n ), in quanto ad ogni passo si esamina un nuovo vettore di dimensione inferiore di uno rispetto a quella precedente. Pur avendo, nel caso peggiore, una complessità asintotica più grande del merge sort, il quick sort si comporta molto bene quando il vettore è mediamente disordinato, cioè la partizione del vettore avvinene in parti circa uguali. In questi casi in effetti è spesso preferito al merge sort in quanto non richiede l allocazione di un array aggiunutivo per il merge. Il quick sort è l algoritmo di ordinamento più studiato dal punto di vista delle ottimizzazioni. Tuttavia va tenuto presente che, specialmente introducendo ottimizzazioni, in codice del quick sort è molto sensibile a piccoli errori di programmazione che sono difficili da trovare e che ne degradano fortemente le prestazioni per particolari configurazioni dell input. Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 3

Rissunto sulla complessità degli algoritmi di ordinamento algoritmo confronti scambi complessià totale selection sort O(n ) sempre O(n) O(n ) sempre 0 se già ordinato bubble sort O(n ) O(n ) O(n ) (ottimizzato) O(n) se già ordinato 0 se già ordinato O(n) se già ordinato insertion sort O(n ) O(n ) O(n ) O(n) se già ordinato 0 se già ordinato O(n) se già ordinato merge sort O(n log n) sempre O(n log n) sempre O(n log n) sempre (serve vettore appoggio) quick sort O(n ) caso peggiore O(n log n) caso medio Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica A.A. 003/004 4