Quicksort. Quicksort: idea di base. Riprendiamo il problema dell'ordinamento di n oggetti.
|
|
- Virginia Mancuso
- 6 anni fa
- Visualizzazioni
Transcript
1 Riprendiamo il problema dell'ordinamento di n oggetti. Quicksort Per questo problema abbiamo già visto gli algoritmi insertion-sort e mergesort. Il tempo di esecuzione di insertion-sort è (n 2 ). Il tempo di esecuzione di mergesort è (n log n), ma mergesort non ordina in loco. 1 2 Studieremo ora l'algoritmo quicksort che, se opportunamente implementato, risulta essere il più veloce algoritmo di ordinamento general purpose. Lo studio del quicksort ci farà imparare delle tecniche algoritmiche molto importanti. Quicksort: idea di base Per ordinare un array: scegli un elemento (detto ) metti a sinistra gli elementi metti a destra gli elementi ordina ricorsivamente la parte destra e la parte sinistra. 3 4 Esempio: dobbiamo ordinare se prendiamo come 19, otteniamo Quicksort Quicksort La ricorsione termina quando dobbiamo ordinare un array di un solo elemento. Rimane da specificare la procedura che usiamo per mettere gli elementi sulla sinistra, e gli elementi sulla destra. Nel seguito indicheremo tale procedura con il nome
2 Partition: idea di base. Facciamo crescere contemporaneamente la regione con gli elementi sulla sinistra, e la regione con gli elementi sulla destra. Esempio. =17 Avanziamo i due puntatori, facendo crescere le due regioni, fino a quando è possibile Quando entrambi i puntatori non possono avanzare scambiamo gli elementi A questo punto i due puntatori possono riprendere ad avanzare È possibile che i due puntatori si fermino nella stessa posizione se essa contiene il. Esempio. Supponiamo che il sia La procedura termina quando i due puntatori si incrociano Nell'implementazione della procedura ci sono due scelte fondamentali da fare: come scegliere il ; come trattare gli elementi uguali al durante la scansione. Nella nostra prima versione prendiamo come il primo elemento dell'array (vedremo che si tratta di una pessima scelta), e fermiamo la scansione quando incontriamo elementi uguali al. Mostriamo ora una prima semplice implementazioni della procedura. La procedura prende in input un array A[ ], e due interi p e r (p<r) e partiziona gli elementi A[p]... A[r]. Viene restituito un intero q tale che gli elementi in A[p]... A[q] sono minori o uguali di quelli in A[q+1]... A[r]
3 int Partition(Item A[], int p, int r) Item t; int i= p-1; int j= r+1; Item x = A[p]; // // Quicksort: ordina A[p]...A[r] (p<=r) void quicksort(item A, int p, int r) int q; if(p<r) while(1) while(a[--j]>x) ; // esce se A[j]<=x q = Partition(A,p,r); while(a[++i]<x) ; // esce se A[i]>=x quicksort(a,p,q); if(i<j) quicksort(a,q+1,r); // scambia A[i] <-> A[j] t=a[i]; A[i]=A[j]; A[j]=t; else break; // per ordinare A[0]...A[n-1] return j; quicksort(a,0,n-1) Prime osservazioni Quicksort ordina in loco La strategia di ordinamento è simile a quella del mergesort: la procedura di fusione (merge) è stata sostituita dal partizionamento. Analisi quicksort Vogliamo ora analizzare il tempo di esecuzione dell'algoritmo quicksort. Trattandosi di un algoritmo di ordinamento basato sui confronti, analizziamo il numero di confronti in funzione della numero n di oggetti da ordinare Osserviamo che: tutti i confronti sono eseguiti nella procedura. quando è eseguita su un sottoarray di lunghezza m vengono eseguiti m confronti (ogni elemento è confrontato una volta con il ). Se l'array da ordinare viene partizionato in due array di dimensione r e n-r abbiamo che il numero di confronti C(n) soddisfa alla ricorrenza: C(n) = 0 se n = 1 C(r)+ C(n-r) + n se n >
4 Questa ricorrenza non è del tipo che si può studiare mediante il teorema principale anche perché il parametro r cambia ad ogni chiamata della procedura! Studieremo il caso peggiore e il caso migliore, e cercheremo di farci un'idea del caso medio. 19 Quicksort: caso peggiore Il caso peggiore si verifica quando ad ogni passo l'array viene partizionato in due regioni di cui una contiene un solo elemento. Abbiamo allora: C(n) = C(n-1) + n = C(n-2) + (n-1) + n = C(1) (n-2) + (n-1) + n = (n 2 ) 20 Sfortunatamente, con la nostra scelta del il caso peggiore si presenta quando l'array è già ordinato (sia in ordine crescente che decrescente). Questo è uno dei motivi per cui è opportuno cambiare la scelta del! Quicksort: caso migliore Il caso migliore si verifica quando ad ogni passo l'array viene partizionato in due regioni uguali. Abbiamo allora: C(n) = 0 se n = 1 2C(n/2) + n se n > 1 21 Per il teorema principale C(n) = (n log n) 22 Ancora una volta il caso peggiore e il caso migliore risultano molto diversi tra loro. Abbiamo ora che C(n) soddisfa alla ricorrenza: È naturale chiedersi se dobbiamo aspettarci più di frequente un tempo (n 2 ) o un tempo (n log n) o qualcosa di intermedio. C(n) = 0 se n = 1 C(n/10) + C(9n/10) + n se n > 1 Per farci un'idea sul caso medio studiamo il caso (altamente improbabile) che la procedura crei sempre due regioni di cui una sia 9 volte più grande dell'altra. 23 Analizzando l'albero di ricorrenza si ottiene che anche in questo caso C(n) = (n log n) 24
5 Esempio albero di ricorrenza, n=1000: Analisi albero di ricorrenza: n/10 n 9n/10 (n) (n) n/100 9n/100 9n/100 81n/100 (n) Per scendere di un livello nell'albero di ricorrenza si paga un costo pari alla somma delle dimensioni dei problemi cioè (n) Dopo log 10 n livelli alcuni sottoproblemi raggiungono dimensione 1 e non sono più suddivisi. Dopo log 9/10 n livelli tutti i sottoproblemi hanno raggiunto dimensione 1 e sono stati risolti direttamente. Il costo totale è dato dal costo di ogni livello per il numero dei livelli quindi risulta (n log 9/10 n) cioè (n log n). Studiamo ora il caso in cui si alternano una partizione cattiva e una buona. Nei livelli dispari il problema viene spezzato in [1,n-1], nei livelli pari in [n/2,n/2]. Possiamo ripetere l'analisi sull'albero di ricorrenza Esempio: albero di ricorrenza n=103 Analisi albero di ricorrenza: n n-1 (n) (n-1) (n-1)/2 (n-1)/2 (n-1) Per scendere di un livello nell'albero di ricorrenza si paga un costo che è sempre al più (n) L'altezza dell'albero è 2log n quindi il costo complessivo è (n log n). 30
6 Riassumendo. Se le partizioni sono spesso molto sbilanciate, il costo può risultare molto alto. Se le partizioni non sono troppo sbilanciate si ha un costo (n log n) cioè asintoticamente uguale al caso ottimo. Un simile comportamento si ha anche per altri algoritmi ricorsivi che suddividono un problema in sottoproblemi di dimensione non necessariamente uguale. Bilanciare il lavoro solitamente riduce il costo complessivo dell'algoritmo Introduciamo il Quicksort perché: Test di autovalutazione A. Ha una complessità asintotica minore rispetto al mergesort. B. A differenza del mergesort nel caso migliore ha un costo (n). C. Non necessita di memoria ausiliaria Il Quicksort: La procedura : A. È un algoritmo ricorsivo, ma non è basato sul divide et impera. B. È basato sul divide et impera e quindi ha un costo (n log n). C. Ha un costo (n log n) sono quando divide l array in parti uguali. A. Garantisce che ogni partizione contenga almeno n/10 elementi. B. È una procedura ricorsiva. C. Divide l array in parti uguali quando l'array è già ordinato
7 La procedura (2): A. Deve evitare di creare una partizione con un solo elemento altrimenti Quicksort non termina. B. Deve evitare di creare una partizione con zero elementi altrimenti Quicksort non termina. C. Deve evitare di accedere ad elementi al di fuori di A[p]...A[r]. Un piccolo trucco... Nella versione base Quicksort è chiamato ricorsivamente fino a quando non arriviamo ad un array di dimensione 1. È stato però osservato che gli array piccoli sono ordinati più velocemente da Insertion-Sort. Questo fatto suggerisce una semplice modifica del Quicksort per affidare all'insertion-sort l'ordinamento degli array piccoli // ordina A[p]... A[r] (deve essere p<=r) #define soglia 10 void quicksort(item A, int p, int r) int q; Quicksort: scelta del if(p+soglia>r) // ordina array di dim <= soglia // con insertion_sort insertion_sort(a+p,r-p+1); else q = Partition(A,p,r); quicksort(a,p,q); quicksort(a,q+1,r); Abbiamo visto che scegliere come il primo elemento dell'array comporta un costo (n 2 ) se l'array è già ordinato o è quasi ordinato. Questo non è accettabile quindi studiamo strategie alternative per la scelta del. Tutte le strategie che vedremo possono comportare un costo (n 2 ), ma non quando l'array è già ordinato. Random ing Abbiamo visto che otteniamo un costo asintoticamente superiore a (n log n) soltanto se scegliamo male il numerose volte durante l'algoritmo. Questo suggerisce di affidare la scelta al caso, nella speranza che non saremo sfortunati troppo spesso
8 Supponiamo quindi di avere una procedura che dati due interi i,j con i<j, restituisce un intero scelto casualmente nell'intervallo [i,j]. Esempio: (7,16) restituisce un numero scelto a caso tra 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ognuno di questi numeri ha la stessa probabilità di essere scelto. Ad ogni esecuzione della procedura usiamo per scegliere casualmente il tra i valori A[p], A[p+1],...,A[r-1], A[r]. Una volta scelto il lo mettiamo in A[p] perché è usato dall'algoritmo come sentinella int RandPartition(Item A[], int p, int r) Item t, x; int i,j; i = Random(p,r); // posizione random x = A[i]; // // scambia A[i]<->A[p] t=a[i];a[i]=a[p];a[p]=t; i= p-1; j= r+1; // inizializza indici while(1) // codice per il partizionamento // come per Partition() Si può dimostrare matematicamente che il tempo di esecuzione di Quicksort basato su è (n log n) con probabilità molto vicina ad 1. In altre parole, devo essere molto sfortunato per avere un tempo di esecuzione asintoticamente superiore a (n log n). return j; Osserviamo che il tempo di esecuzione non dipende più dall'input, ma dalle scelte eseguite dalla procedura. In altre parole, non esistono più sequenze buone o cattive, ma scelte casuali fortunate o sfortunate. Pivot medio di 3 La generazione dei numeri causali rallenta la procedura e quindi tutto l'algoritmo Quicksort. Per questo motivo sono state proposte altre strategie di selezione del che in pratica risultano leggermente più veloci
9 La strategia medio di 3 consiste nel considerare gli elementi che sono nella prima e ultima posizione dell'array, e l'elemento che si trova in posizione mediana. Esempio: Di questi tre valori viene preso quello intermedio (nell'esempio qui sopra 31). 49 Item Median3(Item A[],int Left,int Right) int Center = ( Left + Right )/2; if( A[ Left ] > A[ Center ] ) Swap( &A[ Left ], &A[ Center ] ); if( A[ Left ] > A[ Right ] ) Swap( &A[ Left ], &A[ Right ] ); if( A[ Center ] > A[ Right ] ) Swap( &A[ Center ], &A[ Right ] ); // ora A[Left]<= A[Center] <= A[Right] // metto il in A[Right-1] Swap( &A[ Center ], &A[ Right - 1 ] ); return A[ Right - 1 ]; // Return 50 Array iniziale: Dopo aver ordinato i 3 elementi: Al termine di Median3: Questa scelta del permette di realizzare una procedura più sofisticata che usa gli elementi estremi come sentinelle. Per semplicità mostriamo questa procedura incorporata all'interno del quicksort Valore restituito come : void Qsort(Item A[], int p, int r) Item x, t; int i,j; Esempio Qsort. Situazione dopo Median3 if(p+3<r) x = Median3(A, p, r); i = p; j=r-1; while(1) while(a[--j]>x) ; // esce se A[j]<=x while(a[++i]<x) ; // esce se A[i]>=x if(i<j) Swap(&A[i],&A[j]); else break; Inizio la scansione: Swap(&A[i],&A[r-1]); Qsort(A,p,i-1); Qsort(A,i+1,r); else InsertionSort(A+p,r-p+1); 53 54
10 Scambio gli elementi: Scambio gli elementi: riprendo la scansione: riprendo la scansione: Gli indici si sono incrociati quindi la scansione termina. A questo punto scambio il con A[i] e chiamo ricorsivamente l'algoritmo sulle porzioni azzurra e gialla Come tutte le implementazioni efficienti del quicksort anche questa è delicata. Esempio. Se sostituiamo il codice a sinistra con quello a destra... i = p; j=q-1; while(1) while(a[--j]>x) ; while(a[++i]<x) ; if(i<j) Swap(&A[i],&A[j]); else break; i = p+1; j=q-2; while(1) while(a[j]>x) j--; while(a[i]<x) i++; if(i<j) Swap(&A[i],&A[j]); else break;...il programma entra in loop infinito se A ha tutti gli elementi uguali. 58 Elementi uguali al Una scelta molto importante nell'implementazione del quicksort è cosa fare quando, durante la scansione incontriamo elementi uguali al. Fino ad ora abbiamo sempre interrotto la scansione con il vantaggio che il faceva da sentinella. È una buona scelta? 59 Per minimizzare gli scambi, posso continuare la scansione anche quando incontro elementi uguali al. Questo richiede che durante la scansione controlliamo che gli indici i e j non superino i limiti degli array. Se i controlli sono fatti in maniera corretta l'algoritmo funziona, cioè ordina qualsiasi sequenza. 60
11 Sfortunatamente questo metodo porta ad un costo (n 2 ) se tutti gli elementi sono uguali. Esempio. Se inizio muovendo l'indice di destra, ottengo la situazione: Dato che ad ogni esecuzione di ho una suddivisione [1,n-1], il costo complessivo diventa (n 2 ). Ho quindi un programma che in generale funziona benissimo, ma che per alcune sequenze di input misteriosamente risulta molto lento. La cosa è grave anche perché le sequenze su cui il programma è lento sono facili da ordinare La strategia di fermare la scansione ogni volta che si incontra un elemento uguale al spezza a metà gli array contenenti un unico valore Abbiamo quindi che la nostra versione del quicksort ordina un array di elementi uguali in (n log n). In realtà non è un risultato di cui andare fieri: vedremo che esistono algoritmi (n) per ordinare interi in un range piccolo. Osservazione: è giusto preoccuparsi delle sequenze in cui ci sono pochi valori distinti perché tali sequenze saltano fuori anche quando non ce le aspettiamo. 64 Esempio. Supponiamo di dover ordinare una sequenza di 10 6 interi, di cui 10 3 sono uguali a 2 (rappresentati da in figura). Situazione iniziale: Considerazioni sullo spazio Abbiamo visto che uno dei principali motivi che possono farci preferire il quicksort al mergesort è il non richiedere spazio ausiliario. Ma è veramente così? Dopo un certo numero di chiamate ricorsive quicksort lavora su una partizione contenente molti
12 Ricordiamo che lo stack contiene il record di attivazione di ogni chiamata di procedura non ancora conclusa. Di conseguenza, un algoritmo ricorsivo occupa (sullo stack) una quantità di spazio proporzionale alla massima profondità dell'albero di ricorsione. Nel caso in cui le partizioni siano molto sbilanciate, il quicksort può avere un albero di profondità massima (n). Esempio. Se il partizionamento risulta sempre del tipo [n-1,1] avremo sullo stack i record di attivazione delle chiamate: quicksort(a,0,n-1) quicksort(a,0,n-2) quicksort(a,0,n-3) quicksort(a,0,1) Se questo fenomeno si verifica, lo spazio occupato sullo stack può essere molto maggiore dell'array ausiliario richiesto dal mergesort. Questo inconveniente si può verificare con tutte le versioni di quicksort che abbiamo visto in quanto per ognuna di esse possiamo avere partizioni sbilanciate. Fortunatamente c'è una tecnica generale che garantisce che lo stack non contenga mai più di log n record di attivazione. La tecnica consiste nell'eseguire la chiamata ricorsiva sulla partizione più piccola e di sostituire la ricorsione sulla partizione più grande con una iterazione // Quicksort: versione con stack O(log n) void quicksort(item *A, int p, int r) int q; while(p<r) q = Partition(A,p,r); if((q-p+1)<(r-q)) // la prima meta' e + piccola quicksort(a,p,q); // ricorsione p=q+1; // iterazione else // la seconda meta' e + piccola Dato ogni chiamata ricorsiva viene fatta su di un sottoproblema di dimensione al più la metà del problema precedente, abbiamo che l'i-esimo record di attivazione sullo stack si riferisce ad un problema di dimensione al più n/2 i. Quindi deve essere 2 i < n e di conseguenza i < log n, cioè lo stack contiene al più log n record di attivazione. quicksort(a,q+1,r); // ricorsione r=q; // iterazione 92 93
13
QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)
QUICKSORT Basato sul paradigma divide-et-impera (come MERGE-SORT) Divide: stabilisce un valore di q tale da dividere l array A[p.. r] in due sottoarray non vuoti A[p.. q] e A[q+1.. r], dove ogni elemento
DettagliAlbero di Riscorsione
Albero di Riscorsione Albero di ricorsione Un albero di ricorsione è un modo di visualizzare cosa accade in un algoritmo divide et impera L etichetta della radice rappresenta il costo non ricorsivo della
DettagliOrdinamento per inserzione e per fusione
Ordinamento per inserzione e per fusione Alessio Orlandi 15 marzo 2010 Fusione: problema Problema Siano A e B due array di n A e n B interi rispettivamente. Si supponga che A e B siano ordinati in modo
DettagliAlgoritmi 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
DettagliAnalisi algoritmi ricorsivi e relazioni di ricorrenza
Analisi algoritmi ricorsivi e relazioni di ricorrenza Punto della situazione Finora abbiamo affrontato: il tempo di esecuzione di un algoritmo, l analisi asintotica con le notazioni asintotiche e la tecnica
DettagliAlgoritmi 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
DettagliSi può fare di meglio?
Si può fare di meglio? Gli algoritmi visti fino ad ora hanno costo O(n 2 ) È possibile fare di meglio? Quanto meglio? Algoritmi e Strutture Dati 1 Algoritmi divide et impera Idea generale Divide: Scomporre
DettagliDue algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort
Due algoritmi di ordinamento basati sulla tecnica Divide et Impera: Mergesort e Quicksort (13 ottobre 2009, 2 novembre 2010) Ordinamento INPUT: un insieme di n oggetti a 1, a 2,, a n presi da un dominio
DettagliLaboratorio 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
DettagliTecniche Algoritmiche: divide et impera
Tecniche Algoritmiche: divide et impera Una breve presentazione F. Damiani - Alg. & Lab. 04/05 Divide et impera (o Divide and conquer) Per regnare occorre tenere divisi i nemici e trarne vantaggio F. Damiani
DettagliAlgoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort
Algoritmi e Strutture Dati Capitolo 4 Ordinamento: Selection e Insertion Sort Ordinamento Dato un insieme S di n elementi presi da un dominio totalmente ordinato, ordinare S in ordine non crescente o non
DettagliFondamenti 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
DettagliDivide et impera. Divide et impera. Divide et impera. Divide et impera
Divide et impera Divide et impera La tecnica detta divide et impera è una strategia generale per impostare algoritmi (par. 9.4). Consideriamo un problema P e sia n la dimensione dei dati, la strategia
Dettagli2. 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
DettagliAlgoritmi 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 Insertion Sort Quicksort Heapsort Indice
DettagliLaboratorio di Algoritmi e Strutture Dati II Semestre 2005/2006. Ordinamenti: mergesort e quicksort
Laboratorio di Algoritmi e Strutture Dati II Semestre 2005/2006 Ordinamenti: mergesort e quicksort Marco Antoniotti Mergesort e Quicksort Due importantissimi algoritmi di ordinamento La conoscenza completa
DettagliAlgoritmi e strutture dati
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 alfabeticamente lista di nomi, o insieme
DettagliScopo: ordinare una sequenza di elementi in base a una certa relazione d ordine. Ipotesi: gli elementi siano memorizzati in un array.
ALGORITMI DI ORDINAMENTO Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine lo scopo finale è ben definito algoritmi equivalenti diversi i algoritmi i possono avere efficienza
DettagliAlgoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.
E. Calabrese: Fondamenti di Informatica Algoritmi-1 Algoritmi di ricerca Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati. Per esempio: - cercare
DettagliEsercizi di Algoritmi e Strutture Dati
Esercizi di Algoritmi e Strutture Dati Moreno Marzolla marzolla@cs.unibo.it Ultimo aggiornamento: 3 novembre 2010 1 Trova la somma/1 Scrivere un algoritmo che dati in input un array A[1... n] di n interi
DettagliProgrammazione I - corso B a.a prof. Viviana Bono
Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 2009-10 prof. Viviana Bono Blocco 15 Algoritmi su array: selection sort, insertion sort, fusione
DettagliArray e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 12 Array e Oggetti A. Miola Dicembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Array e Oggetti 1 Contenuti Array paralleli
DettagliQuicksort 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.
DettagliProblemi di ordinamento
Problemi di ordinamento Input: una sequenza di n numeri a 1, a 2,..., a n ; Output: una permutazione a 1, a 2,..., a n di a 1, a 2,..., a n tale che a 1 a 2... a n. Generalmente, la sequenza è rappresentata
DettagliLinguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità.
Linguaggio C Problemi di Ricerca e Ordinamento: Algoritmi e Complessità. 1 Complessità degli Algoritmi Si definisce Complessità di un Algoritmo C(A) la funzione dei parametri rilevanti per A che determina
DettagliAlgoritmi e Strutture Dati
Algoritmi Ricorsivi e Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 I conigli di Fibonacci Ricerca Binaria L isola dei conigli
DettagliT 1 =1. n 4 n log n. T n =3 T. Esercizio 1 (6 punti) A.A Esame di Algoritmi e strutture dati 18 luglio 2008
A.A. 00 0 Esame di Algoritmi e strutture dati luglio 00 Esercizio (6 punti) Risolvere con almeno due metodi diversi la seguente relazione di ricorrenza T = T n = T n n log n A.A. 00 0 Esame di Algoritmi
DettagliAlberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.
Alberi Alberi Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Frodo Dudo Daisy Alberi Gli alberi sono una generalizzazione
DettagliAlgoritmi 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
DettagliQuickSort (1962, The Computer Journal)
QuickSort (1962, The Computer Journal) Charles Antony Richard Hoare (1934 -) Attualmente senior researcher al Microsoft Research Center di Cambridge Hoare ha vinto nel 1980 il Turing Award, il premio più
DettagliUn 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
DettagliAlgoritmi di ordinamento. Sequential-sort, Bubble-sort, Quicksort
Algoritmi di ordinamento Sequential-sort, Bubble-sort, Quicksort Definizione Dato un multi-insieme V={Vn} N-1 n=0 di valori in D, il problema dell ordinamento è trovare una permutazione n(j) degli indici
DettagliCalcolare x n = x x x (n volte)
Calcolare x n = x x x (n volte) Abbiamo bisogno di: una variabile ris in cui ad ogni iterazione del ciclo si ha un risultato parziale, e che dopo l ultima iterazione contiene il risultato finale; una variabile
DettagliLaboratorio 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:
DettagliFondamenti 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
DettagliAlberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.
Alberi Alberi Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo Frodo Daisy Alberi Gli alberi sono una generalizzazione
DettagliEsercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.
Esercizio 1 E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1 livello 0 FB = -1 FB = -1 livello 1 FB = -1 livello 2 livello 3 L altezza è 3, il minimo si trova nel
DettagliOrdinamento. Ordinamento. Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona
Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona Sommario Gli array in java Problema ordinamento Selection sort per array di oggetti:
DettagliOrdinamento. 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
DettagliLaboratorio 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:
DettagliCorso di Laurea Ingegneria Informatica Fondamenti di Informatica 2
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 06 Algoritmi di ordinamento C. Limongelli Febbraio 2008 http://www.dia.uniroma3.it/~java/fondinf2/ Algoritmi di Ordinamento 1
DettagliLa ricerca. Sequenziale Binaria L ordinamento. Selection Sort Appendice: Quick Sort. Sommario FONDAMENTI DI INFORMATICA 1. Ricapitolando un po
Università degli Studi di Cagliari Corso di Laurea in Ingegneria Biomedica (Industriale), Chimica, Meccanica, Elettrica FONDAMENTI DI INFORMATICA 1 http://www.diee.unica.it/~marcialis/fi1 A.A. 2010/2011
Dettagli5. DIVIDE AND CONQUER I
Divide-et-Impera (Divide and conquer) 5. DIVIDE AND CONQUER I Mergesort e Relazioni di ricorrenza Esempi di progettazione D&I Moltiplicazione di interi Contare inversioni Divide-et-Impera. Definizione
DettagliAlgoritmi e strutture di dati 2
Algoritmi e strutture di dati 2 Paola Vocca Lezione 1: Divide et Impera 1 Paradigma del divide et impera Strutturato in tre fasi. Sia Π() istanza di dimensione di un problema computazionale Π (dove è immediato
DettagliInformatica II. Capitolo 2 Analisi di algoritmi. Valutare la complessità in tempo. Complessità in tempo: cosa serve?
Valutare la complessità in tempo Complessità in tempo: cosa serve? Informatica II Capitolo 2 Analisi di algoritmi Per stimare il tempo impiegato da un programma Per stimare il più grande input gestibile
DettagliSommario. Ordinamento. Selection Sort Bubble Sort/ Shaker Sort Shell Sort
Ordinamento Sommario Ordinamento Selection Sort Bubble Sort/ Shaker Sort Shell Sort Cosa e' l'ordinamento Il problema consiste nell elaborare insiemi di dati costituiti da record I record hanno sono costituiti
DettagliNotazione asintotica. notazione Ω. notazione O. notazione o notazione ω. Marina Zanella Algoritmi e strutture dati Richiami matematici 1
Notazione asintotica Sebbene si possa talvolta determinare il tempo esatto di esecuzione di un algoritmo, l estrema precisione non giustifica lo sforzo del calcolo; infatti, per input sufficientemente
DettagliNell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi:
Pag 24 3) Il problema della ricerca Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi: si incontrano in una grande varietà di situazioni reali; appaiono come sottoproblemi
DettagliLa ricorsione. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino
La ricorsione Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino Sommario! Definizione di ricorsione e strategie divide et impera! Semplici algoritmi ricorsivi! Merge
DettagliDati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base
Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1. Sia T una stringa arbitraria di lunghezza n 1 su un alfabeto Σ. È sempre possibile
DettagliT 1 =1. n 6 n. T n =3 T. Esercizio 1 (6 punti)
A.A. 7 8 Esame di Algoritmi e strutture dati 9 luglio 8 Esercizio (6 punti) Risolvere con almeno due metodi diversi la seguente relazione di ricorrenza T = T n =3 T n 6 n A.A. 7 8 Esame di Algoritmi e
DettagliEsercizi Capitolo 12 - Divide-et-Impera
Esercizi Capitolo 12 - Divide-et-Impera Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile saltare
DettagliUNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi
UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA Matlab: esempi ed esercizi Sommario e obiettivi Sommario Esempi di implementazioni Matlab di semplici algoritmi Analisi di codici Matlab Obiettivi
DettagliUNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Algoritmi
UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA Algoritmi Algoritmi classici Alcuni problemi si presentano con elevata frequenza e sono stati ampiamente studiati Ricerca di un elemento in un vettore
DettagliLE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve
LE STRUTTURE DATI DINAMICHE: GLI ALBERI Cosimo Laneve 1 argomenti 1. definizione di alberi e nozioni relative 2. implementazione degli alberi, creazione, visita 3. algoritmo di visita iterativa e sua implementazione
DettagliConcetti di base di complessità degli algoritmi
Concetti di base di complessità degli algoritmi 1 Problemi, algoritmi, programmi Problema: il compito da svolgere quali output vogliamo ottenere a fronte di certi input cioè quale funzione vogliamo realizzare
DettagliProgettazione di algoritmi
Progettazione di algoritmi Discussione dell'esercizio [vincoli] Prima di tutto rappresentiamo il problema con un grafo G: i nodi sono le n lavorazioni L 1, L 2,, L n, e tra due nodi L h, L k c'è un arco
DettagliNote per la Lezione 4 Ugo Vaccaro
Progettazione di Algoritmi Anno Accademico 2016 2017 Note per la Lezione 4 Ugo Vaccaro Ripasso di nozioni su Alberi Ricordiamo che gli alberi rappresentano una generalizzazione delle liste, nel senso che
DettagliTempo e spazio di calcolo (continua)
Tempo e spazio di calcolo (continua) I numeri di Fibonacci come case study (applichiamo ad un esempio completo le tecniche illustrate nei lucidi precedenti) Abbiamo introdotto tecniche per la correttezza
Dettagli2.2 Alberi di supporto di costo ottimo
. Alberi di supporto di costo ottimo Problemi relativi ad alberi hanno numerose applicazioni: progettazione di reti (comunicazione, teleriscaldamento,...) memorizzazione compatta di sequenze (DNA) diffusione
DettagliOrdinamenti per confronto: albero di decisione
Ordinamenti per confronto: albero di decisione Albero di decisione = rappresentazione grafica di tutte le possibili sequenze di confronti eseguite da un algoritmo assegnato di ordinamento per confronto
DettagliAlgoritmi e Strutture Dati Esercizi Svolti. Giuseppe Persiano Dipartimento di Informatica ed Appl. Renato M. Capocelli Università di Salerno
Algoritmi e Strutture Dati Esercizi Svolti Giuseppe Persiano Dipartimento di Informatica ed Appl Renato M Capocelli Università di Salerno Indice Esercizio 12-3 5 Esercizio 23-4 6 Esercizio 63-3 7 Esercizio
DettagliLaboratorio di Algoritmi e Strutture Dati. Code con Priorità
Laboratorio di Algoritmi e Strutture Dati Code con Priorità Teresa M.A. Basile basile@di.uniba.it Dipartimento di Informatica Università degli Studi di Bari Aldo Moro Materiale di base gentilmente concesso
DettagliAlgoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione
Algoritmi greedy Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione Gli algoritmi greedy sono algoritmi basati sull idea
DettagliPROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI
PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI PROBLEMA DELLA RICERCA in termini generali: Dati in input un insieme S di elementi (numeri, caratteri, stringhe, ) e un elemento
DettagliTecniche Algoritmiche/1 Divide et Impera
Tecniche Algoritmiche/1 Divide et Impera Ivan Lanese Dipartimento di Informatica Scienza e Ingegneria Università di Bologna Ivan.lanese@gmail.com http://www.cs.unibo.it/~lanese/ Divide-et-impera 2 Tecniche
DettagliAlgoritmi e Strutture Dati
Heap Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Heap Heap binari: definizione Un heap binario è una struttura dati composta
DettagliCorso di Tecniche di Programmazione
Corso di Tecniche di Programmazione Corsi di Laurea in Ingegneria Informatica ed Automatica Anno Accedemico 003/004 Proff. Giuseppe De Giacomo, Luca Iocchi, Domenico Lembo Dispensa : Algoritmi di Ordinamento
DettagliEsercizi per il corso di Algoritmi e Strutture Dati
1 Esercizi per il corso di Algoritmi e Strutture Dati 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
DettagliNote per la Lezione 6 Ugo Vaccaro
Progettazione di Algoritmi Anno Accademico 2016 2017 Note per la Lezione 6 Ugo Vaccaro Ancora sulla tecnica Programmazione Dinamica Nella lezione scorsa abbiamo appreso che la tecnica Divide-et-Impera,
DettagliEsercizi 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
DettagliCOMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI
COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.200.2005/06 Prof. V.L. Plantamura Dott.ssa A. Angelini Ω (grande omega) Diciamo che T(n) = Ω (f(n)), - leggiamo T(n) ha complessità
DettagliTempo e spazio di calcolo (continua)
Tempo e spazio di calcolo (continua) I numeri di Fibonacci come case study (applichiamo ad un esempio completo le tecniche illustrate nei lucidi precedenti) Abbiamo introdotto tecniche per la correttezza
DettagliSOMMARIO 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,
DettagliEsempio: rappresentare gli insiemi
Esempio: rappresentare gli insiemi Problema: rappresentare gli insiemi Vedremo che la scelta della rappresentazione per implementarli non è così ovvia come era stato per i numeri razionali In realtà ci
DettagliAlgoritmi e Strutture Dati
Algoritmi e Strutture Dati Capitolo 1 Un introduzione informale agli algoritmi Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Definizione informale di algoritmo Insieme di istruzioni, definite
DettagliPROVETTE D ESAME. Algoritmi e Strutture Dati
PROVETTE D ESAME Algoritmi e Strutture Dati ESERCIZIO 1 Si ottengano limiti superiori e inferiori per la seguente ricorrenza ESERCIZIO 1 ESERCIZIO 2 Dato un albero binario T, il grado di sbilanciamento
DettagliAlgoritmi 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
DettagliSapendo che il vettore è ordinato, la ricerca può essere ottimizzata Vettore ordinato in senso non decrescente: Vettore ordinato in senso crescente:
Sapendo che il vettore è ordinato, la ricerca può essere ottimizzata Vettore ordinato in senso non decrescente: Esiste una relazione d ordine totale sul dominio degli elementi se i
DettagliAlgoritmi 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
DettagliLaboratorio di Programmazione M-Z
Diretta Laboratorio di Programmazione M-Z Docente: Dott.ssa Alessandra Lumini alessandra.lumini@unibo.it Università di Bologna, Sede di Cesena Divide et impera Dividere un problema in sottoproblemi più
DettagliAlgoritmi e Strutture Dati - II modulo Soluzioni degli esercizi
Algoritmi e Strutture Dati - II modulo Soluzioni degli esercizi Francesco Pasquale 6 maggio 2015 Esercizio 1. Su una strada rettilinea ci sono n case nelle posizioni 0 c 1 < c 2 < < c n. Bisogna installare
DettagliEsercizi su alberi binari
Esercizi su alberi binari Esercizi svolti: Determinazione nodi contenti verifica completezza verifica quasi completezza lunghezza del cammino interno determinazione ultima foglia in un quasi completo verifica
DettagliCorso di Fondamenti di Informatica. La ricorsione
Corso di Fondamenti di Informatica La ricorsione La ricorsione Si dice che un oggetto (una struttura dati, una funzione matematica, un concetto ) è ricorsivo se è possibile darne una definizione in termini
DettagliStrutture dati per insiemi disgiunti
Strutture dati per insiemi disgiunti Servono a mantenere una collezione S = {S 1, S 2,..., S k } di insiemi disgiunti. Ogni insieme S i è individuato da un rappresentante che è un particolare elemento
DettagliPermutazioni. 1 Introduzione
Permutazioni 1 Introduzione Una permutazione su un insieme di n elementi (di solito {1, 2,...,n}) è una funzione biiettiva dall insieme in sé. In parole povere, è una regola che a ogni elemento dell insieme,
DettagliAppunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato
Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato Alessandro Panconesi DSI, La Sapienza via Salaria 113, 00198, Roma Consideriamo un problema che ci consentirá di vedere un
DettagliPROGRAMMAZIONE. Fusione Partizionamento Algoritmi avanzati di ordinamento. Prof.ssa Lanza - AA DIB 1/66
PROGRAMMAZIONE Fusione Partizionamento Algoritmi avanzati di ordinamento Prof.ssa Lanza - AA 2006-07 - DIB 1/66 Algoritmi su Array Algoritmi di base (conteggio, ricerca max/min, elimina duplicati, ) Algoritmi
DettagliFondamenti di Informatica T-1 Modulo 2
Fondamenti di Informatica T-1 Modulo 2 1 Obiettivi di questa esercitazione 1. Array e funzioni 2. Array e funzioni ricorsive 3. Array e confronto di array 2 Esercizio 1 Creare un programma che legga da
DettagliEsempio : i numeri di Fibonacci
Esempio : i numeri di Fibonacci La successione di Fibonacci F 1, F 2,... F n,... è definita come: F 1 =1 F 2 =1 F n =F n 1 F n 2,n 2 Leonardo Fibonacci (Pisa, 1170 Pisa, 1250) http://it.wikipedia.org/wiki/leonardo_fibonacci
DettagliParallel sorting. Algoritmi Avanzati. Davide Lo Re
Parallel sorting Algoritmi Avanzati Davide Lo Re Indice Richiami Idea Descrizione Illustrazione Fase 1: Costruzione delle strutture dati Fase 1.1 Fase 1.2 Fase 2: Merge Analisi Costo Algoritmo di Cole
DettagliEsercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);
Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di
DettagliUNIVERSITA DEGLI STUDI DI PERUGIA
UNIVERSITA DEGLI STUDI DI PERUGIA REGISTRO DELLE LEZIONI E DELLE ALTRE ATTIVITÀ DIDATTICHE Anno accademico 2006-2007 Dott./Prof. Pinotti Maria Cristina Settore scientifico-disciplinare INF01 Facoltà Scienze
DettagliHeap e code di priorità
Heap e code di priorità Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010
DettagliCapitolo 19. Ricorsione
Capitolo 19 La ricorsione Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a sé stessa Esempio: Funzione fattoriale su interi non negativi: f(n) = n!
Dettagli2.2 Alberi di supporto di costo ottimo
. Alberi di supporto di costo ottimo Problemi relativi ad alberi hanno numerose applicazioni: progettazione di reti (comunicazione, teleriscaldamento,...) protocolli reti IP memorizzazione compatta di
DettagliAnalisi asintotica della complessità di tempo degli algoritmi
Analisi asintotica della complessità di tempo degli algoritmi Due esempi di funzioni di Python: 1. nel primo mettiamo in evidenza l importanza di una buona organizzazione dei dati in memoria, cioè di una
DettagliLezione 4. Problemi trattabili e soluzioni sempre più efficienti. Gianluca Rossi
Lezione 4 Problemi trattabili e soluzioni sempre più efficienti Gianluca Rossi Trattabile o intrattabile? Consideriamo ora il problema, ben noto a tutti gli studenti a partire dalla scuola media, di calcolare
DettagliLezione 12 Tabelle Hash
Lezione 12 Tabelle Hash Rossano Venturini rossano@di.unipi.it Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 2 ABR: Visita Scrivere un programma che legga
DettagliAlgoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte I)
Algoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte I) Algoritmi greedy Gli algoritmi per problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione
Dettagli