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

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

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

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

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

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

Esercitazione 2. Quicksort

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

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

Albero di Riscorsione

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

Gli algoritmi e la loro complessità

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

Gli heap. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Algoritmi di ordinamento

Si può fare di meglio?

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

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Algoritmi di ordinamento

Tecniche Algoritmiche: divide et impera

Divide et impera. Vittorio Maniezzo Università di Bologna

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

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione

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

LA RICORSIONE LA RICORSIONE LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO

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

LA RICORSIONE. Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa

Algoritmi di Ordinamento

Algoritmi e Strutture Dati

Pensiero Algoritmico. Lezione 3 23 Novembre Ripasso. Anatomia di un programma. Anatomia di un programma. Ozalp Babaoglu Università di Bologna

Algoritmi e Strutture Dati

Fondamenti di Informatica

Laboratorio di Programmazione M-Z

Algoritmi e Strutture Dati

ALGORITMI E STRUTTURE DATI

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Progetto Corda. Alberto Ferrari. Alberto Ferrari Ingegneria dell'informazione, UniPR. 18/12/2017 Progetto Corda

RICORSIONE. Informatica B - A.A. 2013/2014

Algoritmi e Strutture Dati

Informatica (A-K) 5. Algoritmi e pseudocodifica

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Definizioni. Soluzione ottima: migliore soluzione possibile Soluzione ottima localmente: soluzione ottima in un dominio contiguo. Il paradigma greedy

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

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

3 aprile o Esonero: mercoledi 17 aprile ore 11:30 14:00 consulta la pag. WEB alla voce esoneri. si raccomanda la puntualita!

Moltiplicazione veloce di interi

Algoritmi e Strutture Dati

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Ordinamento per inserzione e per fusione

INFORMATICA GENERALE

Algoritmi e Strutture Dati

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

Mergesort. Mergesort. Mergesort. Mergesort. L idea è la seguente: (par. 13.4) dividere l insieme in due parti uguali di n/2 componenti

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

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

Ricerca in una sequenza ordinata

QuickSort (1962, The Computer Journal)

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture Dati

Algoritmi di ordinamento: Array e ricorsione

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture Dati. Divide-et-impera

Operativamente, risolvere un problema con un approccio ricorsivo comporta

Algoritmi di ordinamento: Array e ricorsione

Tempo e spazio di calcolo (continua)

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

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

12 Function Handles e Ricorsione in MATLAB

Algoritmi di ordinamento

QuickSort (1962, The Computer Journal)

Tempo e spazio di calcolo (continua)

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

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

5. DIVIDE AND CONQUER I

Cominciamo con un esempio... Utilizzando un sottoprogramma 16/12/2017

Capitolo 19. Ricorsione

Ordinamenti ricorsivi

13 Ricorsione con MATLAB

Fondamenti di Informatica

La ricorsione. Induzione nel progetto e nella verifica di programmi ricorsivi. Le forme della ricorsione

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

Algoritmi e strutture di dati 2

Algoritmi e strutture dati

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

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO

Algoritmi e Strutture Dati

liceo B. Russell PROGRAMMAZIONE INDIRIZZO: SCIENTIFICO SCIENZE APPLICATE BIENNIO: SECONDA DISCIPLINA: INFORMATICA

Algoritmi e Strutture Dati

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

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

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

Pseudo codice. Paolo Bison. Fondamenti di Informatica 1 A.A. 2003/04 Università di Padova. Pseudo codice, Paolo Bison, A.A , p.

IEIM Esercitazione IX Puntatori, Enumerazione e Ricorsione. Alessandro A. Nacci -

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

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

Corso di Perfezionamento

ESERCIZI SULLA TECNICA BACKTRACKING e BRANCH & BOUND

Transcript:

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 Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 2 Politecnico di Torino Pagina 1 di 64

Definizione Una procedura si dice ricorsiva (o recursiva) quando: all interno della propria definizione, compare la chiamata alla procedura stessa oppure compare la chiamata ad almeno una procedura la quale, direttamente o indirettamente, chiama la procedura stessa. Un algoritmo si dice ricorsivo quando si basa su procedure ricorsive. A.A. 2001/2002 APA-ricorsione 3 Esempio: il fattoriale 0! 1 N 1 : N! N (N-1)! double fact( double N ) { double sub ; if(n == 0) return 1.0 ; else { sub = fact( N-1 ) ; return N * sub ; } } A.A. 2001/2002 APA-ricorsione 4 Politecnico di Torino Pagina 2 di 64

Esempio: il fattoriale 0! 1 N 1 : N! N (N-1)! double fact( double N ) { double sub ; if(n == 0) return 1.0 ; } sub = fact( N-1 ) ; return N * sub ; A.A. 2001/2002 APA-ricorsione 5 Motivazioni 1.3 Molti problemi si prestano, per loro natura, ad una descrizione ricorsiva: Si definisce un metodo per risolvere dei sottoproblemi analoghi a quello di partenza (ma più piccoli) Si definisce un metodo per combinare le soluzioni parziali nella soluzione del problema originario. A.A. 2001/2002 APA-ricorsione 6 Politecnico di Torino Pagina 3 di 64

Divide et Impera (I) a sottoproblemi, ciascuno b volte più piccolo del problema Soluzione = Risolvi(Problema) ; Risolvi(Problema): Sottoproblema 1,2,3,,a = Dividi(Problema) ; Per ciascun Sottoproblema i : Sottosoluzione i = Risolvi(Sottoproblema i ) ; Return Soluzione = Combina(Sottosoluzione 1,2,3,,a ) ; A.A. 2001/2002 APA-ricorsione 7 Divide et Impera (II) Soluzione = Risolvi(Problema) ; Risolvi(Problema): Sottoproblema 1,2,3,,a = Dividi(Problema) ; Per ciascun Sottoproblema i : Sottosoluzione i = Risolvi(Sottoproblema i ) ; Return Soluzione = Combina(Sottosoluzione 1,2,3,,a ) ; Chiamata ricorsiva A.A. 2001/2002 APA-ricorsione 8 Politecnico di Torino Pagina 4 di 64

Quando fermarsi? La ricorsione non deve essere infinita, in quanto ogni algoritmo deve terminare. Ad un certo punto, i sottoproblemi diventano così semplici da essere risolvibili: in modo banale (es.: insiemi di 1 solo elemento) oppure, con metodi alternativi alla ricorsione. A.A. 2001/2002 APA-ricorsione 9 Avvertenze Ricordare sempre la condizione di terminazione Fare in modo che i sottoproblemi siano tutti strettamente minori del problema iniziale A.A. 2001/2002 APA-ricorsione 10 Politecnico di Torino Pagina 5 di 64

Divide et Impera (completo di terminazione) Risolvi(Problema): Se il problema è banale: Soluzione = Risolvi_banale(Problema) Else: Sottoproblema 1,2,3,,a = Dividi(Problema) ; Per ciascun Sottoproblema i : Sottosoluzione i = Risolvi(Sottoproblema i ) ; Return Soluzione = Combina(Sottosoluzione 1,2,3,,a ) ; A.A. 2001/2002 APA-ricorsione 11 Complessità (I) Risolvi(Problema): T(n) Se il problema è banale (n c): Θ(1) Soluzione = Risolvi_banale(Problema) Else: D(n) Sottoproblema 1,2,3,,a = Dividi(Problema) ; Per ciascun Sottoproblema i : Sottosoluzione i = Risolvi(Sottoproblema i ) ; Return Soluzione = T(n/b) Combina(Sottosoluzione 1,2,3,,a ) ; C(n) A.A. 2001/2002 APA-ricorsione 12 Politecnico di Torino Pagina 6 di 64

Complessità (II) T(n) = Θ(1) D(n) + a T(n/b) + C(n) per n c per n > c Equazione alle ricorrenze di non facile soluzione. Se D(n)+C(n)=Θ(n), si trova T(n)=Θ(n log n). A.A. 2001/2002 APA-ricorsione 13 Sommario Definizione di ricorsione e strategie divide et impera Semplici algoritmi ricorsivi Merge Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 14 Politecnico di Torino Pagina 7 di 64

Esempio: numeri di Fibonacci Problema: Calcolare l N-esimo numero di Fibonacci Definizione: FIB N+1 = FIB N + FIB N-1 per n>0 FIB 1 = 1 FIB 0 = 0 A.A. 2001/2002 APA-ricorsione 15 Soluzione long fib(int N) { long f1, f2 ; if(n == 0) return 0 ; if(n == 1) return 1 ; } f1 = fib(n-1) ; f2 = fib(n-2) ; return f1+f2 ; A.A. 2001/2002 APA-ricorsione 16 Politecnico di Torino Pagina 8 di 64

Analisi FIB(5) FIB(3) FIB(4) FIB(1) FIB(2) FIB(3) FIB(2) FIB(0) FIB(1) FIB(1) FIB(2) FIB(1) FIB(0) FIB(1) FIB(0) A.A. 2001/2002 APA-ricorsione 17 Esempio: ricerca dicotomica Problema Determinare se un elemento x è presente all interno di un vettore ordinato v[n] Approccio Dividere il vettore a metà, e riapplicare il problema su una delle due metà (l altra si può escludere a priori, essendo il vettore ordinato) A.A. 2001/2002 APA-ricorsione 18 Politecnico di Torino Pagina 9 di 64

Esempio v 1 3 4 6 8 9 1112 x 4 1 3 4 6 8 9 1112 1 3 4 6 y 4 6 y x y<x A.A. 2001/2002 APA-ricorsione 19 Soluzione int trova(int v[], int a, int b, int x) { int c ; if(b-a == 0) if(v[a]==x) return a ; else return 1 ; } c = (a+b) / 2 ; if(v[c] >= x) return trova(v, a, c, x) ; else return trova(v, c+1, b, x) ; A.A. 2001/2002 APA-ricorsione 20 Politecnico di Torino Pagina 10 di 64

Esercizio proposto Si calcoli il coefficiente binomiale (n m), sfruttando le relazioni (derivate dal Triangolo di Tartaglia): n n 1 n 1 = + m m 1 m n n = = 1 n 0 0 n, 0 m n A.A. 2001/2002 APA-ricorsione 21 Esercizio proposto Si esegua il calcolo del determinante di una matrice quadrata. Si ricorda che: Det(M 1x1 ) = m 11 Det(M NxN ) = somma dei prodotti degli elementi di una riga (o colonna) per i determinanti delle sottomatrici (N-1)x(N-1) ottenute cancellando la riga e la colonna che contengono l elemento, preso con segno (-1) i+j. A.A. 2001/2002 APA-ricorsione 22 Politecnico di Torino Pagina 11 di 64

Ricorsione ed iterazione Ogni programma ricorsivo può anche essere implementato in modo iterativo. La soluzione migliore, come efficienza e chiarezza del codice, dipende dal problema. A.A. 2001/2002 APA-ricorsione 23 Esempio: il fattoriale (iterativo) 0! 1 N 1 : N! N (N-1)! double fact( double N ) { double tot = 1.0 ; int i; for(i=2; i<=n; ++i) tot = tot * i ; return tot ; } A.A. 2001/2002 APA-ricorsione 24 Politecnico di Torino Pagina 12 di 64

Fibonacci (iterativo) long fib(int N) { long f1p=1, f2p=0, f ; int i; if(n == 0) return 0 ; if(n == 1) return 1 ; } f = f1p + f2p ; /* N==2 */ for(i=3; i<= N; ++i) { f2p = f1p ; f1p = f ; f = f1p+f2p ; } return f ; A.A. 2001/2002 APA-ricorsione 25 Ricerca dicotomica (iterativo) int trova(int v[], int a, int b, int x) { int c ; while(b-a!= 0) { c = (a+b) / 2 ; if(v[c] >= x) b = c ; else a = c+1 ; } if(v[a]==x) return a ; else return 1 ; } A.A. 2001/2002 APA-ricorsione 26 Politecnico di Torino Pagina 13 di 64

Esercizi proposti 1. Si fornisca la versione iterativa del calcolo del coefficiente binomiale (n m). 2. Si analizzino le difficoltà nel realizzare la versione iterativa del calcolo del determinante. A.A. 2001/2002 APA-ricorsione 27 Politecnico di Torino Pagina 14 di 64

Algoritmi di ordinamento (II parte: algoritmi ricorsivi) 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 Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 29 Politecnico di Torino Pagina 15 di 64

Merge Sort L algoritmo noto come Merge Sort è l applicazione diretta del paradigma Divide et Impera al problema dell ordinamento. Risolvi 6 12 4 5 2 9 5 12 6 12 4 5 2 9 5 12 4 5 6 12 2 5 9 12 2 4 5 5 6 9 1212 Dividi Risolvi Combina A.A. 2001/2002 APA-ricorsione 30 Merge Sort: Dividi Il passo di divisione consiste semplicemente nel partizionare il vettore di partenza in due sotto-vettori, alla sinistra ed alla destra di un punto di divisione. Solitamente il punto di divisione viene scelto al centro del vettore. 1 8 6 12 4 5 2 9 5 12 6 12 4 5 2 9 5 12 1 4 5 8 Dividi A.A. 2001/2002 APA-ricorsione 31 p p q q+1 r r Politecnico di Torino Pagina 16 di 64

Merge Sort: terminazione La condizione di terminazione si ha quando il sotto-vettore ha un solo elemento (p=r) oppure nessun elemento (p>r). A.A. 2001/2002 APA-ricorsione 32 Merge Sort: Combina Il passo di ricombinazione è basato sulla fusione di due vettori ordinati: Dati due vettori ordinati, costruire un terzo vettore contenente gli stessi elementi, complessivamente ordinati Tale algoritmo è realizzabile in tempo Θ(n). 4 5 6 12 2 5 9 12 2 4 5 5 6 9 1212 Combina A.A. 2001/2002 APA-ricorsione 33 Politecnico di Torino Pagina 17 di 64

Pseudo-codice MERGE-SORT(A, p, r) 1 if p < r 2 then q (p+r)/2 3 MERGE-SORT(A, p, q) 4 MERGE-SORT(A, q+1, r) 5 MERGE(A, p, q, r) Terminazione Dividi Risolvi Combina A.A. 2001/2002 APA-ricorsione 34 Notazione Spesso in informatica si usano i seguenti due simboli: x = parte intera di x (per difetto) x = parte intera di x (per eccesso) Esempi: 3 = 3 = 3 3.1 =3; 3.1 = 4 A.A. 2001/2002 APA-ricorsione 35 Politecnico di Torino Pagina 18 di 64

Esercizio Si scriva lo pseudo-codice della procedura Merge, garantendo che il suo tempo di esecuzione sia Θ(n). A.A. 2001/2002 APA-ricorsione 36 Soluzione: procedura Merge MERGE(A, p, q, r) 1 i p ; j q+1 ; k 1 2 while( i q and j r ) 3 if( A[i] < A[j]) B[k] A[i] ; i i+1 4 else B[k] A[j] ; j j+1 5 k k+1 6 while( i q ) B[k] A[i] ; i i+1; k k+1 7 while( j r ) B[k] A[j] ; j j+1; k k+1 8 A[p..q] B[1..k-1] A.A. 2001/2002 APA-ricorsione 37 Politecnico di Torino Pagina 19 di 64

Soluzione: procedura Merge MERGE(A, p, q, r) 1 i p ; j q+1 ; k 1 2 while( i q and j r ) 3 if( A[i] < A[j]) B[k] A[i] ; i i+1 4 else B[k] A[j] ; j j+1 5 k k+1 6 while( i q ) B[k] A[i] ; i i+1; k k+1 7 while( j r ) B[k] A[j] ; j j+1; k k+1 8 A[p..q] B[1..k-1] Prende ogni volta il più piccolo tra i primi due elementi non ancora considerati Esaurisce la coda del sottovettore restante A.A. 2001/2002 APA-ricorsione 38 Esercizio proposto Dimostrare che la procedura Merge così proposta ha una complessità Θ(n). A.A. 2001/2002 APA-ricorsione 39 Politecnico di Torino Pagina 20 di 64

Complessità (I) L analisi della procedura Merge Sort porta alle seguenti formule: Terminazione: semplice test, Θ(1) Dividi (2):calcolalametà di unarray, D(n)=Θ(1) Risolvi (3-4): risolve 2 sottoproblemi di dimensione n/2 ciascuno, 2T(n/2) Combina (5): basata su Merge, C(n) = Θ(n). A.A. 2001/2002 APA-ricorsione 40 Complessità (I) L analisi della procedura Merge Sort porta alle seguenti formule: In realtà un sottoproblema ha dimensione n/2, l altro n/2. Terminazione: Fortunatamente semplice test, questo Θ(1) dettaglio Dividi (2):calcolalametà non modifica unarray, il risultato D(n)=Θ(1) dell analisi di complessità. Risolvi (3-4): risolve 2 sottoproblemi di dimensione n/2 ciascuno, 2T(n/2) Combina (5): basata su Merge, C(n) = Θ(n). A.A. 2001/2002 APA-ricorsione 41 Politecnico di Torino Pagina 21 di 64

Complessità (II) T(n) = Θ(1) per n 1 2T(n/2) + Θ(n) per n > 1 Si può dimostrare che la soluzione è: T(n) = Θ(n log n) A.A. 2001/2002 APA-ricorsione 42 Giustificazione (n=16) log 2 n 16 8 8 4 4 4 4 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 x 16 = n 2 x 8 = n 4 x 4 = n 8 x 2 = n 16 x 1 = n Livelli di ricorsione: log 2 n Operazioni per livello: n Operazioni totali: n log 2 n A.A. 2001/2002 APA-ricorsione 43 Politecnico di Torino Pagina 22 di 64

Avvertenza Non èdetto chele procedurericorsive abbiamo tutte complessità Θ(n log n). Ad esempio, un merge sort con una partizione asimmetrica (q=p+1), degenera in un insertion sort, con n chiamate ricorsive in ciascuna delle quali viene aggiunto un elemento al set già ordinato, ottenendo Θ(n 2 ). A.A. 2001/2002 APA-ricorsione 44 Esercizio proposto Si implementi in linguaggio C l algoritmo Merge Sort. Si verifichi sperimentalmente il suo comportamento Θ(n log n). n 2 nlogn A.A. 2001/2002 APA-ricorsione 45 Politecnico di Torino Pagina 23 di 64

Sommario Definizione di ricorsione e strategie divide et impera Semplici algoritmi ricorsivi Merge Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 46 Descrizione Quicksort è un algoritmo Divide et Impera in cui il partizionamento viene fatto in base al valore (e non alla posizione) degli elementi del vettore. Ad ogni passo, viene scelto un valore pivot (perno), e gli elementi vengono assegnati alla prima o alla seconda partizione a seconda che siano minori o maggiori del pivot. A.A. 2001/2002 APA-ricorsione 47 Politecnico di Torino Pagina 24 di 64

Formulazione Dividi: partiziona A[p..r], riordinando gli elementi, in due sottovettori A[p..q] e A[q+1..r], in modo tale che gli elementi di A[p..q] siano tutti degli elementi di A[q+1..r]. Il valore di q è variabile. Risolvi: ordina ricorsivamente A[p..q] e A[q+1..r]. Combina: poiché A[p..q] e A[q+1..r] sono ordinati, e i primi sono ai secondi, non occorre fare nulla: A[p..r] è ordinato. A.A. 2001/2002 APA-ricorsione 48 Quicksort QUICKSORT(A, p, r) 1 if p < r 2 then q PARTITION(A, p, r) 3 QUICKSORT(A, p, q) 4 QUICKSORT(A, q+1, r) A.A. 2001/2002 APA-ricorsione 49 Politecnico di Torino Pagina 25 di 64

Partition PARTITION(A, p, r) 1 x A[p] > elemento Pivot 2 i p 1 3 j r + 1 4 while true 5 do repeat j j-1 6 until A[j] x 7 repeat i i+1 8 until A[i] x 9 if i < j 10 then scambia A[i] A[j] 11 else return j A.A. 2001/2002 APA-ricorsione 50 A A A A i Esempio p 6 12 4 5 2 9 5 12 6 12 4 5 2 9 5 12 i 6 5 4 5 2 9 1212 i j j r j do repeat j j-1 until A[j] x repeat i i+1 until A[i] x if i < j then scambia A[i] A[j] else return j do repeat j j-1 until A[j] x repeat i i+1 until A[i] x 6 x 6 5 4 5 2 9 1212 p q q+1 r q j i 6 5 4 5 2 9 1212 A.A. 2001/2002 APA-ricorsione 51 Politecnico di Torino Pagina 26 di 64

Analisi di Partition La procedura fa convergere verso il centro gli indici i e j. Ogni volta che i trova un elemento maggiore del pivot e j trova un elemento minore del pivot, gli elementi vengono scambiati per permettere agli indici di continuare. Quando i incontra j, la partizione è completa. Il numero complessivo di operazioni è Θ(r-p+1), nonostante i loop annidati. A.A. 2001/2002 APA-ricorsione 52 Esercizio 1 Mostrare il funzionamento di Partition sulla seguente sequenza di numeri: A = { 8, 13, 11, 19, 12, 9, 5, 7, 4, 2, 6, 1 } A.A. 2001/2002 APA-ricorsione 53 Politecnico di Torino Pagina 27 di 64

Soluzione 1 A = { 8, 13, 11, 19, 12, 9, 5, 7, 4, 2, 6, 1 } x = 8 A = { 8, 13, 11, 19, 12, 9, 5, 7, 4, 2, 6, 1 } A = { 8, 1, 11, 19, 12, 9, 5, 7, 4, 2, 6, 13 } A = { 8, 1, 6, 19, 12, 9, 5, 7, 4, 2, 11, 13 } A = { 8, 1, 6, 2, 12, 9, 5, 7, 4, 19, 11, 13 } A = { 8, 1, 6, 2, 4, 9, 5, 7, 12, 19, 11, 13 } A = { 8, 1, 6, 2, 4, 7, 5, 9, 12, 19, 11, 13 } Partizione: A = { 8, 1, 6, 2, 4, 7, 5, 9, 12, 19, 11, 13 } A.A. 2001/2002 APA-ricorsione 54 Esercizio 2 Mostrare il funzionamento di Partition sulla seguente sequenza di numeri: A = { 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 1 } A.A. 2001/2002 APA-ricorsione 55 Politecnico di Torino Pagina 28 di 64

Soluzione 2 A = { 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 1 } x = 13 A = { 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 1 } A = { 13, 1, 9, 5, 12, 8, 7, 4, 11, 2, 6, 19 } La partizione è: A = { 13, 1, 9, 5, 12, 8, 7, 4, 11, 2, 6, 19 } In questo caso la partizione è fortemente sbilanciata. A.A. 2001/2002 APA-ricorsione 56 Esercizio proposto Implementare in C la procedura Partition, verificando il corretto funzionamento. Quale valore viene restituito come punto di partizione q su vettori casuali? su vettori ordinati? su vettori ordinati inversamente? A.A. 2001/2002 APA-ricorsione 57 Politecnico di Torino Pagina 29 di 64

Esercizio Sempre in riferimento al vettore A = { 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 1 } quale potrebbe essere una scelta migliore ( a mano ) per il pivot x? A.A. 2001/2002 APA-ricorsione 58 Prestazioni L efficienza di Quicksort dipende totalmente dalla qualità del partizionamento ottenuto. Se il partizionamento è ottimo (q~(p+r)/2), l algoritmo è O(n log n) Se il partizionamento è pessimo (q~p o q~r), l algoritmo degenera in un O(n 2 ) La qualità del partizionamento dipende da una buona scelta del pivot. A.A. 2001/2002 APA-ricorsione 59 Politecnico di Torino Pagina 30 di 64

Caso migliore A.A. 2001/2002 APA-ricorsione 60 Caso peggiore A.A. 2001/2002 APA-ricorsione 61 Politecnico di Torino Pagina 31 di 64

Scelta del pivot Il caso peggiore si verifica quando le partizioni hanno 1 ed n-1 elementi, rispettivamente, ossia quando il pivot è il minimo o il massimo. Un vettore già ordinato ricade quindi nel caso peggiore! Anche un vettore ordinato inversamente è nel caso peggiore. Il caso migliore si ha quando il vettore è il più disordinato possibile. A.A. 2001/2002 APA-ricorsione 62 Quicksort randomizzato PARTITION-RANDOM(A, p, r) > genera un numero casuale tra p e r 1 i RANDOM(p, r) > evita il caso peggiore! 2 scambia A[i] A[1] > applica il partizionamento 3 return PARTITION (A, p, r) A.A. 2001/2002 APA-ricorsione 63 Politecnico di Torino Pagina 32 di 64

Scelte del pivot Scegliere un elemento a caso (PARTITION- RANDOM) Scegliere l elemento nel mezzo: x A[(p+r)/2] Scegliere il valore medio tra min e max Scegliere la mediana tra 3 elementi presi a caso nel vettore A.A. 2001/2002 APA-ricorsione 64 Complessità Da quanto visto emerge che Quicksort ha un comportamento: O(n 2 ) in generale, O(n log n) in media Θ(n 2 ) nel caso peggiore (che si deve cercare di evitare) Θ(n log n) nel caso medio e nel caso migliore A.A. 2001/2002 APA-ricorsione 65 Politecnico di Torino Pagina 33 di 64

Esempi n(n+1)/2 Vettore ordinato, pivot primo elemento, n=2 k Vettore casuale, pivot primo elemento, n=2 k Vettore casuale, pivot casuale, n=4/3 2 k + Vettore ordinato, pivot casuale, n=4/3 2 k 2n ln n A.A. 2001/2002 APA-ricorsione 66 Esercizio proposto Si implementi l algoritmo Quicksort in C, e si sperimentino diverse scelte dell elemento pivot. A.A. 2001/2002 APA-ricorsione 67 Politecnico di Torino Pagina 34 di 64

Sommario Definizione di ricorsione e strategie divide et impera Semplici algoritmi ricorsivi Merge Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 68 Sommario Definizione di ricorsione e strategie divide Il Tour del Cavaliere et impera Espansione dei valori X Il problema Semplici delle algoritmi N regine ricorsivi Gioco Merge del Domino Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 69 Politecnico di Torino Pagina 35 di 64

Il tour del cavaliere Si desidera trovare una sequenza di mosse del cavallo tale per cui questo tocca una ed una sola volta ciascuna casella di una scacchiera N N. Si ricorda che un cavallo in posizione (i,j) può muovere in 8 possibili caselle: A.A. 2001/2002 APA-ricorsione 70 Analisi Si supponga che N=4. 1 A.A. 2001/2002 APA-ricorsione 71 Politecnico di Torino Pagina 36 di 64

Mossa 1 1 Livello della prossima mossa da fare Coordinate dell ultima mossa A.A. 2001/2002 APA-ricorsione 72 Mossa 2 1 2 A.A. 2001/2002 APA-ricorsione 73 Politecnico di Torino Pagina 37 di 64

Mossa 3 1 2 3 A.A. 2001/2002 APA-ricorsione 74 Mossa 4 1 2 4 3 A.A. 2001/2002 APA-ricorsione 75 Politecnico di Torino Pagina 38 di 64

Mossa 5 1 5 2 4 3 A.A. 2001/2002 APA-ricorsione 76 Mossa 6 1 5 2 4 6 3 A.A. 2001/2002 APA-ricorsione 77 Politecnico di Torino Pagina 39 di 64

Mossa 7 1 5 2 4 7 6 3 8,1,3 A.A. 2001/2002 APA-ricorsione 78 Mossa 8 1 8 5 2 4 7 6 3 8,1,3 9,0,1 A.A. 2001/2002 APA-ricorsione 79 Politecnico di Torino Pagina 40 di 64

Mossa 9 1 8 4 7 5 2 9 6 3 8,1,3 9,0,1 10,2,2 A.A. 2001/2002 APA-ricorsione 80 Mossa 10 1 8 4 7 5 2 9 6 3 9,0,1 8,1,3 10,2,2 A.A. 2001/2002 APA-ricorsione 81 Politecnico di Torino Pagina 41 di 64

Mossa 11 1 8 10 4 7 5 2 9 6 3 9,0,1 8,1,3 10,2,2 11,0,3 A.A. 2001/2002 APA-ricorsione 82 Mossa 12 1 8 10 11 4 7 5 2 9 6 3 9,0,1 8,1,3 10,2,2 12,1,1 11,0,3 A.A. 2001/2002 APA-ricorsione 83 Politecnico di Torino Pagina 42 di 64

Mossa 13 1 8 10 11 4 7 5 2 9 12 6 3 10,2,2 9,0,1 8,1,3 11,0,3 12,1,1 13,3,0 A.A. 2001/2002 APA-ricorsione 84 Mossa 14 1 8 10 11 4 7 5 2 9 12 6 3 8,1,3 9,0,1 10,2,2 11,0,3 12,1,1 13,3,0 13,2,3 A.A. 2001/2002 APA-ricorsione 85 Politecnico di Torino Pagina 43 di 64

Mossa 15 1 8 10 11 4 7 5 2 9 12 13 6 3 8,1,3 9,0,1 10,2,2 11,0,3 12,1,1 13,3,0 13,2,3 14,3,1 A.A. 2001/2002 APA-ricorsione 86 Mossa 16 1 8 10 14 11 4 7 5 2 9 12 13 6 3 8,1,3 9,0,1 10,2,2 11,0,3 12,1,1 13,3,0 13,2,3 14,3,1 15,1,0 A.A. 2001/2002 APA-ricorsione 87 Politecnico di Torino Pagina 44 di 64

Mossa 17 1 8 15 10 14 11 4 7 5 2 9 12 13 6 3 13,3,0 16,0,2 15,1,0 12,1,1 14,3,1 13,2,3 11,0,3 10,2,2 9,0,1 8,1,3 A.A. 2001/2002 APA-ricorsione 88 Mossa 18 1 8 10 14 11 4 7 5 2 9 12 13 6 3 8,1,3 9,0,1 10,2,2 11,0,3 12,1,1 13,3,0 13,2,3 14,3,1 15,1,0 16,0,2 A.A. 2001/2002 APA-ricorsione 89 Politecnico di Torino Pagina 45 di 64

Mossa 19 1 8 10 11 4 7 5 2 9 12 13 6 3 13,3,0 16,0,2 15,1,0 12,1,1 14,3,1 13,2,3 11,0,3 10,2,2 9,0,1 8,1,3 A.A. 2001/2002 APA-ricorsione 90 Mossa 20 1 8 13 10 11 4 7 5 2 9 12 6 3 13,3,0 16,0,2 12,1,1 13,2,3 11,0,3 10,2,2 14,3,1 14,3,1 15,1,0 9,0,1 8,1,3 A.A. 2001/2002 APA-ricorsione 91 Politecnico di Torino Pagina 46 di 64

Mossa 21 1 8 13 10 14 11 4 7 5 2 9 12 6 3 13,3,0 16,0,2 12,1,1 13,2,3 11,0,3 14,3,1 14,3,1 15,1,0 10,2,2 15,1,0 9,0,1 8,1,3 A.A. 2001/2002 APA-ricorsione 92 Mossa 22 1 8 13 10 14 11 4 7 5 2 9 12 15 6 3 13,3,0 12,1,1 13,2,3 11,0,3 14,3,1 14,3,1 15,1,0 15,1,0 10,2,2 9,0,1 8,1,3 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 93 Politecnico di Torino Pagina 47 di 64

Mossa 23 1 8 13 10 14 11 4 7 5 2 9 12 6 3 8,1,3 9,0,1 10,2,2 11,0,3 12,1,1 13,3,0 13,2,3 14,3,1 14,3,1 15,1,0 15,1,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 94 Mossa 24 1 8 13 10 11 4 7 5 2 9 12 6 3 13,3,0 12,1,1 13,2,3 11,0,3 14,3,1 14,3,1 15,1,0 15,1,0 16,0,2 16,3,1 10,2,2 9,0,1 8,1,3 A.A. 2001/2002 APA-ricorsione 95 Politecnico di Torino Pagina 48 di 64

Mossa 25 1 8 10 11 4 7 5 2 9 12 6 3 13,3,0 12,1,1 13,2,3 11,0,3 10,2,2 14,3,1 14,3,1 15,1,0 15,1,0 9,0,1 8,1,3 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 96 Mossa 26 1 8 10 11 4 7 5 2 9 6 3 13,3,0 12,1,1 11,0,3 13,2,3 10,2,2 14,3,1 14,3,1 15,1,0 15,1,0 16,0,2 16,3,1 9,0,1 8,1,3 A.A. 2001/2002 APA-ricorsione 97 Politecnico di Torino Pagina 49 di 64

Mossa 27 1 8 10 4 7 5 2 9 6 3 13,3,0 12,1,1 11,0,3 13,2,3 10,2,2 14,3,1 14,3,1 15,1,0 15,1,0 9,0,1 8,1,3 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 98 Mossa 28 1 8 10 4 7 5 2 9 6 3 13,3,0 12,1,1 10,2,2 9,0,1 11,0,3 11,1,0 13,2,3 14,3,1 14,3,1 15,1,0 15,1,0 8,1,3 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 99 Politecnico di Torino Pagina 50 di 64

Mossa 29 1 8 10 4 7 5 2 9 11 6 3 13,3,0 12,1,1 11,0,3 13,2,3 10,2,2 14,3,1 14,3,1 15,1,0 15,1,0 9,0,1 11,1,0 12,3,1 8,1,3 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 100 Mossa 30 1 8 10 4 7 5 2 9 12 11 6 3 13,3,0 12,1,1 11,0,3 10,2,2 13,2,3 13,2,3 14,3,1 14,3,1 15,1,0 15,1,0 9,0,1 11,1,0 12,3,1 8,1,3 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 101 Politecnico di Torino Pagina 51 di 64

Mossa 31 1 8 13 10 4 7 5 2 9 12 11 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 13,3,0 13,2,3 13,2,3 14,3,1 14,3,1 14,0,2 15,1,0 15,1,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 102 Mossa 32 1 8 10 13 4 7 5 2 9 12 11 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 13,3,0 13,2,3 13,2,3 14,3,1 14,3,114,0,2 14,1,1 15,1,0 15,1,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 103 Politecnico di Torino Pagina 52 di 64

Mossa 33 1 8 14 10 13 4 7 5 2 9 12 11 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 13,3,0 13,2,3 13,2,3 14,3,1 14,3,114,0,2 14,1,1 15,1,0 15,1,0 15,0,3 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 104 Mossa 34 1 8 10 13 4 7 5 2 9 12 14 11 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 13,3,0 13,2,3 13,2,3 14,3,1 14,3,114,0,2 14,1,1 15,1,0 15,1,0 15,0,3 15,3,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 105 Politecnico di Torino Pagina 53 di 64

Mossa 35 1 8 10 13 4 7 5 2 9 12 11 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 13,3,0 13,2,3 13,2,3 14,3,1 14,3,114,0,2 14,1,1 15,1,0 15,1,0 15,0,315,3,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 106 Mossa 36 1 8 10 4 7 5 2 9 12 11 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 13,3,0 13,2,3 13,2,3 14,3,1 14,3,114,0,2 14,1,1 15,1,0 15,1,0 15,0,315,3,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 107 Politecnico di Torino Pagina 54 di 64

Mossa 37 1 8 10 4 7 5 2 9 11 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 13,3,0 13,2,3 13,2,3 14,3,1 14,3,114,0,2 14,1,1 15,1,0 15,1,0 15,0,315,3,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 108 Mossa 38 1 8 11 10 4 7 5 2 9 6 3 8,1,3 9,0,1 10,2,2 11,0,3 11,1,0 12,1,1 12,3,1 12,0,2 13,3,0 13,2,3 13,2,3 14,3,1 14,3,114,0,2 14,1,1 15,1,0 15,1,0 15,0,315,3,0 16,0,2 16,3,1 A.A. 2001/2002 APA-ricorsione 109 Politecnico di Torino Pagina 55 di 64

Esercizio Si scriva lo pseudo-codice per i problema del Tour del Cavaliere, descrivendo i passi sopra esposti nell esempio. A.A. 2001/2002 APA-ricorsione 110 Complessità Il numero di mosse possibili ad ogni passo è al più 8. Il numero di passi è N 2. Quindi l albero ha un numero di nodi 8 N^2. Nel caso peggiore la soluzione corrisponde alla foglia più a destra l albero è completo. In tal caso il numero di chiamate recursive prima di trovare la soluzione è Θ(8 N^2 ). A.A. 2001/2002 APA-ricorsione 111 Politecnico di Torino Pagina 56 di 64

Inizializzazioni #define DIM 6 int a[8],b[8],scacc[dim][dim]; void main(void) { int i, j, result; a[0]=2; b[0]=1; a[1]=1; b[1]=2; a[2]=-1; b[2]=2; a[3]=-2; b[3]=1; a[4]=-2; b[4]=-1; a[5]=-1; b[5]=-2; a[6]=1; b[6]=-2; a[7]=2; b[7]=-1; for( i=0; i<dim; i++) for( j=0; j<dim; j++) scacc[i][j] = 0; A.A. 2001/2002 APA-ricorsione 112 Programma principale } scacc[0][0] = 1; result = muovi( 2, 0, 0); if( result == 1) { for( i=0; i<dim; i++) { for( j=0; j<dim; j++) printf( "%2d ",scacc[i][j]); printf( "\n"); } } else { printf( "Soluzione non trovata\n"); } A.A. 2001/2002 APA-ricorsione 113 Politecnico di Torino Pagina 57 di 64

Muovi (1) int muovi( int mossa, int posx, int posy) { int i,ret,newposx,newposy; if( mossa == (DIM*DIM+1)) return(1); for( i=0; i<8; i++) { newposx = posx + a[i]; newposy = posy + b[i]; A.A. 2001/2002 APA-ricorsione 114 Muovi (2) if( (newposx<dim) && (newposx>=0) && (newposy<dim) && (newposy>=0)) { if( scacc[newposx][newposy] == 0) { scacc[newposx][newposy]=mossa; ret=muovi(mossa+1,newposx,newposy); if( ret == 0) scacc[newposx][newposy]=0; else return(1); } } } return(0); } A.A. 2001/2002 APA-ricorsione 115 Politecnico di Torino Pagina 58 di 64

Sommario Definizione di ricorsione e strategie divide Il Tour del Cavaliere et impera Espansione dei valori X Il problema Semplici delle algoritmi N regine ricorsivi Gioco Merge del Domino Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 116 Valore X Quando si lavora con le funzioni Booleane, si usa spesso il simbolo X, che indica che una certa variabile può assumere indifferentemente il valore 0 o 1. Ad esempio, se si considera la funzione OR, questa ritorna il valore 1 in corrispondenza dei valori di ingresso 01, 10 e 11, che si indicano più compattamente come X1, 1X. A.A. 2001/2002 APA-ricorsione 117 Politecnico di Torino Pagina 59 di 64

Split Si desidera realizzare un programma che riceve una stringa di valori binari eventualmente comprendenti delle X, e generi tutte le combinazioni corrispondenti all espressione data. Esempio: se riceve la stringa 01X0X, il programma genera le combinazioni 01000 01001 01100 01101 A.A. 2001/2002 APA-ricorsione 118 Soluzione È basata su un algoritmo recursivo che esplora l intero albero delle possibili combinazioni compatibili con la stringa data, tramite trasformazione di ciascuna delle X prima in 0 e poi in 1. Il numero delle foglie (ognuna corrispondente ad una combinazione) è pari a 2 N, dove N è il numero delle X. L albero ha un altezza pari N+1. A.A. 2001/2002 APA-ricorsione 119 Politecnico di Torino Pagina 60 di 64

Albero delle combinazioni 01X0X 0100X 0110X 01000 01001 01100 01101 A.A. 2001/2002 APA-ricorsione 120 C #include <stdio.h> #define MAX 100 char int ibuff[max], obuff[max]; index, len; void split(int); void main(void) { } gets( ibuff); len = strlen( ibuff); split(0); A.A. 2001/2002 APA-ricorsione 121 Politecnico di Torino Pagina 61 di 64

C (2) void split(int index) { if( index == len) { obuff[index]='\0'; printf( "%s\n", obuff); return; } switch( ibuff[index]) { case '0': case '1': obuff[index] = ibuff[index]; split(index+1); return; case X': obuff[index] = '0'; } split(index+1); obuff[index] = '1'; split(index+1); return; A.A. 2001/2002 APA-ricorsione 122 } Sommario Definizione di ricorsione e strategie divide Il Tour del Cavaliere et impera Espansione dei valori X Il problema Semplici delle algoritmi N regine ricorsivi Gioco Merge del Domino Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 123 Politecnico di Torino Pagina 62 di 64

Le N regine Sia data una scacchiera NxN, e siano date N regine del gioco degli scacchi. Trovare una disposizione delle N regine in modo tale che nessuna possa essere mangiata dalle altre.?? A.A. 2001/2002 APA-ricorsione 124 Sommario Definizione di ricorsione e strategie divide Il Tour del Cavaliere et impera Espansione dei valori X Il problema Semplici delle algoritmi N regine ricorsivi Gioco Merge del Domino Sort Quicksort Esempi più complessi di algoritmi ricorsivi A.A. 2001/2002 APA-ricorsione 125 Politecnico di Torino Pagina 63 di 64

Gioco del domino Siano date N pedine del Domino, ciascuna delle quali è dotata di due facce, etichettate da un numero tra 1 e 6. Si trovi la sequenza più lunga possibile di pedine, rispettando l identità dei valori delle facce adiacenti delle pedine consecutive. A.A. 2001/2002 APA-ricorsione 126 Politecnico di Torino Pagina 64 di 64