Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

Похожие документы
Algoritmi e Strutture Dati

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

Sommario. Ordinamento. Selection Sort Bubble Sort/ Shaker Sort Shell Sort

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Ordinamenti per confronto: albero di decisione

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

Esercizi di Algoritmi e Strutture Dati

Un esempio di calcolo di complessità: insertion sort

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Tempo e spazio di calcolo

Albero di Riscorsione

Algoritmi di ordinamento (I parte)

Algoritmi di ordinamento

Cognome e Nome : Corso e Anno di Immatricolazione: Modalità di Laboratorio (Progetto/Prova) :

Algoritmi di ordinamento: Array e ricorsione

Problemi, istanze, soluzioni

Algoritmi di ordinamento: Array e ricorsione

PROGRAMMAZIONE STRUTTURATA

2. Analisi degli Algoritmi

Algoritmi di ordinamento in linguaggio C

4.1 Modelli di calcolo analisi asintotica e ricorrenze

Fondamenti di Informatica

Algoritmi e Strutture Dati. HeapSort

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Esempio : i numeri di Fibonacci

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Esercizi di Algoritmi e Strutture Dati

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Esercizi Capitolo 12 - Divide-et-Impera

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

Studio degli algoritmi

Problemi di ordinamento

Gestione della produzione e della supply chain Logistica distributiva

Rappresentazione degli algoritmi

Algoritmi e Strutture Dati Esercizi Svolti. Giuseppe Persiano Dipartimento di Informatica ed Appl. Renato M. Capocelli Università di Salerno

Almerico Murli - Le variabili strutturate (array) VARIABILI STRUTTURATE (ARRAY)

Macchina RAM. Modelli di calcolo e metodologie di analisi. Linguaggio di una macchina RAM. Algoritmi e Strutture Dati. Istruzioni.

Introduzione alla programmazione

Algoritmi. Un tema centrale dell informatica è lo studio degli algoritmi.

Tempo e spazio di calcolo (continua)

Heap e code di priorità

in termini informali: un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

RISOLUZIONE DI SISTEMI LINEARI

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati - II modulo Soluzioni degli esercizi

2.2 Alberi di supporto di costo ottimo

Note per la Lezione 6 Ugo Vaccaro

Cammini Minimi. Algoritmo di Dijkstra

Algoritmi e loro proprietà. Che cos è un algoritmo? Un esempio di algoritmo

Algoritmi di Ricerca. Esempi di programmi Java

Metodi di Ottimizzazione per la Logistica e la Produzione

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

Algoritmi di Ricerca. Esempi di programmi Java

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

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

Ordinamento di una lista: bubble-sort

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

IL TEOREMA DI BOEHM-JACOPINI

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Evoluzione del FORTRAN 14/03/2016. LABORATORIO DI PROGRAMMAZIONE Corso di laurea in matematica 15 IL LINGUAGGIO FORTRAN

Preparazione allo Scritto di Programmazione

Транскрипт:

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 insieme di numeri, o un insieme di compiti d esame in base al cognome dello studente Subroutine in molti problemi E possibile effettuare ricerche in array ordinati in tempo O(log n) 2

Il problema dell ordinamento Input: una sequenza di n numeri <a 1,a 2,,a n > Output: una permutazione (riarrangiamento) <a 1,a 2,,a n > della sequenza di input tale che a 1 a 2 a n 3

SelectionSort Approccio incrementale: estende l ordinamento da k a k+1 elementi, scegliendo il minimo degli n-k elementi non ancora ordinati e mettendolo in posizione k+1 7 2 4 5 3 1 1 2 3 4 5 7 1 2 4 5 3 7 1 2 3 4 5 7 1 2 4 5 3 7 1 2 3 4 5 7 1 2 3 5 4 7 4

SelectionSort (A) 1. for k=0 to n-2 do 2. m = k+1 3. for j=k+2 to n do 4. if (A[j] < A[m]) then m=j 5. scambia A[m] con A[k+1] al generico passo k, A[1],,A[k] sono già ordinati linee 2-4: ricerca del minimo fra gli elementi A[k+1],,A[n] m è l indice dell array in cui si trova il minimo il minimo è messo in posizione k+1 5

Corretto? E facile convincersi che l algoritmo mantiene le seguenti invarianti: dopo il generico passo k (k=0,,n-2) abbiamo che: (i) i primi k+1 elementi sono ordinati e (ii) sono i k+1 elementi più piccoli dell array Suggerimento: ragionare per invarianti è uno strumento utile per dimostrare la correttezza di un algoritmo, perché permette di isolare proprietà dell algoritmo, spiegarne il funzionamento, capire a fondo l idea su cui si basa. 6

Complessità temporale (analisi) T(n) = #operazioni elementari sul modello RAM a costi uniformi eseguite dall algoritmo nel caso peggiore su istanze di dimensione n. 7

SelectionSort (A) 1. for k=0 to n-2 do 2. m = k+1 3. for j=k+2 to n do 4. if (A[j] < A[m]) then m=j 5. scambia A[m] con A[k+1] ogni linea di codice costa tempo O(1) Complessità: un upper bound eseguite al più n volte per ogni ciclo esterno ciclo esterno eseguito al più n volte T(n) 5 n 2 O(1)= (n 2 ) T(n)= O (n 2 ) L analisi è stretta? Cioè, T(n) è (n 2 )? 8

SelectionSort (A) 1. for k=0 to n-2 do 2. m = k+1 3. for j=k+2 to n do 4. if (A[j] < A[m]) then m=j 5. scambia A[m] con A[k+1] Complessità: un lower bound n-k-1 confronti Idea: conto solo i confronti fra elementi n-2 n-1 T(n) (n-k-1)= k = n(n-1)/2= (n 2 ) k=0 k=1 T(n)= (n 2 ) T (n)= (n 2 ) 9

SelectionSort (A) 1. for k=0 to n-2 do 2. m = k+1 3. for j=k+2 to n do 4. if (A[j] < A[m]) then m=j 5. scambia A[m] con A[k+1] Complessità Complessità nel caso migliore? T best (n)= (n 2 ) 10

InsertionSort Approccio incrementale: estende l ordinamento da k a k+1 elementi, posizionando l elemento (k+1)-esimo nella posizione corretta rispetto ai primi k elementi 7 2 4 5 3 1 2 4 5 7 3 1 2 7 4 5 3 1 2 3 4 5 7 1 2 4 7 5 3 1 1 2 3 4 5 7

InsertionSort (A) 1. for k=1 to n-1 do 2. x = A[k+1] 3. for j=1 to k+1 do 4. if (A[j] > x) then break 5. if (j < k+1) then 6. for t=k downto j do A[t+1]= A[t] 7. A[j]=x al generico passo k, A[1],,A[k] sono già ordinati voglio mettere l elemento x=a[k+1] nella posizione che gli compete righe 3 e 4: individuano la posizione j in cui va messo x riga 6: fa spazio per inserire x 12

Correttezza Si dimostra facendo vedere che dopo il generico passo k vale la seguente invariante: (i) i primi k+1 elementi sono ordinati (fra di loro) 13

InsertionSort (A) 1. for k=1 to n-1 do 2. x = A[k+1] 3. for j=1 to k+1 do 4. if (A[j] > x) then break 5. if (j < k+1) then 6. for t=k downto j do A[t+1]= A[t] 7. A[j]=x ogni linea di codice costa tempo O(1) eseguite al più n volte per ogni ciclo esterno ciclo esterno eseguito al più n volte T(n) 7n 2 O(1)= (n 2 ) T(n)= O (n 2 ) L analisi è stretta? Cioè, T(n) è (n 2 )? 14

InsertionSort (A) 1. for k=1 to n-1 do 2. x = A[k+1] 3. for j=1 to k+1 do 4. if (A[j] > x) then break 5. if (j < k+1) then 6. for t=k downto j do A[t+1]= A[t] 7. A[j]=x T(n)= (n 2 ) se esegue h confronti faccio k+1- h spostamenti k+1 operazioni n-1 T(n) (k+1) = (n 2 ) k=1 complessità nel caso migliore? T best (n)= (n 2 ) 15

InsertionSort2 (A) 1. for k=1 to n-1 do 2. x = A[k+1] 3. j = k 4. while j > 0 e A[j] > x do 5. A[j+1] = A[j] 6. j= j-1 7. A[j+1]=x una variante un po più furba Caso migliore Si verifica quando l array è già ordinato T best (n)= (n) Caso peggiore array ordinato in ordine decrescente T(n)= (n 2 ) 16

Esercizio Dimostrare la correttezza e stimare la complessità temporale nel caso peggiore e nel caso migliore del seguete algoritmo BubbleSort (A) 1. for i=1 to n-1 do 2. scambi= false 3. for j=2 to n-i+1 do 4. if (A[j-1] > A[j]) then scambia A[j-1] e A[j]; scambi=true 5. if (scambi=false) then break 17