• Non ci sono risultati.

Algoritmi e Strutture Dati. Capitolo 8 Il problema della Coda con priorità

N/A
N/A
Protected

Academic year: 2022

Condividi "Algoritmi e Strutture Dati. Capitolo 8 Il problema della Coda con priorità"

Copied!
74
0
0

Testo completo

(1)

Capitolo 8

Il problema della

Coda con priorità

(2)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

2

Tipo di dato C o d a P r i o r i t à (1/2)

Suppongo sempre che mi venga dato un riferimento diretto all’elemento da

cancellare

(3)

Operazioni aggiuntive

Applicazioni: gestione code in risorse condivise, gestione priorità in processi concorrenti, progettazione di algoritmi efficienti per diversi problemi fondamentali (es: calcolo cammini minimi in un grafo,

minimo albero ricoprente, ordinamento, ecc.)

(4)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

4

Quattro implementazioni elementari

1. Array non ordinato 2. Array ordinato

3. Lista non ordinata 4. Lista ordinata

Ci focalizzeremo soltanto sulle operazioni di base.

(5)

Copyright © 2004 - The McGraw-Hill Companies, srl

5

Array non ordinato

• FindMin: Θ(n) (devo guardare tutti gli elementi)

• Insert: O(1) (inserisco in coda)

• Delete: O(1) (poiché mi viene fornito il riferimento diretto all’elemento da cancellare, lo posso

cancellare in O(1) sovracopiando l’ultimo elemento)

• DeleteMin: Θ(n) (devo prima cercare il minimo in Θ(n), poi lo posso cancellare in O(1))

Lo dimensiono sufficientemente grande e tengo traccia del numero n di elementi nella coda in una variabile di

appoggio

(6)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

6

Array ordinato

• FindMin: O(1)

• Insert: O(n) (trovo in Θ(log n) la giusta

posizione, ma poi devo fare O(n) spostamenti)

• Delete: O(n) (devo fare O(n) spostamenti)

• DeleteMin: O(1) (l’elemento minimo è in fondo all’array, non devo fare spostamenti)

Lo dimensiono sufficientemente grande, lo tengo ordinato in ordine decrescente e tengo traccia del numero n di

elementi nella coda in una variabile di appoggio

(7)

Copyright © 2004 - The McGraw-Hill Companies, srl

7

Lista non ordinata

• FindMin: Θ(n) (devo guardare tutti gli elementi)

• Insert: O(1) (inserisco in coda o in testa)

• Delete: O(1) (poiché mi viene fornito il

riferimento diretto all’elemento da cancellare, lo posso cancellare in O(1) agendo sui puntatori)

• DeleteMin: Θ(n) (devo prima cercare il minimo in Θ(n), poi lo posso cancellare in O(1))

La considero bidirezionale elemento

(8)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

8

Lista ordinata

• FindMin: O(1) (il minimo è in testa alla lista)

• Insert: O(n) (trovo in O(n) la giusta posizione, e poi faccio in O(1) l’inserimento)

• Delete: O(1) (agisco sui puntatori)

• DeleteMin: O(1) (basta far puntare la testa della lista al secondo elemento della lista stessa)

Tengo la lista bidirezionale ordinata in ordine crescente

(9)

Copyright © 2004 - The McGraw-Hill Companies, srl

9

Riepilogo implementazioni elementari

FindMin Insert Delete DeleteMin Array

non ord.

Θ(n) O(1) O(1) Θ(n)

Array ordinato

O(1) O(n) O(n) O(1)

Lista non ordinata

Θ(n) O(1) O(1) Θ(n)

Lista

ordinata

O(1) O(n) O(1) O(1)

(10)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

10

Tre implementazioni evolute

d-heap: generalizzazione degli heap binari visti per l’ordinamento

Heap binomiali

Heap di Fibonacci (cenni)

(11)
(12)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

12

Definizione

Un d-heap è un albero radicato d-ario con le seguenti proprietà:

1. Struttura: è completo almeno fino al penultimo livello, e tutte le foglie sull’ultimo livello sono compattate verso sinistra

2. Contenuto informativo: ogni nodo v contiene un elemento elem(v) ed una chiave chiave(v) presa da un dominio totalmente ordinato

3. Ordinamento parziale (inverso) dell’heap (min-

heap): chiave(v) ≥ chiave(parent(v)) per ogni nodo

v diverso dalla radice

(13)

Copyright © 2004 - The McGraw-Hill Companies, srl

13

Esempio

Heap d-ario con 18 nodi e d=3

(14)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

14

Proprietà

1. Un d-heap con n nodi ha altezza Θ (log d n)

2. La radice contiene l’elemento con chiave minima (per via della proprietà di ordinamento a heap) 3. Può essere rappresentato implicitamente tramite

vettore posizionale grazie alla proprietà di struttura

(15)

Copyright © 2004 - The McGraw-Hill Companies, srl

15

Procedure ausiliarie

Utili per ripristinare la proprietà di ordinamento a heap su un nodo v che non la soddisfi

T(n)=O(log d n)

T(n)=O(d log d n)

il vecchio amico FixHeap!

(16)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

16

findMin

T(n)=O(1)

(17)

insert(elem e, chiave k)

Insert(e,8)

5

16 9

30 17

35 40 20 25

10 15

(18)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

insert(elem e, chiave k)

Insert(e,8)

5

16 9

30 17

35 40 20 25

10 15

8

(19)

insert(elem e, chiave k)

Insert(e,8)

5

16 9

30 17

35 40 20 25

15 10

8

(20)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

insert(elem e, chiave k)

Insert(e,8)

5

16

30 17

35 40 20 25

15 10

9

8

(21)

insert(elem e, chiave k)

Insert(e,8)

5

16

30 17

35 40 20 25

15 10

9

8

(22)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

22

insert(elem e, chiave k)

T(n)=O(log d n) per l’esecuzione di muoviAlto

(23)

delete(elem e) e deleteMin

5

16

30 17

35 40 20 25

15 10

9

8

delete

(24)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

delete(elem e) e deleteMin

5

16

30 17

35 40 20 25

15 9

10

(25)

delete(elem e) e deleteMin

5

16

30 17

35 40 20 25

15 9

10

(26)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

delete(elem e) e deleteMin

5

16

30 17

35 40 20 25

15 9

10

(27)

delete(elem e) e deleteMin

5

16

30 17

35 40 20 25

15 10

9

delete 8

(28)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

delete(elem e) e deleteMin

5

16

30

35 40 20 25

15 9

8

10

(29)

delete(elem e) e deleteMin

5

30

35 40 20 25

15 9

8 16

10

(30)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

delete(elem e) e deleteMin

5

30

35 40 20 25

15 9

8 16

10

(31)

Copyright © 2004 - The McGraw-Hill Companies, srl

31

delete(elem e) e deleteMin

T(n)= O(log d n) o O(d log d n) per l’esecuzione di muoviAlto o muoviBasso

Può essere usata anche per implementare la

cancellazione del minimo, con costo O(d log d n)

(32)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

32

decreaseKey(elem e, chiave d)

5

16

30 17

35 40 20 25

15 10

9

decrementa 8

di 27

(33)

Copyright © 2004 - The McGraw-Hill Companies, srl

33

decreaseKey(elem e, chiave d)

5

16

17 35 40 20 25

15 10

9

8

3

(34)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

34

decreaseKey(elem e, chiave d)

5

17 35 40 20 25

15 10

9

8 16

3

(35)

Copyright © 2004 - The McGraw-Hill Companies, srl

35

decreaseKey(elem e, chiave d)

17 35 40 20 25

15 10

9

8 16

5

3

(36)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

36

decreaseKey(elem e, chiave d)

17 35 40 20 25

15 10

9

8 16

5

3

(37)

Copyright © 2004 - The McGraw-Hill Companies, srl

37

decreaseKey(elem e, chiave d)

T(n)=O(log d n) per l’esecuzione di muoviAlto

(38)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

increaseKey(elem e, chiave d)

5

16

30 17

35 40 20 25

15 10

9

8

incrementa

di 14

(39)

increaseKey(elem e, chiave d)

5

30 17

35 40 20 25

15 10

9

30 8

(40)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

increaseKey(elem e, chiave d)

5

30

35 40 20 25

15 10

9 17 8

30

(41)

increaseKey(elem e, chiave d)

5

30

35 40 25

15 10

9 17 8

20

30

(42)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

increaseKey(elem e, chiave d)

5

30

35 40 25

15 10

9 17 8

20

30

(43)

Copyright © 2004 - The McGraw-Hill Companies, srl

43

increaseKey(elem e, chiave d)

T(n)=O(d log d n) per l’esecuzione di muoviBasso

(44)

Copyright © 2004 - The McGraw-Hill Companies, srl

44

merge(CodaPriorità c 1 , CodaPriorità c 2 )

Due modi:

1. Costruire da zero: si distruggono le due code e se ne crea una nuova contenente l’unione degli

elementi.

2. Inserimenti ripetuti: si inseriscono ripetutamente

gli elementi della coda più piccola in quella più

grande.

(45)

Analogamente a quanto mostrato per l’heap binario, la creazione di un heap d-ario (con d costante) di n elementi può essere eseguita in Θ(n). Infatti, il tempo di esecuzione di heapify diventa ora:

T(n)= d T(n/d)+O(d log d n)

ove il fattore O(d log d n) è relativo all’esecuzione della procedura muoviBasso ( f i x h e a p nell’heap binario).

Siamo quindi di nuovo nel Caso 1 del Teorema Master:

 Il merge viene quindi eseguito in Θ(n), ove n=|c 1 |+|c 2 |, generando un nuovo heap d-ario che contiene tutti gli elementi in c 1 e c 2

d log d n=f(n)=O(n ) per >0, e quindi log d d - T(n) = Q(n ) log d d = Θ(n)

(46)

Inseriamo ad uno ad uno tutti gli elementi della coda più piccola nella coda più grande.

Sia k=min{|c 1 |,|c 2 |} e n=|c 1 |+|c 2 |.

Eseguiamo quindi k inserimenti nella coda più grande.

Costo: O(k log n), dove n=|c 1 |+|c 2 |.

L’approccio conviene quindi per k log n=o(n), cioè per k=o(n/log n).

Inserimenti ripetuti

(47)

Due modi:

1. Costruire da zero: si distruggono le due code e se ne crea una nuova contenente l’unione degli

elementi.

2. Inserimenti ripetuti: si inseriscono ripetutamente gli elementi della coda più piccola in quella più grande.

Osservazione: nel caso peggiore entrambe le

operazioni hanno un costo di (n).

(48)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

Capitolo 8

Code con priorità:

Heap binomiali

Algoritmi e Strutture Dati

(49)

Copyright © 2004 - The McGraw-Hill Companies, srl

Riepilogo

Find

Min

Insert Delete DelMin Incr.

Key

Decr.

Key

merge

Array non ord.

Θ(n) O(1) O(1) Θ(n) O(1) O(1) O(n)

Array ordinato

O(1) O(n) O(n) O(1) O(n) O(n) O(n)

Lista non ordinata

Θ(n) O(1) O(1) Θ(n) O(1) O(1) O(1)

Lista ordinata

O(1) O(n) O(1) O(1) O(n) O(n) O(n)

d-Heap O(1) O(log d n) O(d log d n) O(d log d n) O(d log d n) O(log d n) O(n)

 Il nostro obiettivo è implementare una coda di priorità con una

struttura dati che non comporti costi lineari!

(50)

heap binomiali

(51)

Copyright © 2004 - The McGraw-Hill Companies, srl

Alberi binomiali

Un albero binomiale B h è definito ricorsivamente come segue:

1. B 0 consiste di un unico nodo

2. Per i>0, B i+1 è ottenuto fondendo due alberi binomiali B i , ponendo la radice dell’uno come figlia della radice

dell’altro

(52)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

Proprietà strutturali

Dimostrazione per induzione su h

(53)

Copyright © 2004 - The McGraw-Hill Companies, srl

Definizione di heap binomiale

Un heap binomiale è una foresta di alberi binomiali che gode delle seguenti proprietà:

1. Unicità: per ogni intero i≥0, esiste al più un B i nella foresta

2. Contenuto informativo: ogni nodo v contiene un elemento elem(v) ed una chiave chiave(v) presa da un dominio totalmente ordinato

3. Ordinamento a heap: chiave(v) ≥ chiave(parent(v))

per ogni nodo v diverso da una delle radici

(54)

54

10

12 25

18

1

29 14

38

6

11 17

27

8

Un esempio di Heap Binomiale con

n=13 nodi

in questa direzione è presente un ordinamento in questa direzione non è

presente un ordinamento

domanda: quanti alberi binomiali può avere

al massimo un heap binomiale con n nodi?

(55)

55

10

12 25

18

1

29 14

38

6

11 17

27

8

n=13 nodi

13=2 0 +2 2 +2 3

13 in binario: 1101

B 0 B 2 B 3

(56)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

Proprietà topologiche

• Dalla proprietà di unicità degli alberi

binomiali che lo costituiscono, ne deriva che un heap binomiale di n elementi è formato

dagli alberi binomiali B i 0 , B i 1 , …, B i h, , dove i 0 , i 1 ,…, i h corrispondono alle posizioni degli 1

nella rappresentazione in base 2 di n.

 Ne consegue che in un heap binomiale con n

nodi, vi sono al più log n alberi binomiali,

ciascuno con grado ed altezza O(log n)

(57)

Copyright © 2004 - The McGraw-Hill Companies, srl

una

rappresentazione

collegata

(58)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Procedura ausiliaria

Utile per ripristinare la proprietà di unicità in un heap binomiale (ipotizziamo di scorrere la lista delle radici da sinistra verso destra, in ordine crescente rispetto all’indice degli alberi binomiali)

T(n): lineare nel numero di alberi binomiali in input

(ogni fusione diminuisce di uno il numero di alberi binomiali)

(59)

12

25 7

28 33 41 18 15

37 3

18 25 28 33

41 37

18

25

7 28 33

41 12 15

37 3

18

25 7 28 33

41

15 12

37 3

H

(60)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

Realizzazione (1/3)

(61)

Copyright © 2004 - The McGraw-Hill Companies, srl

Realizzazione (2/3)

(62)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

Realizzazione (3/3)

Tutte le operazioni richiedono tempo T(n) = O(log n)

Durante l’esecuzione della procedura ristruttura esistono

infatti al più tre B i , per ogni i ≥ 0

(63)

H 1

25 7 28 33

41

15 18

37 3

12

(64)

DeleteMin(H)

12

25 7

28 33 41 18 15

37 3

18 25 7

28 33 41 12 15

37 3

18

25

7 28 33

41 12 15

37 3

18

25 7 28 33

41

15 12

37 3

H

ristruttura fondi

25 7 28 33

41

15 18

37 3

12

(65)

65

10

12 25 18

1

29 14

38

6

11 17 27

8

decrKey(10)

10

12 25 18

1

29 14

38

6

1 17 27

8

(66)

…decremento di una chiave

10

12 25 18

1

29 14

38

6

8 17 27

1

10

12 25 18

1

29 14

38

1

8 17 27

6

(67)

25 28 33 41

merge(H 1 ,H 2 )

18

37 3

12

25 7

28 33 41 18 15

37 3

18 25 28 33

41 37

18

25

7 28 33

41 12 15

37 3

18

25 7 28 33

41

15 12

37 3

H 2

ristruttura

fondi

(68)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

Heap di Fibonacci

(Fredman,Tarjan, 1987)

(69)

Copyright © 2004 - The McGraw-Hill Companies, srl

Heap binomiale rilassato: si ottiene da un heap binomiale rilassando la proprietà di unicità dei B i ed utilizzando un atteggiamento più “pigro” durante l’operazione insert (perché ristrutturare subito la foresta quando potremmo farlo dopo?)

Heap di Fibonacci: si ottiene da un heap binomiale

rilassato indebolendo la proprietà di struttura dei B i che non sono più necessariamente alberi binomiali

Analisi sofisticata: i tempi di esecuzione sono

ammortizzati su sequenze di operazioni, cioè

dividendo il costo complessivo della sequenza di

operazioni per il numero di operazioni della sequenza

(70)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

Copyright © 2004 - The McGraw-Hill Companies, srl

Conclusioni: tabella riassuntiva

L’analisi per d-Heap e Heap Binomiali è nel caso peggiore, mentre quella per gli Heap di Fibonacci è ammortizzata (per le operazioni asteriscate)

FindMin Insert Delete DelMin IncKey DecKey merge

d-Heap (d cost.)

O(1) O(log n) O(log n) O(log n) O(log n) O(log n) O(n)

Heap Binom.

O(log n) O(log n) O(log n) O(log n) O(log n) O(log n) O(log n)

Heap Fibon.

O(1) O(1) O(log n) * O(log n) * O(log n) * O(1) * O(1)

(71)

Analisi ammortizzata

• Il costo ammortizzato di un’operazione è il costo “medio”

rispetto a una sequenza qualsiasi di operazioni.

• Esempio: se un’operazione ha costo ammortizzato costante e eseguo una sequenza(qualsiasi) di k opearazioni è

possibile che il costo di una singola operazione può non essere costante, ma l’intera sequenza costerà O(k)

• Diverso dal costo medio: non c’è nessuna distribuzione di probabilità (sulla sequenza da eseguire) e l’algoritmo è un algoritmo deterministico

• Molto utile quando si vogliono buone prestazioni sull’intera sequenza e non garanzie sulla singola operazione

– esempio: progettare algoritmi veloci attraverso strutture dati

efficienti

(72)

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati

…per esempio nel nostro caso:

Teorema

Usando un Heap di Fibonacci , una qualsiasi sequenza di n insert, d delete, f findMin, m deleteMin,  increaseKey,

 decreaseKey,  merge prende tempo (nel caso peggiore)

O(n+f+++(d+m+)log n )

(73)

Copyright © 2004 - The McGraw-Hill Companies, srl

Esercizio (di manipolazione)

Creare ed unire 2 Heap Binomiali sui seguenti insiemi:

A 1 ={3,5,7,21,2,4}

A 2 ={1,11,6,22,13,12,23,31}

(74)

Riferimenti

Documenti correlati

Consideriamo ora altri indici di interesse del sistema M/M/1: il numero di utenti presenti nella sola coda del sistema, denotato da w∈N, il numero di utenti presenti nel servente

Come si vede, oltre ad utilizzare un vettore di elementi di tipo tipobaseQueue, vengono utilizzate due variabili, front e rear, che indicano rispettivamente la posizione del

Fermi / teoria dei giochi Plank / teoria quantistica Newton / caduta dei gravi Einstein / teoria della relatività Galileo / metodo sperimentale. "Il cantante Tizio e' un cane;

[r]

Separare i due filetti, stando a filo della car- tilagine centrale, usando un coltello per de- nervare o disossare.. Afferrare la pelle tirandola verso

Posso estrarre gli elementi di ciascun min-heap, in ordine crescente, semplicemente con una sequenza di estrazioni di minimo, ciascuna delle quali ha costo logaritmico..

Le code di priorità possono essere realizzate usando degli heap: a seconda del fatto che sia usato un min- heap o un max-heap, si possono avere code a min-priorità e code

Scrivere la funzione ricorsiva printGreaterKeys(u, a) che, data la radice u di un BST, un valore a di chiave, stampa in ordine tutte le chiavi dell’albero maggiori della chiave