Albero di Riscorsione

Похожие документы
Analisi algoritmi ricorsivi e relazioni di ricorrenza

Tecniche Algoritmiche: divide et impera

Problemi di ordinamento

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

Ordinamenti per confronto: albero di decisione

Algoritmi di ordinamento

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

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

2. Analisi degli Algoritmi

Esercizi per il corso di Algoritmi e Strutture Dati

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

Algoritmi e Strutture Dati

Esercizi su alberi binari

Fondamenti di Informatica

Note per la Lezione 4 Ugo Vaccaro

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

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

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

Algoritmi di ordinamento: Array e ricorsione

Divide et impera. Divide et impera. Divide et impera. Divide et impera

! Dividere il problema in diverse parti. ! Risolvere ogni parte ricorsivamente. ! Combinare le soluzioni dei sottoproblemi in soluzioni globali.

5. DIVIDE AND CONQUER I

Algoritmi e Strutture Dati

Tempo e spazio di calcolo

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

Esempio : i numeri di Fibonacci

Un esempio di calcolo di complessità: insertion sort

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

Algoritmi e Strutture Dati. HeapSort

Laboratorio di Algoritmi e Strutture Dati II Semestre 2005/2006. Ordinamenti: mergesort e quicksort

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi di ordinamento: Array e ricorsione

Laboratorio di Programmazione M-Z

Problemi, istanze, soluzioni

4.1 Modelli di calcolo analisi asintotica e ricorrenze

Algoritmi e Strutture Dati

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

Grafi pesati Minimo albero ricoprente

Problema del cammino minimo

Corso di Tecniche di Programmazione

Programmazione dinamica

Programmazione dinamica

PROGRAMMAZIONE. Fusione Partizionamento Algoritmi avanzati di ordinamento. Prof.ssa Lanza - AA DIB 1/66

Algoritmi e strutture dati. Analisi di algoritmi Funzioni di costo, notazione asintotica

Algoritmi e Strutture Dati

Tempo e spazio di calcolo (continua)

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

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

ADT Coda con priorità

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Alberi binari di ricerca

3.4 Metodo di Branch and Bound

Heap e code di priorità

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

UNIVERSITA DEGLI STUDI DI PERUGIA

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Esercizi Capitolo 6 - Alberi binari di ricerca

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi di ordinamento. Sequential-sort, Bubble-sort, Quicksort

Транскрипт:

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 fase divide e combina la radice ha tanti figli quanti sottoproblemi generati ricorsivamente ogni sottoproblema ha come etichetta il costo della fase divide e combina del problema per la nuova dimensione per ogni livello si indica la somma dei costi si conteggia il numero di livelli necessari per terminare la ricorsione

Esempio di albero di ricorsione Per T(n)=2T(n/2)+n 2 si ha: n 2 n 2 T(n/2) T(n/2) (n/2) 2 (n/2) 2 T(n/4) T(n/4) T(n/4) T(n/4)

Esempio di albero di ricorsione n 2 n 2 lg n (n/2) 2 (n/2) 2 (n/4) 2 (n/4) 2 (n/4) 2 (n/4) 2 1/2 n 2 1/4 n 2... Totale = n 2 Σ i=0.. lg n 1/2 i < n 2 Σ i=0.. 1/2 i =2 n 2 Totale = Θ(n 2 )

Altezza di albero di ricorsione Per il calcolo dell altezza dell albero di ricorsione, ovvero del numero di passi necessario per terminare la ricorsione, si considera il cammino più lungo dalla radice ad una foglia n 1/2n (1/2) 2 n (1/2) 3 n... 1 Dato che: (1/2) i n = 1 2 i = n log 2 2 i = log 2 n i = lg n ovvero h= lg n

Concetti intuitivi sul caso medio QuickSort Si consideri un partizionamento abbastanza sbilanciato che divida il problema in due sotto sequenze di dimensione 1/10 e 9/10 T(n)=T(n/10)+T(9n/10)+n dall albero di ricorsione si ha che ogni livello costa n il numero di livelli è: n 9/10 n (9/10) 2 n (9/10) 3 n 1 ovvero (9/10) i n = 1 n = (10/9) i i = log 10/9 n = log n / (log 10/9) = log n / 0.0457.. = 21.85 log n

Albero di ricorsione n n log 10/9 n (n/10) (9n/10) (n/100)(9n/100)(9n/100)(81n/100) n n... Totale = Θ(n lg n)

Forte sbilanciamento costante Con un partizionamento di 1 a 9 il quicksort viene eseguito in un tempo asintoticamente eguale al caso migliore di partizionamento bilanciato Anche una suddivisione 1 a 99 mantiene la proprietà di esecuzione in tempo n lg n (sebbene con un fattore moltiplicativo 300 rispetto al caso bilanciato) Il motivo è che qualsiasi suddivisione in proporzioni costanti produce un albero di altezza lg n in cui ogni livello costa Θ(n) Tuttavia non possiamo aspettarci un partizionamento costante nei casi reali

Alternanza pessimo-ottimo Si suppone che in media si abbiano delle partizioni buone e cattive distribuite durante lo svolgimento dell algoritmo Si suppone per semplificare che le partizioni buone si alternino a quelle cattive Si suppone che la partizione buona sia la migliore possibile, cioè quella derivante da un bilanciamento perfetto E quella cattiva la peggiore possibile, cioè quella derivante da una partizione 1, n-1

Calcolo complessita caso medio Si ha pertanto un primo passo in cui si partiziona il problema in due sottosequenze 1 e n-1 di costo n poi un secondo passo in cui si risolve in tempo costante il problema sulla sottosequenza unitaria si partiziona ulteriormente la sequenza di lunghezza n-1 in due sottosequenze di (n-1)/2 e (n-1)/2 elementi ad un costo di n-1 Il risultato è di aver raddoppiato il numero di passi rispetto al caso di partizionamento ottimo, ma di essere sostanzialmente arrivati nella stessa situazione di buon partizionamento (n/2 contro (n- 1)/2) con un costo complessivo Θ(n)

Concetti intuitivi sul caso medio In sintesi il costo del QuickSort per un caso medio in cui si alternano partizioni buone a cattive è dello stesso ordine di grandezza del caso migliore, e cioè O(n lg n) anche se con costanti più grandi

Algoritmo Randomizzato Il caso medio si ottiene quando una qualsiasi permutazione dei dati in ingresso è equiprobabile tuttavia nei casi reali questo può non essere vero: ad esempio ci sono situazioni in cui i dati sono parzialmente ordinati in questi casi le prestazioni del quicksort peggiorano piuttosto che ipotizzare una distribuzione dei dati in ingresso è possibile imporre una distribuzione si chiama randomizzato un algoritmo il cui comportamento è determinato non solo dall ingresso ma anche da un generatore di numeri casuale

Randomized QuickSort One Pass Prima di avviare la procedura di sort si esegue una permutazione casuale degli elementi del vettore di ingresso Il calcolo della permutazione deve avere un costo O(n) altrimenti diventa una procedura computazionalmente dominante rispetto alle altre operazioni Nessuna sequenza in ingresso comporta il caso peggiore: ma è sempre possibile avere una cattiva permutazione prodotta dal generatore casuale...ma l'onere adesso si e' spostato sull'algoritmo di generazione (pseudo)casuale, non sui dati in ingresso...ovvero si può garantire che si generino pochissime permutazioni cattive in media

PseudoCodice per la permutazione casuale Randomize(A,p,r) 1 for i 1 to length[a] 2 do j Random(p,r) 3 A[i] A[j]

Randomized QuickSort Random pivot Ad ogli passo, prima di partizionare l array si scambia A[p] con un elemento scelto a caso in A[p..r] E' come se si scegliesse cioè l elemento pivot in modo casuale ad ogni partizionamento Questo assicura che il pivot sia in modo equiprobabile uno qualsiasi degli elementi in A[p..r] Ci si aspetta cosi che in media la suddivisione dell array sia ben bilanciata

PseudoCodice Randomized Partition(A,p,r) 1 i Random(p,r) 2 A[p] A[i] 3 return Partition(A,p,r) Randomized QuickSort(A,p,r) 1 if p < r 2 then q RandomizedPartition(A,p,r) 3 Randomized Quicksort(A,p,r) 4 Randomized Quicksort(A,q+1,r)

Variante 1 Se la sequenza e' gia' ordinata in senso crescente e' svantaggioso prendere il primo elemento, se ordinata in senso decrescente e' svantaggioso l'ultimo: L'elemento pivot e' scelto come l'elemento di valore intermedio fra il primo, l'ultimo e un terzo elemento con indice mediano In questo modo per sequenze quasi ordinate si prende come pivot con alta probabilita' proprio l'elemento che realizzera' un partizionamento bilanciato

Variante 2 Chiamate ricorsive per dividere sequenze piccole (una decina di elementi) sono costose: Il passo base non e' quando si hanno sequenze di 1 elemento ma quando la sequenza ha una dimensione piccola prefissata La sequenza rimanente viene ordinata con un altro algoritmo che abbia complessita' con costanti moltiplicative piccole e che abbia buone prestazioni per sequenze quasi ordinate (ex. insertion sort)