La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Code a priorità (Heap) Definizione Heapify (mantenimento coda a priorità) Costruire un Heap Insert, Maximum e Extract-Max.

Presentazioni simili


Presentazione sul tema: "Code a priorità (Heap) Definizione Heapify (mantenimento coda a priorità) Costruire un Heap Insert, Maximum e Extract-Max."— Transcript della presentazione:

1 Code a priorità (Heap) Definizione Heapify (mantenimento coda a priorità) Costruire un Heap Insert, Maximum e Extract-Max

2 Coda a priorità (Heap) Una coda a priorità può essere rappresentato da un albero binario completo. La chiave del padre è sempre maggiore di quella dei figli: key(i) key(parent(i)) Albero binario completo: Sono riempiti tutti i livelli eccetto possibilmente lultimo. Altezza=Θ(log(n)) Coda a priorità: Il nodo a maggiore priorità (con la chiave più grande) sta in cima. Nota: si può ragionare in maniera analoga quando si pone che key(i) key(parent(i))

3 Heap tramite un Array Una coda a priorità può essere implementato tramite unarray (A). A[PARENT(i)] A[i] length[A] heap-size[A] n … PARENT(j) 1. return LEFT(i) 1. return 2i RIGHT(i) 1. return 2i+1 A

4 Heapify (mantenimento coda a priorità) Si sistema lelemento A[i]: si suppone gli alberi con radice LEFT(i) e RIGHT(i) siano degli Heap. A[i] HEAP RIGHT[i] LEFT[i]

5 Heapify (mantenimento coda a priorità) Si sistema lelemento A[i]: si suppone gli alberi con radice LEFT(i) e RIGHT(i) siano degli Heap. HEAPIFY(A,i) // sistema A[i] nel Heap 1. l LEFT(i)// figlio sx 2. r RIGHT(i) // figlio dx 3. if l heap-size[A] and A[l] > A[i]// cerca il maggiore fra padre e 4. then magg l// i due figli (se ci sono…) 5. else magg i 6.if r heap-size[A] and A[r] > A[magg] 7. then magg r 8.if magg i// il magg è uno dei due figli… 9. then scambia A[i] A[magg] 10. HEAPIFY(A,magg)

6 Esempio Heapify Allinizio si chiama HEAPIFY(A,2) i i

7 Esempio Heapify Il costo in termine di tempo è nel caso peggio laltezza dellalbero. O(h) = O(log(n)) i

8 Costruire lHeap Il costo di HEAPIFY è O(log(n)) e viene chiamato O(n) volte. Quindi un limite del caso peggiore è O(n log(n)). In realtà, il caso peggiore può essere stimato come O(n). BUILD-HEAP(A) // strategia bottom-up: dal basso verso lalto 1. heap-size[A] length[A]// 2. for i length[A]/2 downto 1// dalla metà in su 3. do HEAPIFY(A,i)// sotto la metà sono tutte foglie =2 Rappresenta il massimo numero di sottoalberi pieni ad altezza h (avendo a disposizione n elementi)

9 Esempio costruzione Heap i i A Si comincia da qua Foglie

10 Esempio costruzione Heap i i Strategia button-up: dal basso verso lalto si chiama HEAPIFY su tutte i nodi interni.

11 Esempio costruzione Heap i Strategia button-up: dal basso verso lalto si chiama HEAPIFY su tutte i nodi interni.

12 Altre operazioni MAXIMUM(A): ritorna lelemento a massima priorità, ossia quello in cima. EXTRACT-MAX(A): estrae lelemento a massima priorità, successivamente lHeap andrebbe sistemato INSERT(A): inserisce un nuovo elemento nel Heap.

13 MAXIMUM e EXTRACT-MAX MAXIMUM(A) ha un tempo di esecuzione costante, O(1) EXTRACT-MAX(A) // Estrae elemento a maggiore priorità 1.if heap-size[A] < 1 // heap vuoto? 2. then error heap underflow 3.max A[1]// memorizza elem. In cima 4.A[1] A[heap-size[A]]// metti lultimo elemento in cima 5.heap-size[A] heap-size[A] – 1// heap diminuisce di 1 elem. 6.HEAPIFY(A,1)// HEAPIFY sul 1° elem. 7.return max// restituisci lelem. a magg. priorità MAXIMUM(A) // restituisci lelem. a magg. priorità, 1.return A[1] // ossia quello in cima EXTRACT-MAX(A) ha un tempo di esecuzione O(log(n)), dovuto alla chiamata HEAPIFY().

14 HEAP-INSERT HEAP-INSERT(A, key) // Inserisci elemento nellHeap 1.heap-size[A] heap-size[A] + 1 // aumenta Heap di 1 elemento 2.i heap-size[A] // inizia dallelem. inserito (ultimo) 3.while i > 1 and A[PARENT(i)]

15 Inserimento in un Heap i HEAP-INSERT(A, 15) key=15 LHeap viene aumentato di un elemento. Si procede poi a risalire lalbero per trovare il suo posto i 7 Nuovo elemento key = 15

16 Inserimento in un Heap i HEAP-INSERT(A, 15) key=15 LHeap viene aumentato di un elemento. Si procede poi a risalire lalbero per trovare il suo posto

17 Considerazioni La struttura dati Heap gestisce una coda a priorità. Viene estratto lelemento a maggiore priorità (es. quello con chiave maggiore) Si può invertire la relazione con il padre, se key(i) key(parent(i)). –In questo caso lelemento a maggiore priorità è lelemento più piccolo Heap-sort: algoritmo di ordinamento che usa un Heap. Si estrae ogni volta lelemento più piccolo fino ad ottenere un vettore ordinato. Tempo O(n log(n)).


Scaricare ppt "Code a priorità (Heap) Definizione Heapify (mantenimento coda a priorità) Costruire un Heap Insert, Maximum e Extract-Max."

Presentazioni simili


Annunci Google