16
Algoritmi e strutt ure Dati - Lezione 7 1 goritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale. A differenza degli algoritmi IS e SS, Merge-Sort non è però un algoritmo di ordinamento in loco. Infatti, la procedura Merge(A,p,q,r) richiede un vettore di appoggio di dimensione r-p+1 in cui effettuare la fusione È facile convincersi del fatto che il Merge-Sort ha complessità spaziale S(n)=O(n log n) (infatti ho bisogno di O(n) spazio ausiliario per ognuno dei log n livelli dell’albero della ricorsione) Ciò comporta (insieme alla gestione della struttura ricorsiva) anche una spesa in termini di tempo effettivo dell’esecuzione (infatti, lo spazio ausiliario richiesto non eccede O(n log n) e quindi non modifica l’andamento asintotico temporale, ma il tutto si riflette sulle costanti moltiplicative!)

Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Embed Size (px)

Citation preview

Page 1: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

1

Algoritmi di ordinamento ottimali

L’algoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale.

A differenza degli algoritmi IS e SS, Merge-Sort non è però un algoritmo di ordinamento in loco. Infatti, la procedura Merge(A,p,q,r) richiede un vettore di appoggio di dimensione r-p+1 in cui effettuare la fusione

È facile convincersi del fatto che il Merge-Sort ha complessità spaziale S(n)=O(n log n) (infatti ho bisogno di O(n) spazio ausiliario per ognuno dei log n livelli dell’albero della ricorsione)

Ciò comporta (insieme alla gestione della struttura ricorsiva) anche una spesa in termini di tempo effettivo dell’esecuzione (infatti, lo spazio ausiliario richiesto non eccede O(n log n) e quindi non modifica l’andamento asintotico temporale, ma il tutto si riflette sulle costanti moltiplicative!)

Page 2: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

2

Algortimo di ordinamento ottimale in loco: Heapsort

Introduciamo un nuovo algoritmo di ordinamento detto Heap-Sort che ha le seguenti caratteristiche:

- T(n) = O(n log n) Alg. Ordinamento ottimale- Ordina in loco e quindi S(n)=O(n)

Per fare ciò dobbiamo introdurre una struttura di dati detta heap.

Heap binario = albero binario in cui ogni nodo figlio ha valore minore o uguale al valore del proprio nodo padre.

Es. 16

1014

3978

1 42

L’albero è quasi completo Completo su tutti i livelli tranne eventualmente sul livello più basso che è riempito da sinistra.

Altezza dell’albero lunghezza del più lungo cammino discendente dalla radice ad una foglia.

Page 3: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

3

Proprietà di un heap

Notiamo che:

16

1014

3978

1 42

In questa direzione è presente un ordinamento

In questa direzione non è presente un ordinamento.

Proprietà di ordinamento parziale dello heap:Ogni nodo interno contiene un valore maggiore

uguale del valore contenuto nei figli. Da ciò segue che:

1. l’elemento più grande dello heap è memorizzato nella radice.

2. ogni nodo interno contiene un valore maggiore uguale del valore contenuto in tutti i suoi discendenti.

Page 4: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

4

Come rappresentare uno heap: dall’albero binario all’array

16

1014

3978

1 42

i=1

76

32

54

8 9 10

16

i=1

14

2

10

3

8

4

7

5

9

6

3

7

2

8

4

9

1

10

Length[A]

Un albero binario quasi completo può essere descritto da un array in cui il figlio sinistro ed il figlio destro di un nodo i si trovano nelle posizioni 2i e 2i+1 rispettivamente.

Heap-size[A]

N.B. Stiamo assumendo chel’indice i parta da 1.

Page 5: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

5

16

i=1

14

2

10

3

8

4

7

5

9

6

3

7

2

8

4

9

1

10

Length[A]

Heap-size[A]

16

1014

3978

1 42

i=1

76

32

54

8 9 10

Per muoverci all’interno dell’albero definiamo le seguenti procedure:

Parent(i)returni/2

Left(i)Return 2i

Right(i)Return 2i+1

Affinché un array A che rappresenta un albero binario sia uno heap deve valere la relazione:

A(parent[i]) A[i] per ogni i 1

Heap-size[A] ≤ Length[A]

Page 6: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

6

Mostreremo che un array generico può essere ordinato trasformandolo in un heap ed eseguendo operazioni che hanno tempo di esecuzione al più proporzionale alla altezza H dello heap.

Notiamo:

H=3

H = altezza albero binario

Se l’albero è completo:

n = 1 +2 + 22 + … + 2H = 2H*( 1 + (1/2) + … + (1/2)H)= = 2H*(2-(1/2)H) = 2H+1 –1

Se l’albero è quasi completo: 2H -1 < n < 2 H+1 –1 H = (log(n))

16

1014

3978

1 42

i=1

76

32

54

8 9 10

Page 7: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

7

L’ idea di base è la seguente: Trasformiamo un array A di dimensione n in un heap di dimensione n (creazione dell’heap); Passo 1: Per le proprietà dello heap, sappiamo che l’elemento massimo della sequenza iniziale è memorizzato in A[1]. Scambiamo A[1] con l’elemento A[n]; La sequenza A[1]……A[n-1] che otteniamo non è più uno heap (A[1] è fuori posto). Permutiamo i suoi elementi in moto da trasformarla in un heap di dimensione n-1 (mantenimento dell’heap);

Passo 2: Per le proprietà dello heap, sappiamo che l’elemento massimo della sequenza A[1]……A[n-1] è memorizzato in A[1]. Scambiamo A[1] con l’elemento A[n-1]; …… ……Ripetendo n-1 volte otteniamo una sequenza ordinata.

Le operazioni che effettuiamo sono:o Creazione di un heap O(n)

Agli step k=1,2,…n-1:o Scambio di due elementi O(1) (temporale e spaziale)o Mantenimento dello heap O(log n)

Poiché abbiamo n-1 iterazioni T(n)=O(n log n)

…e poiché eseguiamo il tutto in loco S(n)=O(n)

Algoritmo Heapsort - strategia

Page 8: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

8

Procedura di mantenimento dell’heap

Supponiamo che A sia uno heap. Alteriamo il valore di A[1]. L’array che otteniamo non è più un heap.I sottoalberi con radice in A[right(1)] ed A[left(1)] sono ancora heap. Dobbiamo scrivere una procedura che permuti gli elementi A[1],A[2],……,A[heap-size[A]] in modo da ricostruire uno heap.

FixHeap(A,i)lleft(i)rright(i)If (l heap-size[A]) and (A[l] > A[i]) then largest l else largest iIf (r heap-size[A] )and(A[r] > A[largest]) then largest rIf (largest i) then scambia(A[i], A[largest]) FixHeap(A,largest)

La procedura FixHeap fa “scendere” A[i] nella prima posizione utile.

Ipotesi necessaria per la correttezza- I sottoalberi con radice in A[right(i)] ed A[left(i)] sono heap.

Tempo di esecuzione di FixHeap(A,i) O(hi) hi = altezza del nodo i (il livello più basso delle foglie ha altezza 0)

Page 9: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

9

FixHeap - esempio

16

104

39714

1 82

i=1

76

32

54

8 9 10

Lancio FixHeap(A,2):16

1014

3974

1 82

i=1

76

32

54

8 9 10

16

1014

3978

1 42

i=1

76

32

54

8 9 10

Page 10: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

10

Procedura di creazione di uno heap

La procedura FixHeap può essere usata in modo bottom-up per convertire un array A[1…n], in uno heap di lunghezza n.

Heapify(A)heap-size[A] lenght[A]For i lenght[A]/2 down to 1 do FixHeap(A,i)

Heapify “attraversa” i nodi non foglia dell’ heap, dal basso verso l’alto ed esegue FixHeap su ciascuno di essi. Ad ogni step le ipotesi necessarie per applicare FixHeap sono automaticamente verificate.

Tempo di esecuzione di Heapify?

H

1hnodi

H

1hFixHeapnodi

1 altezza di nodi

FixHeap hOhNhThNTT(n)

H = altezza albero log2(n)Nnodi(h) = numero di nodi con altezza h n/2h+1

O(n)nC 2

hnCh

2

nCT(n)

1h1h

log(n)

1h1h

Notare – Si può costruire un heap da un array non ordinato in tempo lineare!

Page 11: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

11

Heapify – Un esempio

4

31

109162

7 814

i=1

76

32

54

8 9 10

4

31

109162

7 814

i=1

76

32

54

8 9 10

4

31

1091614

7 82

i=1

76

32

54

8 9 10

Page 12: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

12

Heapify – Un esempio (2)

4

101

391614

7 82

i=1

76

32

54

8 9 10

4

1016

39114

7 82

i=1

76

32

54

8 9 10

4

1016

39714

1 82

i=1

76

32

54

8 9 10

Page 13: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

13

Heapify – Un esempio (3)

16

104

39714

1 82

i=1

76

32

54

8 9 10

16

1014

3974

1 82

i=1

76

32

54

8 9 10

16

1014

3978

1 42

i=1

76

32

54

8 9 10

E’ un heap!

Page 14: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

14

Algoritmo Heapsort

Heapsort(A)Heapify(A) O(n)For i length(A) down to 2 O(n) do Scambia(A[1],A[i]) O(n) Heapsize[A] Heapsize[A]-1 O(n) FixHeap(A,1) O(n log n)

Tempo di esecuzione O(n log n) Ordinamento in loco

Esempio

16

1014

3978

1 42

i=1

76

32

54

8 9 10

Input: A=<4,1,3,2,16,9,10,14,8,7>Heapify(A) A0 =<16,14,10,8,7,9,3,2,4,1>

Scambia(A[1],A[n])

Page 15: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

15

1

1014

3978

16 42

i=1

76

32

54

8 9 10

Heap-size = Heap-size -1

14

108

3974

16 12

i=1

76

32

54

8 9 10

FixHeap(A,1)

Page 16: Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali Lalgoritmo Merge-Sort ha complessità O(n log n) Algoritmo di ordinamento ottimale

Algoritmi e strutture Dati - Lezione 7

16

E cosi via ……

14

108

3974

16 12

i=1

76

32

54

8 9 10

Scambia(A[1],A[n-1])

10

98

3174

16 2

i=1

76

32

54

8 10

FixHeap(A,1)

14

1

108

3974

16 2

i=1

76

32

54

8 10

Heap-size = Heap-size -1

14