Algoritmi CHE COS’è UN ALGORITMO di ORDINAMENTO?

Slides:



Advertisements
Presentazioni simili
INFORMATICA Algoritmi fondamentali
Advertisements

                      Insertion-Sort
Algoritmi notevoli In linguaggio C.
Lez. 51 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Complessita'
Lez. 10a1 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Strategie per.
Code con priorità Ordinamento
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Heap Sort. L’algoritmo heap sort è il più lento di quelli di ordinamento O(n * log n) ma, a differenza degli altri (fusione e quick sort) non richiede.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Mergesort1 if (n>1) /* la collezione contiene almeno due elementi. */ {1. Dividi la collezione in due di circa la metà degli elementi. 2. chiamata ricorsiva.
Corso di Informatica grafica 1 Introduzione Quando si rappresentano modelli di oggetti 3D costituiti da facce poligonali secondo delle proiezioni alcune.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Usa la tecnica del.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Progetto di algoritmi: metodologia "Divide et Impera"
Algoritmi di ordinamento
APPUNTI SUL LINGUAGGIO C
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
Lalgoritmo MergeSort Applica la strategia del divide et impera Divide: suddivide la sequenza di n elementi data in due sottosequenze di n/2 elementi Impera:
Fondamenti di Informatica1 Ripetizioni di segmenti di codice Spesso è necessario ripetere più volte uno stesso segmento dell'algoritmo (e.g. I/O, elaborazioni.
AN Fondam98 Sorting Ricerca in un vettore ordinato.
Radix-Sort(A,d) // A[i] = cd...c2c1
La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.
Complessità di un algoritmo
Teoria degli algoritmi e della computabilità Terza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione.
ALGORITMI a.
Algoritmo che viene utilizzato per elencare gli elementi di un insieme secondo una sequenza stabilita da una relazione d'ordine, in modo che ogni elemento.
Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo.
Algoritmi di Ordinamento
A LGORITMI DI ORDINAMENTO Cinzia Reverberi. COS’È UN ALGORITMO? Un algoritmo è un insieme ben ordinato di operazioni non ambigue ed effettivamente calcolabili.
Definizione di un algoritmo
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
Array (ordinamento) CORDA – Informatica A. Ferrari.
Gli Algoritmi L’algoritmo è un insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce un risultato e si.
Complessità del problema Se non facciamo ipotesi sul tipo degli elementi della sequenza le uniche operazioni permesse sono confronti e assegnazioni. Problema.
Algoritmi e Strutture Dati Luciano Gualà
ALGORITMI DI RICERCA Nella programmazione s’incontra spesso la necessità di ricercare un elemento (chiave) in un elenco, oppure di ordinare gli elementi.
Ordinamento1 Algoritmi di ordinamento  Selection Sort  Quick Sort  Lower bound alla complessità degli algoritmi di ordinamento.
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
Definizione di algoritmo: Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile.
Soluzione 6: Algoritmo Quicksort
TECNICA DIVIDE ET IMPERA
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
CORSO DI PROGRAMMAZIONE II
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Complessità Computazionale
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
GLI ALGORITMI DI ORDINAMENTO
L’ALGORITMO Un algoritmo è un procedimento formale che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante.
Capitolo 4 Ordinamento: lower bound Ω(n log n) e MergeSort ((*) l’intera lezione) Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Transcript della presentazione:

Algoritmi CHE COS’è UN ALGORITMO di ORDINAMENTO? Un algoritmo di ordinamento è un algoritmo che viene utilizzato per elencare gli elementi di un insieme secondo una sequenza stabilita da una relazione d'ordine, in modo che ogni elemento sia minore (o maggiore) di quello che lo segue. In assenza di altre specifiche, la relazione d'ordine viene sempre considerata totale (cioè tale da rendere sempre possibile il confronto tra due elementi dell'insieme): le relazioni d'ordine parziale danno origine agli algoritmi di ordinamento topologico. A seconda del verso della relazione considerato, un ordinamento può essere ascendente o discendente.

TIPI di ALGORITMI di ORDINAMENTO Selection sort Insertion sort Bubble sort Quick sort Merge sort Heap sort Couting sort Bucket sort

Algoritmo Caso Migliore Caso Medio Caso Peggiore n² - n nlog2 n SELECTIONSORT n² - INSERTIONSOERT n BUBBLESORT QUICKSORT nlog2 n MERGESORT HEAPSORT COUTINGSORT BUCKETSORT

I primi 3 algoritmi analizzati – SELECTION SORT, INSERTION SORT e BUBBLE SORT – sono estremamente elementari e consentono un’implementazione assai semplice: -  il costo da pagare alla semplicità di questi algoritmi sta ovviamente nell’elevata complessità computazionale,che inquesti casi è O(n2). L’algoritmo QUICKSORT consente di raggiungere una complessità di O(nlog2n) nel caso medio, mentre nel caso più sfavorevole ritorna ad una complessità di O(n2). Gli algoritmi MERGESORT e HEAPSORT consentono di raggiungere una complessità di O(nlog2n) anche nel caso peggiore: -  è possibile dimostrare che il limite inferiore alla complessità computazionale del problema dell’ordinamento mediante confronti (senza dunque poter sfruttare altre informazioni sull’insieme da ordinare) è proprio pari a nlog2n, possiamo concludere che tali algoritmi sono ottimi Gli algoritmi COUNTING SORT e BUCKET SORT sono invece basati su altri criteri e strategie, diverse dal confronto fra i valori degli elementi dell’insieme da ordinare, e sfruttano pertanto altre informazioni sui dati in input: -  Grazie a questo consentono di ridurre ulteriormente la complessità nel caso peggiore, arrivando ad una complessità lineare di (n). Sotto a tale soglia è impossibile scendere,dal momento che per ordinare un insieme di n elementi è necessario esaminarli tutti almeno una volta. Ci possiamo concentrare soltanto nello studio della complessità nel caso peggiore, dal momento che è il parametro più conservativo per la valutazione dell’ efficienza di un algoritmo.

Selection sort Un algoritmo decisamente intuitivo ed estremamente semplice. Nella pratica è utile quando l’insieme da ordinare è composto da pochi elementi e dunque anche un algoritmo non molto efficiente può essere utilizzato con il vantaggio di non rendere troppo sofisticata la codifica del programma che lo implementa. L’idea di fondo su cui si basa l’algoritmo è quella di ripetere per n volte una procedura in grado di selezionare alla i-esima iterazione l’elemento più piccolo nell’insieme e di scambiarlo con l’elemento che in quel momento occupa la posizione i In altre parole: -  alla prima iterazione dell’algoritmo verrà selezionato l’elemento più piccolo dell’intero insieme e sarà scambiato con quello che occupa la prima posizione; -  alla seconda iterazione è selezionato il secondo elemento più piccolo dell’insieme, ossia l’elemento più piccolo dell’insieme “ridotto” costituito dagli elementi {a2,a3,...,an}ed è scambiato con l’elemento che occupa la seconda posizione; -  Si ripete fino ad aver collocato nella posizione corretta tutti gli n elementi

Esempio “Selection Sort” void selectionsort(int[] a, int n) { int i=0; for (i=0;i<n;i++) { int j=0; for (j=i+1;j<n;j++) { if (a[j] < a[i]) { int temp=a[j]; a[j]=a[i]; a[i]=temp; }

Insertion sort Ordinamento a inserimento, è un algoritmo relativamente semplice per ordinare un array. Non è molto diverso dal modo in cui un essere umano, spesso, ordina un mazzo di carte. Algoritmo in place, cioè ordina l'array senza doverne creare una copia, risparmiando memoria. Ad ogni istante (iterazione), il vettore è costituito da una parte iniziale ordinata (che aumenta di volta in volta) e da la parte rimanente che contiene i valori da ordinare. Per ogni valore ancora da inserire, viene fatta una ricerca binaria nella parte ordinata del vettore e vengono spostati in avanti tutti gli elementi per liberare la posizione  Nella posizione liberata viene inserito il valore

Esempio “Insertion Sort” void insertion_sort(int[] A,int n) { int i=0,j=0; for (i=1;i<n;i++) { int x=a[i], s=1, d=i-1; while (s<=d) { int m=(s+d)/2; if (x<a[m]) d=m-1; else s=m+1; } for (j=i-1,j>=s;j--) a[j+1]=a[j]; a[s]=x;

Bubble sort L’algoritmo BUBBLE SORT (ordinamento a bolle) so basa sull’idea di far emergere pian piano gli elementi più piccoli verso l’inizio dell’insieme da ordinare facendo sprofondare gli elementi maggiori verso il fondo: - un po’ come le bollicine in un bicchiere di spumante -> da qui il nome di ordinamento a bolle. La strategia adottata è quella di scorrere più colte la sequenza da ordinare, verificando ad ogni passo l’ordinamento reciproco degli elementi contigui, ai e ai+1, ed eventualmente scambiando la posizione di quelle coppie di elementi non ordinate. Procedendo dall’inizio alla fine della sequenza, al termine di ogni scansione si è ottenuto che l’elemento massimo è finito in fondo alla sequenza stessa, mentre gli elementi più piccoli hanno cominciato a spostarsi verso l’inizio della sequenza stessa. Dunque alla fine della prima scansione possiamo essere certi che l’elemento massimo ha raggiunto la sua posizione corretta nell’ultima posizione della sequenza: - la scansione successiva potrà fermarsi senza considerare l’ultimo elemento dell’insieme e riuscendo così a collocare nella posizione corretta (la penultima) il secondo elemento più grande dell’insieme; Si ripete fino ad aver completato l’ ordinamento dell’intera sequenza

Esempio “Bubble Sort” void bubblesort(int[] a, int n) { bool scambio=true; int ultimo=n-1,i=0; while (scambio) { scambio=false; for (i=0;i<ultimo;i++) { if (a[i]>a[i+1]) { int temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; scambio=true; } ultimo--;

Quick Sort Quicksort è un algoritmo di ordinamento ricorsivo in place che si basa sul paradigma divide et impera. La base del suo funzionamento è l’utilizzo ricorsivo della procedura partition: - preso un elemento da un array si pongono gli elementi minori a sinistra rispetto a questo e gli elementi maggiori a destra - La stessa procedura poi è richiamata in modo ricorsivo sui due sotto insiemi Il Quicksort, termine che tradotto letteralmente in italiano indica ordinamento rapido, è l'algoritmo di ordinamento che ha, in generale, prestazioni migliori tra quelli basati su confronto.

Approccio ricorsivo L’idea base può esprimersi agevolmente in termini ricorsivi. - Ad ogni stadio si effettua un ordinamento parziale di una sequenza di oggetti da ordinare. Assunto un elemento come perno dello stadio, si confrontano con esso gli altri elementi e si posizionano alla sua sinistra i minori e a destra i maggiori, senza tener conto del loro ordine. Dopo questo stadio si ha che il perno è nella sua posizione definitiva. - Successivamente si procede in modo ricorsivo all'ordinamento parziale delle sottosequenze di elementi rimasti non ordinati, fino al loro esaurimento.

Esempio “Quick Sort” Scambia x con y e viceversa. void sort(int[] array, int begin, int end) { int pivot, l, r; if (end > begin) { pivot = array[begin]; l = begin + 1; r = end+1; while (l < r) { if (array[l] < pivot) l++; else { r--; swap(array[l], array[r]); } l--; swap(array[begin], array[l]); sort(array, begin, l); sort(array, r, end); Scambia x con y e viceversa. Parametri passati per riferimento. void swap(int & x, int & y) { int temp=x; x=y; y=temp; }

Merge Sort Il merge sort è un algoritmo di ordinamento molto intuitivo e abbastanza rapido, che utilizza un processo di risoluzione ricorsivo. L’idea alla base del merge sort è il procedimento Divide et Impera, che consiste nella suddivisione del problema in sottoproblemi via via più piccoli. Il merge sort opera quindi dividendo l’insieme da ordinare in due metà e procedendo all'ordinamento delle medesime ricorsivamente. Quando si sono divise tutte le metà si procede alla loro fusione (merge appunto) costruendo un insieme ordinato.

Due fasi Fase 1: divide - L'insieme di elementi viene diviso in 2 metà. Se l'insieme è composto da un numero dispari di elementi, viene diviso in 2 sottogruppi dei quali il primo ha un elemento in meno del secondo. Fase 2: impera - Supponendo di avere due sequenze già ordinate. Per unirle, l'algoritmo merge sort estrae ripetutamente il minimo delle due sequenze in ingresso e lo pone in una sequenza in uscita.

Esempio “Merge Sort” int i = left, j=center + 1,k=0; int[] b; void merge (int[] a, int left, int center, int right) int i = left, j=center + 1,k=0; int[] b; while ((i <= center) && (j <= right)) { if (a[i] <= a[j]){ b[k]=a[i]; i=i + 1; } else { b[k] = a[j]; j=j + 1; k=k + 1; for (k =left ;k<right;k++) { a[k] = b[k - left]; void mergesort (int[] a, int left, int right) { int center; if (left < right) { center = (left + right) / 2; mergesort(a, left, center); mergesort(a, center+1, right); merge(a, left, center, right); }

Heap Sort L'algoritmo che ordina in senso crescente inizia creando uno heapdecrescente. Per ogni iterazione si copia la radice (primo elemento dell'array) in fondo all'array stesso, eseguendo uno scambio di elementi. L'algoritmo poi ricostruisce uno heap di   elementi spostando verso il basso la nuova radice, e ricomincia con un altro scambio (tra il primo elemento dell'array e quello in posizione  ), eseguendo un ciclo che considera array di dimensione progressivamente decrescente.

Couting Sort L'algoritmo conta il numero di occorrenze di ciascun valore presente nell'array da ordinare, memorizzando questa informazione in un array temporaneo di dimensione pari all'intervallo di valori. Il numero di ripetizioni dei valori inferiori indica la posizione del valore immediatamente successivo. Si calcolano i valori massimo,  , e minimo,  , dell'array e si prepara un array ausiliario C di dimensione pari all'intervallo dei valori con C[i] che rappresenta la frequenza dell'elemento   nell'array di partenza A. Si visita l'array A aumentando l'elemento di C corrispondente. Dopo si visita l'array C in ordine e si scrivono su A, C[i] copie del valore  .

Bucket Sort Il Bucket sort è un algoritmo di ordinamento per valori numerici che si assume siano distribuiti uniformemente in un intervallo semichiuso (0,1). La complessitàdel bucket sort è lineare O(n+m) (ove m è il valore max nell'array), questo è possibile in quanto l'algoritmo non è basato su confronti. L'intervallo dei valori, noto a priori, è diviso in intervalli più piccoli, detti bucket (cesto). Ciascun valore dell'array è quindi inserito nel bucket a cui appartiene, i valori all'interno di ogni bucket vengono ordinati e l'algoritmo si conclude con la concatenazione dei valori contenuti nei bucket.