Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 -...

25
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 • Usa la tecnica del divide et impera: 1 Divide: dividi l’array a metà 2 Risolvi i due sottoproblemi ricorsivamente 3 Impera: fondi le due sottosequenze ordinate MergeSort

Transcript of Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 -...

Page 1: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl1

• Usa la tecnica del divide et impera:

1 Divide: dividi l’array a metà

2 Risolvi i due sottoproblemi ricorsivamente

3 Impera: fondi le due sottosequenze ordinate

MergeSort

Page 2: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl2

Esempio di esecuzione

7 2 4 5 3 1 5 6

7 2 4 5 3 1 5 6

7 2 4 5 3 1 5 6

7 2 4 5 3 1 5 6

1 2 3 4 5 5 6 7

2 4 5 7 1 3 5 6

2 7 4 5 1 3 5 6

7 2 4 5 3 1 5 6

input

output

Input ed

output delle

chiamate

ricorsive

Page 3: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl3

• Due array ordinati A e B possono essere fusi rapidamente:– estrai ripetutamente il minimo di A e B e copialo

nell’array di output, finché A oppure B non diventa vuoto

– copia gli elementi dell’array non vuoto alla fine dell’array di output

Procedura Merge

Notazione: dato un array A e due indici x y, denotiamo con A[x;y] la porzione di A costituita da A[x], A[x+1],…,A[y]

Page 4: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl4

Merge (A, i1, f1, f2)

1. Sia X un array ausiliario di lunghezza f2-i1+1

2. i=1

3. i2=f1+1

4. while (i1 f1 e i2 f2) do

5. if (A[i1] A[i2])

6. then X[i]=A[i1]

7. incrementa i e i1

8. else X[i]=A[i2]

9. incrementa i e i2

10. if (i1<f1) then copia A[i1;f1] alla fine di X

11. else copia A[i2;f2] alla fine di X

12. copia X in A[i1;f2]

fonde A[i1;f1] e A[f1+1;f2] output in A[i1;f2]

Osservazione: sto usando un array

ausiliario

Page 5: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl5

LemmaLa procedure Merge fonde due sequenze ordinate di lunghezza n1 e n2 eseguendo al più n1+ n2 -1 confronti

dimOgni confronto “consuma” un elemento di A.Nel caso peggiore tutti gli elementi tranne l’ultimo sonoaggiunti alla sequenza X tramite un confronto.Il numero totale di elementi è n1+ n2. Quindi il numero totaledi confronti è n1+ n2 -1.

numero di confronti nel caso peggiore è (n1+ n2)

Il numero di operazioni (confronti + copie)? (n1+ n2)

Page 6: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl6

MergeSort (A, i, f)

1. if (i < f) then

2. m = (i+f)/2

3. MergeSort(A,i,m)

4. MergeSort(A,m+1,f)

5. Merge(A,i,m,f)

Page 7: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl7

• Il numero di confronti del MergeSort è descritto dalla seguente relazione di ricorrenza:

C(n) = 2 C(n/2) + O(n)

• Usando il Teorema Master si ottiene

C(n) = O(n log n)

Tempo di esecuzione

a=b=2, f(n)=O(n) caso 2

Page 8: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl8

…alcune osservazioni…

• La complessità temporale del MergeSort misurata come numero di operazioni (confronti + copie) o come numero di passi elementari è sempre O(n log n)

• Il MergeSort non ordina in loco – occupazione di memoria ausiliaria (oltre input) pari a O(n)

Page 9: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl9

• Usa la tecnica del divide et impera:

1 Divide: scegli un elemento x della sequenza (perno) e partiziona la sequenza in elementi ≤ x ed elementi >x

2 Risolvi i due sottoproblemi ricorsivamente

3 Impera: restituisci la concatenazione delle due sottosequenze ordinate

QuickSort

Rispetto al MergeSort, divide complesso ed impera semplice

Page 10: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl10

QuickSort (A)

1. scegli elemento x in A

2. partiziona A rispetto a x calcolando:

3. A1={y A : y x}

4. A2={y A : y > x}

5. if (|A1| > 1) then QuickSort(A1)

6. if (|A2| > 1) then QuickSort(A2)

7. copia la concatenazione di A1 e A2 in A

non partiziona in loco!

Page 11: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl11

Partizione in loco

• Scorri l’array “in parallelo” da sinistra verso destra e da destra verso sinistra – da sinistra verso destra, ci si ferma su un elemento

maggiore del perno– da destra verso sinistra, ci si ferma su un elemento

minore del perno

• Scambia gli elementi e riprendi la scansione

Page 12: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl12

Partizione in loco: un esempio

45 12 21 3 67 43 85 29 24 92 63 3 93

45 12 21 3 3 43 85 29 24 92 63 67 93

45 12 21 3 3 43 2924 92 63 67 9385

45 12 93 3 67 43 85 29 24 92 63 3 21

perno

Page 13: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl13

Partition (A, i, f )

1. x=A[i]

2. inf =i

3. sup= f + 1

4. while (true) do

5. do (inf=inf + 1) while (inf ≤ f e A[inf] x)

6. do (sup=sup-1) while (A[sup] > x)

7. if (inf < sup) then scambia A[inf] e A[sup]

8. else break

9. scambia A[i] e A[sup]

10. return sup

Tempo di

esecuzione:

O(n)

partiziona A[i;f]rispetto a A[i]

Proprietà:

In ogni istante, gli elementi A[i],…,A[inf-1] sono del perno,

mentre gli elementi A[sup+1],…,A[f] sono > del perno

mette il perno “al centro”

restituisce l’indice del “centro”

Page 14: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl14

QuickSort (A, i, f )

1. if (i < f) then

2. m=Partition(A,i,f)

3. QuickSort(A,i,m-1)

4. QuickSort(A, m +1,f)

Page 15: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl15

Esempio di esecuzione

5 1 276

2 45 7 6

1 4 3

3

1 2 3 4 5 5 6 7

1 2 3 4 6

1 3 4

3

input

output

2 45 3 1 7 6 dopo partition5

3 1

5

2 631 4

5

5

43 5

3

5

5

5

1

6

6

6

5

45

7

7

3

L’albero delle chiamate ricorsive può essere sbilanciato

Page 16: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl16

• Nel caso peggiore, il perno scelto ad ogni passo è il minimo o il massimo degli elementi nell’array

• Il numero di confronti è pertanto:C(n)=C(n-1) + C(0) + O(n)

=C(n-1)+O(1)+O(n)=C(n-1)+O(n)

• Svolgendo per iterazione si ottiene C(n) = O(n2)

Analisi nel caso peggiore

complessità nel caso migliore?

Page 17: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl17

Caso migliore: O(n log n), partizionamento sempre bilanciato

Totale: cn log n

Page 18: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl18

…intuizioni sul caso medio…(penso al caso di istanze equiprobabili)

• problema: la partizione può essere sbilanciata• la probabilità che ad ogni passo si presenti la partizione

peggiore è molto bassa• per partizioni che non sono “troppo sbilanciate”

l’algoritmo è veloce• domanda: quale è la complessità dell’algoritmo

supponendo che l’algoritmo di partizionamento produca sempre una partizione proporzionale 9-a-1?

• E se la partizione fosse sempre proporzionale a 99-a-1?• Nota: sembrano partizioni piuttosto sbilanciate…

Page 19: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl19

…la complessità è ancora O(n log n)

Page 20: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl20

TeoremaL’algoritmo quickSort randomizzato ordina in loco un arraydi lunghezza n eseguendo O(n2) confronti nel caso peggiore eO(n log n) confronti attesi

Idea: scegli il perno x a caso fra gli elementi da ordinare

…e se le istanze non sono equiprobabili?

Page 21: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl21

quickSort randomizzato

• Complessità temporale non dipende dall’ordine dell’input

• nessuna assunzione sulla distribuzione di probabilità delle istanze

• nessun input specifico per il quale si verifica il caso peggiore

• il caso peggiore determinato solo dal generatore di numeri casuali

Page 22: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl22

analisi• Assunzioni:

– scelte casuali del perno indipendenti– insieme di elementi distinti (semplifica

l’analisi, ma non necessaria)

• T(n): variabile aleatoria (v.a.) per tempo di esecuzione dell’algoritmo con input di dimensione n

• vogliamo stimare E[T(n)]

Page 23: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl23

analisi

Per ogni k=0,1,…,n-1, definiamo la v.a.

Xk=

1

0

se partition genera una partizione k,n-k-1

altrimenti

E[Xk]= 0 Pr{Xk=0}+1 Pr{Xk=1}= 1/n

Page 24: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl24

analisi

T(n)=

T(0)+T(n-1)+O(n) se ho partizione (0,n-1)se ho partizione (1,n-2)

se ho partizione (n-1,0)

T(1)+T(n-2)+O(n)

T(n-1)+T(0)+O(n)

..

...

T(n)= Xk(T(k)+T(n-k-1)+O(n))k=0

n-1

Page 25: Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Usa la tecnica del.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl25

analisi

E[T(n)]= 2/n E[T(k)] + O(n)k=0

n-1

si dimostra con il metodo della sostituzione che

E[T(n)] a n log n

usando la proprietà:

si fa vedere che:

k log k 1/2 n2 log n – 1/8 n2

k=2

n-1