Algoritmi di ordinamento (I parte)
|
|
|
- Orazio Patti
- 8 anni fa
- Просмотров:
Транскрипт
1 Algoritmi di ordinamento (I parte)
2 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
3 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
4 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
5 E2: Insertion Sort (richiamo) Esempio input A = M H D K B F J L dopo 1 ciclo = dopo 2 ciclo = H M D K B F J L D H M K B F J L dopo 3 ciclo =... dopo 7 ciclo = D H K M B F J L B D F H J K L M 2001/2002 5
6 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
7 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
8 E2: ShellSort (richiamo) Esempio input A = fisso sequenza Delta = 3,2,1 Delta = 3 Sottosequenze: M H D K B F J L ordino sottosequenze M H D K B F J L M - - K - - J H - - B - - L D - - F J B D K H F M L J - - K - - M B - - H - - L D - - F 2001/2002 8
9 E2: ShellSort (richiamo) Esempio, continua Delta = 2 Sottosequenze: J B D K H F M L J - D - H - M B - K - F - L ordino sottosequenze D B H F J K M L D - H - J - M B - F - K - L 2001/2002 9
10 E2: ShellSort (richiamo) Esempio, continua Delta = 1 La sottosequenza è l array stesso. L ordinamento è l InsertSort sull array D B H F J K M L B D F H J K L M B D F H J K L M 2001/
11 E2: ShellSort: punto di vista altern. Dato A = { i 1<=i<=10} Array A Delta = Delta = 3 Delta = /
12 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/
13 E10: ShellSort Costo computazionale risultato analitico difficile costo computazionale InsertSort = O(n 2 ) risultati sperimentali ShellSort = O(n 1,25 ) 2001/
14 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/
15 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/
16 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/
17 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/
18 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/
19 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/
20 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/
21 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/
22 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/ }
23 2001/
24 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: "); /
Algoritmi di ordinamento (II parte)
Algoritmi di ordinamento (II parte) E3: sommario Studio di due implementazioni di algoritmi avanzati Algoritmo ordinamento veloce (QuickSort) Algoritmo per fusione (MergeSort) Metodi offerti in java.util
Algoritmi di ordinamento
Algoritmi di ordinamento! Selection Sort! Quick Sort! Lower bound alla complessità degli algoritmi di ordinamento Ordinamento 1 Selection Sort SelectionSort(dati[]) { for (i=0; idati.length-1; i++) { min
Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5
Ricerca e ordinamento su array di oggetti Corso di Programmazione 2 Esercitazione 5 Sommario Ricercare in array di oggetti Interfaccia comparable Ordinare array di oggetti Problema Come ordinare, ricercare
Corso di Tecniche di Programmazione
Problema: Data una sequenza di elementi in ordine qualsiasi, ordinarla. Corso di Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica Anno Accedemico 003/004 Proff. Giuseppe
Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento
Fondamenti di Informatica Algoritmi di Ricerca e di Ordinamento 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure l elemento
2. Analisi degli Algoritmi
2. Analisi degli Algoritmi Introduzione 2.1 Un modello di macchina elementare: la Macchina a Registri 2.2 Costo di esecuzione di un programma 2.3 Analisi del costo di esecuzione: il modello a costi uniformi
Quicksort e qsort() Alessio Orlandi. 28 marzo 2010
Quicksort e qsort() Alessio Orlandi 28 marzo 2010 Intro Quicksort è l algoritmo di ordinamento più implementato, insieme con Mergesort. Tutte le librerie standard UNIX ne prevedono una implementazione.
SOMMARIO IL PROBLEMA DELLA RICERCA. Algoritmi di ricerca: Algoritmi di ordinamento: RICERCA LINEARE
SOMMARIO IL PROBLEMA DELLA RICERCA Algoritmi di ricerca: Ricerca lineare; Ricerca binaria (su elenchi già ordinati). Dato un array e un oggetto, stabilire se l oggetto è contenuto in un elemento dell array,
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento Alessandra Raffaetà Università Ca Foscari Venezia Corso di Laurea in Informatica Ricerca binaria Assunzione:
Fondamenti di Informatica
Algoritmi di ordinamento Gli ordinamenti interni sono fatti su sequenze in memoria centrale Fondamenti di Informatica 18. Algoritmi di ordinamento in C++ Gli ordinamenti esterni sono fatti su sequenze
Ordinamento. Scoperta guidata di tipici algoritmi: selection sort, bubble sort
Ordinamento Scoperta guidata di tipici algoritmi: selection sort, bubble sort. Problema stimolo Si possiede una bilancia a due piatti ed N sacchi di iuta pieni di caffè. Ciascun sacco è identificato da
Il Linguaggio Java. Le interfacce
Il Linguaggio Java Le interfacce Ordinamento dei conti PROBLEMA: si vogliono ordinare i libretti di risparmio (SavingsAccount) in base al loro tasso di interesse REQUISITO: La classe dovrebbe essere ordinabile,
Algoritmi di ordinamento in linguaggio C
Algoritmi di ordinamento in linguaggio C Ordinamento per inserimento Insertion Sort con funzione ausiliaria int inserisci_valore(int vett[], int dim, int valore) { int i = dim; while (i > 0 && vett[i-1]
Algoritmi e Strutture Dati. Capitolo 4 Ordinamento
Algoritmi e Strutture Dati Capitolo 4 Ordinamento Ordinamento Dato un insieme S di n oggetti presi da un dominio totalmente ordinato, ordinare S Esempi: ordinare una lista di nomi alfabeticamente, o un
Gli algoritmi ricorsivi di ordinamento. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino
ordinamento Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino Merge Sort Ricorsivo, divide et impera Stabile Divisione: due sottovettori SX e DX rispetto al centro del vettore. p r A.A.
Laboratorio di Algoritmi e Strutture Dati. Code con Priorità
Laboratorio di Algoritmi e Strutture Dati Code con Priorità Teresa M.A. Basile [email protected] Dipartimento di Informatica Università degli Studi di Bari Aldo Moro Materiale di base gentilmente concesso
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Ing. Gianluca Caminiti Sommario ( OOP ) Programmazione Object-Oriented Incapsulamento, Ereditarietà, Polimorfismo Richiami
Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ Heap e Heapsort Algoritmi di ordinamento Insertion Sort Quicksort Heapsort Insertion Sort L
Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni
Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni Esercizio 1 Dire quale è la complessità temporale del seguente metodo, espressa con notazione asintotica O(.) (con la migliore
Algoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73
Capitolo 9 Tipi enumerativi, tipi generici e interfacce c 2005 Pearson Education Italia Capitolo 9-1 / 73 Sommario: Tipi enumerativi, tipi generici e interfacce 1 Definizione di tipi enumerativi La classe
Algoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
Un esempio di calcolo di complessità: insertion sort
Un esempio di calcolo di complessità: insertion sort Vediamo su un esempio come si può calcolare la complessità di un algoritmo... L esempio è un metodo semplice per ordinare arrays: insertion sort, o
Esercizi per il corso di Algoritmi, anno accademico 2011/12
Esercizi per il corso di Algoritmi, anno accademico 2011/12 Esercizi sulla Tecnica Divide et Impera N.B. Tutti gli algoritmi vanno scritti in pseudocodice (non in Java, nè in C++, etc. ). Di tutti gli
Algoritmi di ordinamento: Array e ricorsione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1 Indice Algoritmi di ordinamento: Insertion
Esercizi di Algoritmi e Strutture Dati
Esercizi di Algoritmi e Strutture Dati Moreno Marzolla [email protected] Ultimo aggiornamento: 10 novembre 2010 1 La bandiera nazionale (problema 4.7 del libro di testo). Il problema della bandiera
Esempi in Java di program.ne O-O
Esempi in Java di program.ne O-O Ereditarietà Polimorfismo statico e dinamico Esercitazione laboratorio Interfaccia Comparable e Comparator 1 Gerarchia di ereditarietà Persona IS_A Docente Studente Tecnico
A. Ferrari Algoritmi notevoli
Algoritmi notevoli in linguaggio C algoritmi o o o ricerca (verificare la presenza di un valore in un array) o o o ricerca sequenziale (array non ordinato) ricerca sequenziale (array ordinato) ricerca
