Algoritmi di ordinamento (I parte)

Похожие документы
Algoritmi di ordinamento (II parte)

Algoritmi di ordinamento

Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5

Corso di Tecniche di Programmazione

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

2. Analisi degli Algoritmi

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

SOMMARIO IL PROBLEMA DELLA RICERCA. Algoritmi di ricerca: Algoritmi di ordinamento: RICERCA LINEARE

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Fondamenti di Informatica

Ordinamento. Scoperta guidata di tipici algoritmi: selection sort, bubble sort

Il Linguaggio Java. Le interfacce

Algoritmi di ordinamento in linguaggio C

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

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

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

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

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Algoritmi di Ricerca. Esempi di programmi Java

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Algoritmi di Ricerca. Esempi di programmi Java

Un esempio di calcolo di complessità: insertion sort

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

Algoritmi di ordinamento: Array e ricorsione

Esercizi di Algoritmi e Strutture Dati

Esempi in Java di program.ne O-O

A. Ferrari Algoritmi notevoli

Транскрипт:

Algoritmi di ordinamento (I parte)

E2: sommario Classificazione degli algoritmi di ordinamento Studio di due implementazioni di algoritmi che utilizzano interfaccia Comparable Algoritmo per inserimento (Insertion Sort) rappresentante classe di algoritmi di ordinamento semplici Algoritmo a passo calante (Shell Sort) rappresentante classe di algoritmi di ordinamento efficienti 2001/2002 2

E2: Classificazione Ordinamento per confronto Algoritmi ordinamento Ordinamento per indirizzo Ordinamento x scambio Ordinamento x incremento ProxmapSort RadixSort BubbleSort ShellSort Ordinamento x inserimento Ordinamento con code priorità Ordinamento x dividi et impera TreeSort InsertionSort HeapSort SelectionSort QuickSort MergeSort 2001/2002 3

E2: Insertion Sort (richiamo) algoritmo di ordinamento semplice: insertionsort(data[]) for (i=1; i< data.lenght; i++) tmp = data[i]; sposta di 1 posizione a dx tutti elementi j<i && data[j] > tmp; metti tmp nella posizione corretta (quella lasciata libera = j) 2001/2002 4

E2: Insertion Sort (richiamo) Esempio input A = 0 1 2 3 4 5 6 7 M H D K B F J L dopo 1 ciclo = dopo 2 ciclo = 0 1 2 3 4 5 6 7 H M D K B F J L 0 1 2 3 4 5 6 7 D H M K B F J L dopo 3 ciclo =... dopo 7 ciclo = 0 1 2 3 4 5 6 7 D H K M B F J L 0 1 2 3 4 5 6 7 B D F H J K L M 2001/2002 5

E2: Insertion Sort (richiamo) Vantaggi: ordina array solo se necessario (spostamento) Svantaggi: inserimento non è localizzato Complessità (# confronti+#spostamenti) ciclo esterno eseguito n-1 volte caso migliore: n-1 confronti + 2(n-1) spostamenti--> O(n) caso peggiore: O(n 2 ) confronti + O(n 2 ) spostam. --> O(n 2 ) caso medio: O(n 2 ) confronti + O(n 2 ) spostam. --> O(n 2 ) 2001/2002 6

E2: ShellSort (richiamo) Idea algoritmo 1. dato un array A[0..n], 2. si fissa una sequenza decrescente di valori <i 1,,i k > t.c. i 1 <n/2 e i k =1 3. Per ogni Delta i a si partizione l array in sottoseq. a 0, a 0+ia, a 0+2ia, a 1, a 1+ia, a 1+2ia, a ia-1, a ia-1+ia, a ia-1+2ia, e si ordinano con il metodo InsertSort() 4. si restituisce l array A (ordinamento crescente) 2001/2002 7

E2: ShellSort (richiamo) Esempio input A = fisso sequenza Delta = 3,2,1 Delta = 3 Sottosequenze: 0 1 2 3 4 5 6 7 M H D K B F J L ordino sottosequenze 0 1 2 3 4 5 6 7 M H D K B F J L M - - K - - J H - - B - - L D - - F 0 1 2 3 4 5 6 7 J B D K H F M L J - - K - - M B - - H - - L D - - F 2001/2002 8

E2: ShellSort (richiamo) Esempio, continua Delta = 2 Sottosequenze: 0 1 2 3 4 5 6 7 J B D K H F M L J - D - H - M B - K - F - L ordino sottosequenze 0 1 2 3 4 5 6 7 D B H F J K M L D - H - J - M B - F - K - L 2001/2002 9

E2: ShellSort (richiamo) Esempio, continua Delta = 1 La sottosequenza è l array stesso. L ordinamento è l InsertSort sull array 0 1 2 3 4 5 6 7 D B H F J K M L B D F H J K L M 0 1 2 3 4 5 6 7 B D F H J K L M 2001/2002 10

E2: ShellSort: punto di vista altern. Dato A = { i 1<=i<=10} Array A Delta = 5 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 Delta = 3 Delta = 1 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 2001/2002 11

E2: ShellSort: parametro Delta Diversi modi per scegliere sequenza Delta: anche in soli due passi (Delta: (16n/π) 1/3 e 1) complessità ShellSort = O(n 5/3 ) (Knuth) Sequenza Delta Non deve essere pari o dispari Euristica: delta 1 = 1; delta i+1 = 3delta i + 1 si arresta a delta t t.c. delta t+1 >=n 2001/2002 12

E10: ShellSort Costo computazionale risultato analitico difficile costo computazionale InsertSort = O(n 2 ) risultati sperimentali ShellSort = O(n 1,25 ) 2001/2002 13

E2: implem.: confronto fra oggetti Si vuole dare un implementazione degli algoritmi che ordini oggetti generici (Object) Necessario quindi confrontare oggetti Che tipo di confronto si deve utilizzare tra due oggetti x e y? x == y è vero sse i due oggetti sono il medesimo troppo forte poco utile 2001/2002 14

E2: implem.: confronto fra oggetti sarebbe meglio avere x uguale y sse rappresentano lo stesso oggetto, quindi... Il confronto deve essere basato sul valore e non sul riferimento La classe Object implementa metodo equals() realizza l operatore == tra reference è il candidato ideale per l overriding (si può ridefinire cosa significa ==) ma non è sufficiente per dire se x > o < y 2001/2002 15

E2: implem.: confronto fra oggetti è necessario quindi che gli oggetti mettano a disposizione un metodo per confrontarli solo attraverso questo metodo è possibile eseguire un ordinamento interfaccia java.lang.comparable semplice interfaccia per richiedere un metodo di confronto (compareto()) gli algoritmi richiedendo come parametro un array di Comparable si garantiscono di poter confrontare gli oggetti in modo corretto. 2001/2002 16

E2: implem.: Interfaccia Comparable public interface Comparable { /** * Restituisce un intero negativo o 0 o un intero positivo a seconda che * l oggetto sia minore o uguale o maggiore dell argomento (elemento). */ public int compareto(object elemento); } /** Contratto * Impone un ordine totale sugli oggetti della classe che la implementa. * Questo ordinamento è detto anche ordinamento naturale della classe * * Un ordinamento è detto consistente con l uguaglianza sse * (e1.compareto((object)e2)==0) ha valori identico a * e1.equals((object)e2) per qualsiasi e1 e e2 della classe C. * * È raccomandato implementare il metodo in modo consistente */ 2001/2002 17

E2: implem.: Interfaccia Comparable I metodi delle classi insertionsort e shellsort devono utilizzare compareto() Si deve imporre all utente che gli oggetti dell array in input a classi che implementano Comparable. 2001/2002 18

E2: implem.: Interfaccia Comparable Classi che implementano Comparable() Class Natural Ordering Byte signed numerical Character unsigned numerical Long signed numerical Integer signed numerical Short signed numerical Double signed numerical Float signed numerical BigInteger signed numerical BigDecimal signed numerical File system-dep. lexicographic on pathname. String lexicographic Date chronological 2001/2002 19

E2: InsertionSort: procedura /** InsertionSort(data) ordina il vettore data di oggetti Comparable */ public static void insertionsort(comparable data[]) { Comparable tmp; int i, j; for (i =1; i < data.lenght; i++) { tmp = data[i]; for (j = i; j>0 && tmp.compareto(data[j-1])<0; j--) data[j] = data[j-1]; data[j] = tmp; } } 2001/2002 20

E2: ShellSort: procedura /** ShellSort(data) ordina il vettore data di oggetti Comparable */ public static void shellsort(comparable a[]) { int i, j, k, delta, deltacnt, increments[] = new int[20]; Comparable tmp; // crea il numero corretto di incrementi delta for ( delta=1, i=0; delta < data.length && i < increments.length; i++) { increments[i] = delta; delta = 3* delta +1; } // itera per il numero di diversi delta for ( i--; i>=0; i--) { delta = increments[i]; 2001/2002 21

E2: ShellSort: procedura // itera per il numero di sottoarray delta-ordinati for ( deltacnt=delta; deltacnt<2*delta; deltacnt++) { // ordinamento per inserimento nel sottoarray indicizzato con passo //delta for ( j= deltacnt; j < data.length; ) { tmp = data[j]; k = j; while ((k-delta)>=0 && tmp.compareto(data[k-delta]) < 0) { data[k] = data[k-delta]; k -= delta; } data[k] = tmp; j += delta; } } } 2001/2002 22 }

2001/2002 23

E2: Insertion-Shell: esempio d uso classe Test Integer[] a = new Integer[n]; System.out.print("Array a: "); for (i=0; i<n; i++) { a[i] = new Integer(rnd.nextInt(n)); System.out.print(a[i] + ", "); } Sort.shellSort(a); //oppure Sort.insertionSort(a) System.out.print("\nArray ordinato: ");... 2001/2002 24