Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Documenti analoghi
Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Ricerca. Per ricerca si intende il procedimento di localizzazione di una particolare informazione in un elenco di dati.

QuickSort Università degli Studi di Milano

Divide et impera (Divide and Conquer) Dividi il problema in sottoproblemi piu` semplici e risolvili ricorsivamente

Quick Sort. PARTITION(A,p,r) risistema il sottoarray A[p...r] e riporta l indice q:

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

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

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera:

Esercitazione 2. Quicksort

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Quicksort Moltiplicazione di interi Master Theorem Valutazione del tempo di esecuzione di algoritmi iterativi e ricorsivi

Albero di Riscorsione

Linguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità.

ALGORITMI DI ORDINAMENTO E RICERCA BINARIA. Docente: Giorgio Giacinto AA 2008/2009. problema dell ordinamento in modi diversi

Algoritmi di Ordinamento

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

Algoritmi di ordinamento

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

Algoritmi di ordinamento

come segue: data una collezione C di elementi e una un elemento che verifica la proprietà P

ALGORITMI Docente: Prof. Domenico Cantone

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

Per regnare occorre tenere divisi i nemici e trarne vantaggio. fai ad ogni passo la scelta più conveniente

RICERCA IN UN VETTORE

A. Ferrari. algoritmi notevoli. Python. Alberto Ferrari Informatica

Algoritmi e Strutture Dati

Ricerca binaria (o dicotomica) di un elemento in un vettore

INFORMATICA GENERALE

Fondamenti di Informatica

Algoritmi e Strutture Dati

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

A. Ferrari Algoritmi notevoli

Algoritmi di ordinamento

Corso di Tecniche di Programmazione

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Algoritmi di ordinamento

Si può fare di meglio?

Tecniche Algoritmiche: divide et impera

Problemi di ricerca in insiemi ordinati

Selezione per distribuzione

QuickSort (1962, The Computer Journal)

In questa lezione. Il Mergesort: primo esempio di applicazione della tecnica divide et impera analisi tempo di esecuzione del Mergesort

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Algoritmi

Algoritmi di ordinamento

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

Laboratorio di Programmazione Appunti sulla lezione 5: Algoritmi di ordinamento (cont.) Alessandra Raffaetà. Bubblesort

QuickSort (1962, The Computer Journal)

Laboratorio di Programmazione Appunti sulla lezione 5: Algoritmi di ordinamento (cont.) Alessandra Raffaetà

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Algoritmi e Strutture Dati. Luciano Gualà

Algoritmi e Strutture Dati

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

Algoritmi di ordinamento: Array e ricorsione

Algoritmi di Ricerca Ordinamento

Laboratorio di Algoritmi

Algoritmi e Strutture Dati. Luciano Gualà

Algoritmi e strutture dati

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Moltiplicazione veloce di interi

Divide et impera. Divide et Impera

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

Divide et impera. Vittorio Maniezzo Università di Bologna

Algoritmi di ordinamento (I parte)

Università di Roma Tor Vergata L16-1. Ricerca: esaminare una collezione di dati, cercando un particolare valore. nome e cognome

Efficienza algoritmi. Esempi

Dato un insieme S di n elementi totalmente ordinato, l'algoritmo di ordinamento detto HeapSort ha le seguenti caratteristiche:

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Scheme: esempi di programmazione

Scheme: esempi di programmazione

Algoritmi e Strutture Dati

Fondamenti di Programmazione

Ordinamenti ricorsivi

Complessità Computazionale. Introduzione

char *s; s = (char *) malloc(5*sizeof(char)); scanf( %s, s); Stringhe

05EIP. Fulvio Corno, Matteo Sonza Reorda Dip. Automatica e Informatica Politecnico di Torino. Definizione di ricorsione e strategie divide et impera

Alcuni Soluzioni. Fornire la specifica di un algoritmo risolutivo utilizzando lo pseudocodice visto a lezione.

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

Università degli Studi di Camerino Laurea in Informatica Prima Prova Parziale del corso di Algoritmi e Strutture Dati

Quicksort. Quicksort: idea di base. Riprendiamo il problema dell'ordinamento di n oggetti.

Ordinamento. Ordinamento. Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

RICERCA BINARIA...1 ALBERO BINARIO DI RICERCA (ABR)...3 RICORSIONE...4 ESEMPI DI RICORSIONE IN VISUAL BASIC...5 ESEMPI DI RICORSIONE IN C / C++...

Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi:

COMPLESSITA COMPUTAZIONALE (II PARTE) Tutor: Francesca Piersigilli

nel trasformare una sequenza di elementi

Mergesort (cont.) 2018/ Lezione 16. Venerdì, 16 Novembre 2018

CAPITOLO 2. Divide et Impera

Algoritmi e strutture di dati 2

Il paradigma divide et impera. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

In questa lezione: correttezza del mergesort Analisi del mergesort: relazioni di ricorrenza e alberi della ricorsione

Corso di Fondamenti di Informatica Algoritmi su array / 1

La ricorsione. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

Bubble Sort. Bubble Sort

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO

Transcript:

QuickSort Algoritmo di ordinamento sul posto che ha tempo di esecuzione : - O(n 2 ) nel caso peggiore - O(n log n) nel caso medio Nonostante le cattive prestazioni nel caso peggiore, rimane il miglior algoritmo di ordinamento in media Ne esistono diverse varianti e miglioramenti

QuickSort È basato sulla metodologia Divide et Impera: Dividi: L array A[p r] viene partizionato (tramite spostamenti di elementi) in due sotto-array non vuoti A[p q] e A[q+1 r] in cui: ogni elemento di A[p q] è minore o uguale ad ogni elemento di A[q+1 r] Impera: i due sottoarray A[p q] e A[q+1 r] vengono ordinati ricorsivamente con QuickSort Combina: i sottoarray vengono ordinati separatamente, quindi non è necessaria alcuna combinazione. A[p r] è già ordinato.

QuickSort QuickSort(A, p, r) IF p < r % controllo base di ricorsione THEN q = Partiziona(A,p,r) QuickSort(A, p, q) QuickSort(A, q+1, r)

Partiziona Procedura Partiziona: 1. l algoritmo sceglie un pivot, cioè l'elemento dell array che fungerà da elemento di confine (per il suo valore e non per la posizione) tra i due sotto-array 2. Sposta i valori > pivot verso l estremità destra dell array e i valori < pivot verso quella sinistra. 3. La posizione di confine q dipenderà dal valore scelto come pivot: tale valore è la posizione in cui si troverà alla fine della procedura l elemento più grande minore o uguale al pivot

Partiziona Partiziona(A,p,r) x = A[p] i = p-1 j = r+1 WHILE true DO REPEAT j = j-1 UNTIL A[j] <= x REPEAT i = i+1 UNTIL A[i] >= x IF i < j THEN scambia A[i] con A[j] ELSE return j

Partiziona La procedura Partiziona è quindi tale che: Se il numero di elementi dell array minori o uguali all elemento A[p], scelto come pivot, è pari a 1 (cioè A[p] è l elemento minimo) (risp. n-1), allora le dimensioni delle partizioni restituite sono 1 per la partizione di sinistra e n - 1 per quella di destra (risp. n-1 e 1) Altrimenti le partizioni tenderanno ad essere più bilanciate

Partiziona Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 (1) WHILE true DO REPEAT j = j - 1 UNTIL A[j] <= x REPEAT i = i + 1 UNTIL A[i] x IF i < j THEN scambia A[i] con A[j] ELSE return j (1)

Partiziona Partiziona(A,p,r) x = A[p] i = p - 1 j = r + 1 (1) WHILE true DO REPEAT j = j - 1 UNTIL A[j]<= x REPEAT i = i + 1 UNTIL A[i] x IF i < j THEN scambia A[i] con A[j] ELSE return j (n)

QuickSort: analisi Il tempo di esecuzione di QuickSort dipende dal bilanciamento delle partizioni restituite dall algoritmo partiziona Il caso migliore si verifica quando le partizioni sono perfettamente bilanciate, entrambe di dimensione n/2 Il caso peggiore si verifica quando una partizione è sempre di dimensione 1 (la seconda è quindi di dimensione n-1)

QuickSort: analisi Caso Migliore: le partizioni sono sempre di uguale dimensione: T(n) = 2T(n/2) + (n) - e per il caso 2 del teorema master: T(n) = (nlog n)

QuickSort: analisi Caso Peggiore: La partizione sinistra ha sempre dimensione 1 mentre quella sinistra ha sempre dimensione n 1 (o viceversa): -T(n) = T(1) + T(n - 1) + (n) poiché T(1)=1 otteniamo -T(n) = T(n-1) + (n) - L equazione di ricorrenza può essere risolta facilmente col metodo iterativo n = -T(n)=T(n-1)+ (n) = (n 2 ) k=1 n Θ k = Θ k=1 k

QuickSort: analisi Caso Medio: Si può mostrare che nel caso medio il QuickSort ha tempo di esecuzione (n log n), dove n è il numero di elementi da ordinare - Anche quando la bipartizione risulta molto sbilanciata nella maggior parte delle chiamate alla procedura Partiziona

Partiziona in C int partiziona( int a[], int l, int r) { int i, j; double pivot; pivot = a[l]; i = l-1; j = r+1; while(1) { do ++i; while( a[i] < pivot && i <= r ); do --j; while( a[j] > pivot ); if( i >= j ) break; swapq(&a[i], &a[j]); } return j; }

Ricerca Per ricerca si intende il procedimento di localizzazione di una particolare informazione in un elenco di dati. Il problema della ricerca in termini generali : dato un insieme D = {a 1,a 2,...,a n } di n elementi distinti e un elemento x (elemento chiave), determinare se x appartiene all'insieme. Il metodo di ricerca dipende da come le informazioni sono organizzate, esistono due possibili approcci : Ricerca Sequenziale serve per ricercare i dati in un vettore NON ordinato Ricerca Binaria o Dicotomica serve nel caso in cui i dati nel vettore siano già ordinati

Ricerca Binaria Se gli elementi sono stati precedentemente ordinati (supponiamo in maniera crescente), si può effettuare una ricerca più efficiente che individua l elemento cercato senza dover scandire tutti gli elementi del vettore. L algoritmo di ricerca binaria dopo ogni confronto scarta metà degli elementi del vettore su cui si effettua la ricerca, restringendo il campo di ricerca. 2 3 6 12 16 21 24 26 28 30 36 41 50 inf med sup 2 3 6 12 16 21 24 26 28 30 36 41 50 x = 28 2 3 6 12 16 21 24 26 28 30 36 41 50

Ricerca Binaria La ricerca binaria è un algoritmo divide et impera (divide and conquer), cioè è un algoritmo che divide il problema in due o più sotto-problemi dello stesso tipo (nel nostro caso ancora vettori ordinati), ma di taglia inferiore, quindi più facili da risolvere Struttura ricorsiva del problema: - ciascuno dei sotto-problemi è ancora un problema di ricerca binaria Fase di ricombinazione: le soluzioni dei sotto-problemi in generale devono essere ricombinate per ottenere una soluzione del problema iniziale - Nel caso della ricerca binaria non è necessaria la ricombinazione

Ricerca Binaria L algoritmo può essere descritto mediante i seguenti passi : 1. Si individua l elemento che sta a metà del vettore (mediano) 2. Si confronta la chiave x con tale elemento. Se l elemento individuato non è uguale a quello cercato si prosegue in due modi possibili : se x > elemento mediano la ricerca continua solo nel sottovettore destro se x < elemento mediano la ricerca continua solo nel sottovettore sinistro 3. Il procedimento continua iterativamente dimezzando ogni volta la taglia del vettore, e arrestandosi quando l'elemento mediano è uguale ad x (esito positivo) o quando non è più possibile suddividere (esito negativo)

Ricerca Binaria La ricerca termina con successo quando l elemento mediano V[i] considerato ad un certo passo è proprio uguale alla chiave x. La ricerca termina con insuccesso quando la parte di vettore considerata è costituita da un solo elemento diverso dalla chiave. Osservazione : Per il calcolo del valore mediano abbiamo bisogno di tre indici che individuino l'inizio, la fine e la metà del vettore considerato ad ogni passo

Esercizio 1. Implementare in C la funzione di ricerca binaria. In particolare, implementare due prototipi: int binsearch(int* vett, int dim, int key); int binsearch(char** vett, int dim, char* key); Le funzioni devono restituire 1 se il valore key è presente, 0 altrimenti Assumere che il vettore vett sia già ordinato in maniera crescente (nel secondo caso secondo l'ordine lessicografico) 2. Implementare in C l'algoritmo QuickSort.

Esercizio 3. Scrivere un programma C che confrontare i tempi di esecuzione degli algoritmi heapsort, quicksort, insertionsort e bubblesort, su diversi input. Considerare i seguenti casi: a. Vettore di dimensione n già ordinato in maniera crescente. b. Vettore di dimensione n già ordinato in maniera decrescente. c. Vettore di dimensione n generato casualmente con valori tra 1 e 1000. d. Ripetere i punti a, b, c, con n=20000,30000 e 40000