Quick Sort: Esempio Si consideri il seguente vettore, v, di n=10 elementi: 13 10 1 45 15 28 21 11 29 34 2 3 4 5 6 7 8 9 i=inf j=sup Scegliamo come pivot.

Slides:



Advertisements
Presentazioni simili
Algoritmi di ordinamento
Advertisements

INFORMATICA Algoritmi fondamentali
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Il Problema dellordinamento.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Il Problema dellordinamento.
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci
Lez. 10a1 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Strategie per.
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.
CORSO DI PROGRAMMAZIONE II
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Algoritmi di ordinamento
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
AN Fondam98 Sorting Ricerca in un vettore ordinato.
Radix-Sort(A,d) // A[i] = cd...c2c1
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Algoritmi CHE COS’è UN ALGORITMO di ORDINAMENTO?
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
Sistemi e Tecnologie Informatiche
Valutare la difficoltà dei problemi
Soluzione 6: Algoritmo Quicksort
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
Il problema della ricerca Algoritmi e Strutture Dati.
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
Quick sort void quick_sort (int a[],int l, int r) { int i, j,v, t; if (r>l) { v=a[r];//L’elemento “pivot” è quello più a dx i=l-1; j=r; // i scorre da.
6/11/01Ordinamento 1 Un esempio di algoritmi: ordinamento.
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest,
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
I Paradossi di Zenone I paradossi di Zenone costituiscono forse i primi esempi del metodo di dimostrazione noto come dimostrazione per assurdo, usato.
Indici di Posizione Giulio Vidotto Raffaele Cioffi.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Esercitazioni di Prog. II (esercizi su alberi ennari)
Insiemi di numeri e insiemi di punti
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
DISTRIBUZIONI TEORICHE DI PROBABILITA’
I teoremi delle funzioni derivabili
Algoritmi Avanzati Prof.ssa Rossella Petreschi
9. Problemi ricorrenti: ordinamento e ricerca
Divide et Impera Quicksort Mergesort Charles Antony Richard Hoare
Insiemi di punti: altre caratteristiche
Approcci nella soluzione di un problema
8b. Esempi di algoritmi con l’uso di array: ordinamento e ricerca
Potenza in corrente alternata monofase
Algoritmi e Strutture Dati
Divide et Impera Quicksort Mergesort
Lezione n°12 Prof.ssa Rossella Petreschi
32 = 9 x2 = 9 x = 3 32 = 9 √9 = 3 L’estrazione di radice
Algoritmi per il flusso nelle reti
Algoritmi per il flusso nelle reti
Scrivere programmi corretti
Schema generale, visita in ampiezza e profondità.
Algoritmi e Strutture Dati
Analisi di regioni Luigi Cinque 23/02/2019 Analisi di regioni.
L’algoritmo MergeSort
* 07/16/96 Sez. 2: Ordinamento La consultazione di banche dati è sempre più cruciale in tutte le applicazioni dell’Informatica. Se vogliamo consultare.
Algoritmi e Strutture Dati
Backtracking Lezione n°17 Prof.ssa Rossella Petreschi
Processi decisionali e funzioni di controllo
MergeSort Usa la tecnica del divide et impera:
Matrici e determinanti
Ricerca 01/08/2019 package.
Algoritmi di ordinamento
Laboratorio del 6 maggio 2012
Corso di Fondamenti di Informatica
Transcript della presentazione:

Quick Sort: Esempio Si consideri il seguente vettore, v, di n=10 elementi: 13 10 1 45 15 28 21 11 29 34 2 3 4 5 6 7 8 9 i=inf j=sup Scegliamo come pivot l’elemento di indice m=(inf+sup)/2, ovvero v[4]=15. L’indice i viene fatto incrementare fino a quando si trova un elemento maggiore o uguale al pivot L’indice j viene fatto decrementare fino a quando si trova un elemento minore o uguale al pivot 13 10 1 45 15 28 21 11 29 34 2 3 4 5 6 7 8 9 i j

Quick Sort: Esempio (cont) Gli elementi di indice i e j vengono scambiati, e l’indice i viene incrementato, mentre j viene decrementato, ottenendo: 13 10 1 11 15 28 21 45 29 34 2 3 4 5 6 7 8 9 i j L’indice i viene arrestato in quanto esso corrisponde al pivot. L’indice j viene fatto decrementare fino a quando esso perviene all’elemento 15, che è uguale al pivot. Gli indici sono dunque: 13 10 1 11 15 28 21 45 29 34 2 3 4 5 6 7 8 9 i,j

Quick Sort: Esempio (cont) Gli elementi i e j non vengono scambiati, perché non avrebbe senso visto che i e j coincidono, e successivamente i viene incrementato e j viene decrementato, ottenendo l’inversione degli indici ( i > j ) e la conclusione del primo passo del QuickSort, Il vettore è così partizionato: 13 10 1 11 15 28 21 45 29 34 2 3 4 5 6 7 8 9 j i Gli elementi di indice appartenente a inf,..,j sono minori o uguali al pivot Gli elementi di indice appartenente a i ..sup sono superiori o uguali al pivot Gli elementi di indice tra j+1,..,i-1 sono uguali al pivot (nel nostro esempio c’è un solo elemento) L’algoritmo procede ricorsivamente operando sui vettori delimitati dagli indici (inf,..,j) e (i,..,sup).

Quick Sort: Esempio (cont) 13 10 1 11 15 2 3 4 5 6 7 8 9 i=inf j=sup pivot=10 13 10 1 11 15 2 3 4 5 6 7 8 9 i j 1 10 13 11 15 2 3 4 5 6 7 8 9 i,j 1 10 13 11 15 2 3 4 5 6 7 8 9 inf,j i sup

Quick Sort: Esempio (cont) 1 10 13 11 15 2 3 4 5 6 7 8 9 i=inf j=sup pivot=13 1 10 13 11 15 2 3 4 5 6 7 8 9 i j 1 10 11 13 15 2 3 4 5 6 7 8 9 inf,j i,sup Fine ricorsione sul sotto-vettore di sinistra, si procede su quello di destra

Quick Sort: Esempio (cont) Perché: L’indice i viene fatto incrementare fino a quando si trova un elemento maggiore o uguale al pivot ? 13 10 1 15 90 28 21 45 29 34 2 3 4 5 6 7 8 9 i j pivot=90 L’incremento dell’indice i non si arresterebbe mai, se non ci fosse la condizione “uguale al pivot”

Quick Sort: Esempio (cont) Perché: L’indice j viene fatto decrementare fino a quando si trova un elemento minore o uguale al pivot ? 13 10 1 15 28 21 45 29 34 2 3 4 5 6 7 8 9 i j pivot=0 Il decremento dell’indice j non si arresterebbe mai, se non ci fosse la condizione “uguale al pivot”

Codifica C del Quick Sort void QSort (tipobase v[], long inf, long sup) { tipobase pivot=v[(inf+sup)/2]; long i=inf, j=sup; while (i<=j) { while (v[i]<pivot) i++; while (v[j]>pivot) j--; if (i<j) scambia(v,i,j); if (i<=j) {i++; j--;} } if (inf<j) QSort(v,inf,j); if (i<sup) QSort(v,i,sup); void scambia (tipobase v[], long i, long j) { tipobase tmp=v[i]; v[i]=v[j]; v[j]=tmp; }

Prestazioni del Quick Sort Le prestazioni del Quick Sort dipendono dalla scelta del pivot, ma si dimostra che mediamente le sue prestazioni sono n*logn Ad ogni ricorsione si possono verificare diverse condizioni, che variano da un caso peggiore ad un caso migliore Caso migliore: In una generica ricorsione, il pivot coincide casualmente con il mediano degli elementi contenuti nel vettore. In tal caso, il vettore originario è decomposto in due sottovettori di dimensione uguale. Caso peggiore: In una generica ricorsione, il pivot coincide casualmente con il massimo degli elementi contenuti nel vettore. In tal caso, il vettore originario è decomposto in due sottovettori, di cui il primo ha dimensione uguale alla dimensione originaria meno 1, e l’altro ha una dimensione unitaria. Il caso peggiore si verifica anche quando il pivot coincide con l’elemento minimo

Quick Sort: caso migliore Si consideri il seguente vettore di n=10 elementi 13 10 1 45 15 12 21 29 34 2 3 4 5 6 7 8 9 i j Scegliamo come pivot l’elemento di indice m = (inf+sup)/2, ovvero v[4]=15; casualmente questo coincide con l’elemento mediano m del vettore. L'elemento mediano è quello tale che il numero di elementi del vettore più grandi di lui è circa uguale al numero di elementi del vettore che più piccoli di lui. Il numero di elementi più piccoli di 15 è 4, mentre il numero di elementi più grandi di 15 è 4.

Quick Sort: caso migliore (cont.) L’indice i viene incrementato fino a quando non viene trovato un elemento più grande o uguale al pivot. Nel nostro esempio l’indice i si arresta in corrispondenza dell’elemento 45. Per quanto riguarda l’indice j esso viene spostato fino a quando non si perviene all’elemento 15, uguale al pivot. 13 10 1 45 15 12 21 29 34 2 3 4 5 6 7 8 9 i j Gli elementi di indice i e j vengono scambiati, e l’indice i viene incrementato, mentre j viene decrementato, ottenendo: 13 10 1 15 12 21 45 29 34 2 3 4 5 6 7 8 9 i j

Quick Sort: caso migliore (cont.) L’indice i viene arrestato in quanto esso corrisponde al pivot. L’indice j viene fatto decrementare fino a quando esso perviene all’elemento 12, che è inferiore al pivot: 13 10 1 15 12 21 45 29 34 2 3 4 5 6 7 8 9 i j Gli elementi i e j vengono scambiati e successivamente i viene incrementato e j viene decrementato, ottenendo: 13 10 1 15 12 21 45 29 34 2 3 4 5 6 7 8 9 j i La prima passata dell’algoritmo QuickSort si conclude, perché i due indici i e j si sono invertiti.

Quick Sort: caso migliore (cont.) Come si vede alla fine della prima passata di ordinamento risulta che: tutti gli elementi di indice appartenente a inf,..,j sono minori o uguali del pivot tutti gli elementi di indice appartenente a i,..,sup sono maggiori o uguali del pivot non ci sono elementi di indice appartenente a j+1,..,i-1. Come si vede l’esempio considerato rappresenta il caso migliore perché il vettore originario è stato decomposto in due vettori che hanno entrambi dimensione uguale e pari a metà della dimensione iniziale. L’algoritmo procede ricorsivamente operando sui vettori delimitati dagli indici (inf,..,j) e (i,..,sup).

Quick Sort: caso peggiore Si consideri il seguente vettore di n=10 elementi: 13 20 1 15 34 28 21 14 29 3 2 4 5 6 7 8 9 i j Se scegliamo come pivot l’elemento di indice m=(inf+sup)/2, ovvero v[4]=34, questo casualmente coincide con l’elemento maggiore del vettore.

Quick Sort: caso peggiore (cont) L’indice i viene incrementato fino a quando non viene trovato un elemento più grande o uguale al pivot. Nel nostro esempio l’indice i si arresta in corrispondenza del pivot. L’esempio mette in evidenza il motivo di incrementare l’indice i fino a quando si trova un elemento più grande o uguale al pivot. Se non ci fosse la condizione uguale, nel nostro esempio l’indice i verrebbe continuamente incrementato oltre la dimensione del vettore. Per quanto riguarda l’indice j esso non viene spostato in quanto l’elemento j-esimo è inferiore al pivot. 13 20 1 15 34 28 21 14 29 3 2 4 5 6 7 8 9 i j

Quick Sort: caso peggiore (cont) Gli elementi di indice i e j vengono scambiati, e l’indice i viene incrementato, mentre j viene decrementato, ottenendo: 13 20 1 15 3 28 21 14 29 34 2 4 5 6 7 8 9 i j L’indice i viene quindi fatto incrementare fino a quando arriva all’elemento 34, che è pari al pivot. L’indice j non viene fatto decrementare perché si riferisce ad un elemento già inferiore al pivot. 13 20 1 15 3 28 21 14 29 34 2 4 5 6 7 8 9 j i

Quick Sort: caso peggiore (cont) 13 20 1 15 3 28 21 14 29 34 2 4 5 6 7 8 9 inf j i Siccome i > j, la prima ricorsione è finita: tutti gli elementi di indice appartenente a inf,..,j sono minori o uguali del pivot. Il numero di tali elementi è n-1 vi è un solo elemento di indice i,..,sup (uguale al pivot) non ci sono elementi di indice appartenente a j+1,..,i-1. L’algoritmo procede quindi ricorsivamente operando SOLO sul vettore delimitati dagli indici (inf,..,j) E’ chiaro che nella successiva ricorsione, le cose potrebbero cambiare, ma si capisce come la scelta del pivot influenza le prestazioni del QuickSort