DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel...

46
DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero intero non negativo 0 se 0 se )! 1 ( 1 ! n n n n n

Transcript of DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel...

Page 1: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Il calcolo del fattoriale

• La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

dove n è un numero intero non negativo

0 se

0 se

)!1(

1!

n

n

nnn

Page 2: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Il calcolo del fattoriale

• Vediamo di capire cosa significa… 5! = 5(5-1)! = 5·4! = 5·4·3·2·1 = 120 4! = 4(4-1)! = 4·3! = 4·3·2·1 = 24 3! = 3(3-1)! = 3·2! = 3·2·1 = 6 2! = 2(2-1)! = 2·1! = 2·1 = 2 1! = 1(1-1)! = 1·0! = 1·1 = 1 0! = 1

• Quindi, per ogni n intero positivo, il fattoriale di n è il prodotto dei primi n numeri interi positivi

Page 3: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Il calcolo del fattoriale

• Scriviamo una funzione per calcolare il fattoriale

function res=Fattoriale(n);if(n<0)

res=-1;return;

end;

res=1;for ct=1:n

res=res*ct;end;

return;

Page 4: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Il calcolo del fattoriale

• Realizzando direttamente la definizione, sarebbe stato più naturale scrivere:

function res=Fattoriale(n);

if(n<0)res=-1;return;

end;

if (n==0)res=1;

elseres=n*Fattoriale(n-1);

end; return;

Page 5: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

La ricorsione

• Invocare un metodo mentre si esegue lo stesso metodo è un paradigma di programmazione che si chiama

ricorsione e un metodo che ne faccia uso si chiama

metodo ricorsivo• La ricorsione è uno strumento molto potente per

realizzare alcuni algoritmi, ma è anche fonte di molti errori di difficile diagnosi

Page 6: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

La ricorsione: come funziona?

• Quando una funzione viene invocata:

– si sospende l’esecuzione del metodo invocante (le variabili locali rimangono congelate)

– si esegue il metodo invocato fino alla sua terminazione (con nuove variabili locali)

– si riprende l’esecuzione del metodo invocante dal punto in cui era stata sospesa (recuperando le variabili locali)

• La stessa sequenza di azioni viene compiuta quando un metodo invoca sé stesso.

Page 7: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

La ricorsione

• Vediamo la sequenza usata per calcolare 3! si invoca Fattoriale(3)

Fattoriale(3) invoca Fattoriale (2)Fattoriale(2) invoca Fattoriale (1)

Fattoriale(1) invoca Fattoriale (0)Fattoriale(0) restituisce 1

Fattoriale(1) restituisce 1 Fattoriale(2) restituisce 2

Fattoriale(3) restituisce 6

• Si crea quindi una lista LIFO (uno stack) di metodi “in attesa”, ciascuno con le sue variabili locali, che si allunga e che poi si accorcia fino ad estinguersi

Page 8: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

La ricorsione

• In ogni caso, anche se il meccanismo di funzionamento della ricorsione può sembrare complesso, la chiave per un suo utilizzo proficuo è– dimenticarsi come funziona la ricorsione, ma

sapere come vanno scritti i metodi ricorsivi perché il tutto funzioni!

• Esistono infatti due regole ben definite che vanno utilizzate per scrivere metodi ricorsivi che funzionino

Page 9: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Caso base

• Prima regola– il metodo ricorsivo deve fornire la soluzione del

problema in almeno un caso particolare, senza ricorrere ad una chiamata ricorsiva

– tale caso si chiama caso base della ricorsione

– Nell’esempio del fattoriale, il caso base era

– a volte ci sono più casi base, non è necessario che il caso base sia unico

if (n == 0)res = 1;

Page 10: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Passo ricorsivo

• Seconda regola– il metodo ricorsivo deve effettuare la chiamata ricorsiva

dopo aver semplificato il problema– nel nostro esempio, per il calcolo del fattoriale di n si

invoca la funzione ricorsivamente per conoscere il fattoriale di n-1, cioè per risolvere un problema più semplice

– il concetto di “problema più semplice” varia di volta in volta: in generale, bisogna avvicinarsi ad un caso base

elseres = n*Fattoriale(n-1);

Page 11: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione e algoritmi

• Le regole appena viste sono fondamentali per poter dimostrare che la soluzione ricorsiva di un problema sia un algoritmo– in particolare, che arrivi a conclusione in un numero

finito di passi

• Le chiamate ricorsive potrebbero succedersi una dopo l’altra, all’infinito

Page 12: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione e algoritmi

Se– ad ogni invocazione il problema diventa sempre più

semplice e si avvicina al caso base– la soluzione del caso base non richiede ricorsione

allora certamente la soluzione viene calcolata in un numero finito di passi, per quanto complesso possa essere il problema

Page 13: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione infinita

• Abbiamo visto che non tutti i metodi ricorsivi realizzano algoritmi– se manca il caso base, il metodo ricorsivo continua ad

invocare se stesso all’infinito– se il problema non viene semplificato ad ogni

invocazione ricorsiva, il metodo ricorsivo continua ad invocare se stesso all’infinito

• Dato che la lista dei metodi “in attesa” si allunga indefinitamente, l’ambiente runtime esaurisce la memoria disponibile per tenere traccia di questa lista, e il programma termina con un errore

Page 14: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione Infinita

• Il seguente programma presenta ricorsione infinita:

• Il programma terminerà con la segnalazione dell’errore StackOverflowError– il runtime stack è la struttura dati che gestisce le invocazioni in attesa– overflow significa trabocco

function res=InifinteRecursion(n)

disp ([‘Chiamata ’ ,n ,’\n’];

res= InifinteRecursion(n+1);

return;

Page 15: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione in coda

• Esistono diversi tipi di ricorsione• Il modo visto fino ad ora si chiama ricorsione in coda

(tail recursion)– il metodo ricorsivo esegue una sola invocazione

ricorsiva e tale invocazione è l’ultima azione del metodo

function res = RicorroInCoda(. . .). . .

res=RicorroInCoda(. . .);

return;

Page 16: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Iterazione e ricorsione

• La ricorsione in coda può sempre essere agevolmente eliminata, trasformando il metodo ricorsivo in un metodo che usa un ciclo

function res=Fattoriale(n)

res=1;for i=1:n

res=res*i;endreturn;

function res=Fattoriale(n)if (n == 0) res = 1;else res=n*Fattoriale(n-1);

return;

Page 17: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione: motivazioni

• Allora, a cosa serve la ricorsione in coda?– Non è necessaria, però in alcuni casi rende il codice più leggibile

– È utile quando la soluzione del problema è esplicitamente ricorsiva (es. fattoriale)

– In ogni caso, la ricorsione in coda è meno efficiente del ciclo equivalente, perché il sistema deve gestire le invocazioni sospese

Page 18: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione multipla

• Si parla di ricorsione multipla quando un metodo invoca se stesso più volte durante una sua esecuzione– la ricorsione multipla è ancora più difficile da eliminare,

ma è sempre possibile

• Esempio: il calcolo dei numeri di Fibonacci

2 se

20 se

)1Fib()2Fib()Fib(

n

n

nn

nn

Page 19: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

• Il metodo Fib realizza una ricorsione multipla

Numeri di Fibonacci

function res = Fib(n)

if(n<0)res=-1; return;

end;

if (n < 2)res= n;

elseres=Fib(n-1) + Fib(n-2);

end;

return;

Page 20: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ricorsione multipla

• La ricorsione multipla va usata con molta attenzione, perché può portare a programmi molto inefficienti

• Eseguendo il calcolo dei numeri di Fibonacci di ordine crescente...– … si nota che il tempo di elaborazione cresce MOLTO

rapidamente… quasi 3 milioni di invocazioni per calcolare Fib(31) !!!!

Page 21: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

• Il rompicapo è costituito da tre pile di dischi (“torri”) allineate– all’inizio tutti i dischi si trovano sulla pila di sinistra– alla fine tutti i dischi si devono trovare sulla pila di destra

• I dischi sono tutti di dimensioni diverse e quando si trovano su una pila devono rispettare la seguente regola– nessun disco può avere sopra di sé dischi più grandi

Page 22: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

Situazione iniziale Situazione finale

Page 23: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

Situazione iniziale Situazione finale

Page 24: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

• Per risolvere il rompicapo bisogna:

– spostare un disco alla volta

– un disco può essere rimosso dalla cima della torre ed inserito in cima ad un’altra torre

– nessun disco può avere sopra di sé dischi più grandi

Page 25: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

• Per il rompicapo delle Torri di Hanoi è noto un algoritmo di soluzione ricorsivo:

– Il problema generale consiste nello spostare n dischi da una torre ad un’altra, usando la terza torre come deposito temporaneo

– Per spostare n dischi da una torre all’altra si suppone, come sempre si fa nella ricorsione, di saper spostare n-1 dischi da una torre all’altra

Page 26: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

• Il caso base si ha quando n vale 1, in questo caso possiamo spostare liberamente il disco da una torre ad un’altra

• Per spostare n dischi dalla torre 1 alla torre 3

1) gli n-1 dischi in cima alla torre 1 vengono spostati sulla torre 2, usando la torre 3 come deposito temporaneo (si usa una chiamata ricorsiva, al termine della quale la torre 3 rimane vuota)

2) il disco rimasto nella torre 1 viene portato nella torre 3

3) gli n-1 dischi in cima alla torre 2 vengono spostati sulla torre 3, usando la torre 1 come deposito temporaneo (si usa una chiamata ricorsiva, al termine della quale la torre 1 rimane vuota)

Page 27: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

Page 28: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

Algoritmo Hanoi(n, da, a, int)input: il numero di dichi n, il perno di partenza, di arrivo e intermediooutput: le mosse necessarieif n = 1 then

muovi (1, da, a) else

hanoi (n-1, da, int, a)muovi (n, da, a)hanoi (n-1, int, a, da)

Page 29: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

• Si può dimostrare che il numero di mosse necessarie per risolvere il rompicapo con l’algoritmo proposto è pari a:

2n – 1

• Il tempo necessario alla soluzione è proporzionale al numero di mosse (ogni mossa richiede un tempo costante)

Page 30: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi: soluzione

function Sposta(n, da, a, buffer)

if(n==1)disp ([‘Sposto il disco da ’, da, ‘a ‘,a,’\n’];

elseSposta(n-1, da, buffer, a);Sposta(n, buffer, a, da);

end;

return;

Page 31: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Torre di Hanoi

• Una leggenda narra che alcuni monaci buddisti in un tempio dell’Estremo Oriente siano da sempre impegnati nella soluzione del rompicapo, spostando fisicamente i loro 64 dischi da una torre all’altra, consapevoli che quando avranno terminato il mondo finirà

• Sono necessarie 264 mosse, che sono circa 16 miliardi di miliardi di mosse

• Supponendo che i monaci facciamo una mossa ogni minuto, essi fanno circa 500000 mosse all’anno, quindi il mondo finirà tra circa 30 mila miliardi di anni

• Un processore ad 1GHz che fa una mossa ad ogni intervallo di clock (un miliardo di mosse al secondo…) impiega 16 miliardi di secondi, che sono circa 500 anni...

Page 32: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento efficiente: quick-sort

• Si cerca di ridurre la parte disordinata di più di un elemento per volta (a differenza di selection-sort e bubble-sort)

• L’idea è di ordinare parzialmente l’array, in modo che una parte contenga tutti i valori minori di un valore dato (pivot), e l’altra parte contenga tutti elementi maggiori

• Si applica poi l’algoritmo ricorsivamente alle due parti

Page 33: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: quick-sort

27

Prova(1)

14 22871

Prova(2) Prova(3) Prova(4) Prova(5)

Passo 1: Scelgo un valore nell’array da usare come pivot.

2287 27141

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

elemento pivot

Linea di demarcazione delle due parti parzialmente ordinate

Page 34: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: quick-sort

2287 27141

Passo 2: Applico di nuovo il procedimento alle due parti separatamente

8722 27141

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

2287 27141

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

elemento pivot elemento pivot

Page 35: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: quick-sort

8722 27141

Passo 3: Applico di nuovo il procedimento alle due parti separatamente

8722 27141

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

2287 27141

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

Page 36: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: quick-sort

8722 27141

Passo 4: Applico di nuovo il procedimento alle varie parti separatamente

8722 27141

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

2287 27141

Prova(1) Prova(2) Prova(3) Prova(4) Prova(5)

27 87

Prova(4) Prova(5)

Page 37: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Quicksort in Matlab

function y=quicksort(x,pstart,pend); if((pend-pstart)<=1) y=x; return;end; [y,pivot]=partiziona(x,pstart,pend); y=quicksort(y,pstart,pivot);y=quicksort(y,pivot+1,pend);

Controlla se siamo nel caso base: la lunghezza (indice dell’ultimo elemento meno indice del primo elemento) della parte di vettore da ordinare è 1

Chiamata alla funzione che ordina parzialmente la parte di vettore che va dall’indice pstart all’indice pend

Chiamate ricorsive della funzione quicksort sulle due parti di vettore parzialmente ordinate

x: vettore da ordinarepstart: indice del primo elemento a cui applicare quicksortpend; indice dell’ultimo elemento a cui applicare quicksort

Page 38: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Funzione di partizionamento

• La funzione centrale di quicksort è la funzione che crea due sotto-vettori parzialmente ordinati utilizzando un elemento di pivot

• Come elemento di pivot scegliamo di utilizzare quello che sta approssimativamente al centro del vettore (ma si possono utilizzare altre strategie di scelta)

Page 39: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: partizionamento

27

Prova(1)

14 22871

Prova(2) Prova(3) Prova(4) Prova(5)

Passo 1: Scelgo un valore nell’array da usare come pivot.

elemento pivot indice j che scorre dalla fine verso l’inizio

indice i che scorre dalla fine verso l’inizio

Page 40: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: partizionamento

27

Prova(1)

14 22871

Prova(2) Prova(3) Prova(4) Prova(5)

Passo 2: Faccio scorrere indietro j fino a che gli elementi alla posizione j-esima sono maggiori o uguali al valore del pivot.

elemento pivot

indice j che scorre dalla fine verso l’inizio

indice i che scorre dalla fine verso l’inizio

Page 41: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: partizionamento

27

Prova(1)

14 22871

Prova(2) Prova(3) Prova(4) Prova(5)

Passo 3: Faccio scorrere avanti i fino a che gli elementi alla posizione i-esima sono minori o uguali al valore del pivot, ed i è minore di j

elemento pivot

indice j che scorre dalla fine verso l’inizio

indice i che scorre dalla fine

verso l’inizio

Page 42: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: partizionamento

27

Prova(1)

87 22141

Prova(2) Prova(3) Prova(4) Prova(5)

Passo 4: Scambio il valore che si trova alla i-esima posizione con quello della j-esima, poi faccio scorrere i e j nelle rispettive direzioni.

elemento pivot

indice j che scorre dalla fine

verso l’inizio

indice i che scorre dalla fine verso l’inizio

Page 43: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Ordinamento: partizionamento

27

Prova(1)

87 22141

Prova(2) Prova(3) Prova(4) Prova(5)

Passo 5: Se i è minore di j riprendo dal passo 2, altrimenti restituisco j come elemento di separazione fra i due sotto-vettori parzialmente ordinati

elemento pivot

indice j che scorre dalla fine

verso l’inizio

indice i che scorre dalla fine verso l’inizio

Page 44: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Partizionamento in Matlab

function [y,pivot]=partiziona(x,pstart,pend); y=x; pivot=round(0.5*(pstart+pend));p=x(pivot);i=pstart;j=pend; while(i<j) while(j>=1 & x(j)>p) j=j-1; end; while(x(i)<p & i<j) i=i+1; end; tmp=y(i); y(i)=y(j); y(j)=tmp; i=i+1; j=j-1;end; pivot=j+1;

Fa scorrere indietro l’indice j

Fa scorrere indietro l’indice i

Scambia gli elementi che sono dalla parte sbagliata dell’array rispetto al pivot

x: vettore da ordinarepstart: indice del primo elemento a cui applicare quicksortpend; indice dell’ultimo elemento a cui applicare quicksort

Scorre j indietro ed i in avanti finchè non si incrociano

Inizializzazione.Scelgo come pivot l’elemento centrale

Page 45: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Quick-sort: efficienza

• Nel caso medio ad ogni chiamata ricorsiva si divide l’array in due parti da ordinare di lunghezza approssimativamente uguale al numero di elementi diviso per due

n

n/2 n/2

n/4 n/4 n/4 n/4

Chiamata 1

Chiamata 2

Chiamata 3

Page 46: DEI - Univ. Padova (Italia) Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita dove n è un numero.

DEI - Univ. Padova (Italia)

Quick-sort: efficienza

• Per n elementi si ha che dividendo in maniera binaria e bilanciata si devono effettuare log(n) chiamate ricorsive

• Ad ogni chiamata ricorsiva si esaminano tutti gli elementi dell’array da ordinare

))log(()( nnOnfquicksort