Chapter 19: Fibonacci Heap Many of the slides are from Prof. Leong Hon Wai’s resources at National University of Singapore Priority Queue ADT Priority Queue is an ADT for maintaining a set S of elements, each with a key value and supports the following operations: INSERT(S, x) inserts element x into S (also write as S S {x} MINIMUM(S) returns element in S with min key EXTRACT-MIN(S) removes and returns element in S with min key DECREASE-KEY(S, x, k) decreases the value of element x’s key to a new (smaller) value k. PQ implementations… Many data structures proposed for PQ 1964 Binary Heap J. W. J. Williams 1972 Leftist Heap C. A. Crane 1978 Binomial Heap J. Vuillemin 1984 Fibonacci Heap M. L. Fredman, R. E. Tarjan 1985 Skew Heap 1988 Relaxed Heap D. D. Sleator R. E. Tarjan Driscoll, Gabow Shrairman, Tarjan Different Priority Queues Time Bounds for different PQ implementations n is the number of items in the PQ Data Str INSERT MIN Extract -MIN D-KEY DELETE Union Binary H O(lg n) O(1) O(lg n) O(lg n) O(lg n) O(n) Binomial H O(lg n) O(lg n) O(lg n) O(lg n) O(lg n) O(lg n) O(1) O(1) O(lg n) O(1) O(lg n) O(1) Fibonacci Binary Min-Heap (as in Heapsort) Binary min-heap is an array A[1..n] that can be viewed as a nearly complete binary tree Number the nodes using level order traversal LEFT(i) = 2i and RIGHT(i) = 2i+1 and PARENT(i) = i/2 Height of tree lg n Heap Property: (Each node ≥ its parent node) A[PARENT(i)] A[i] MinHeap – Two views Left (i) = 2i Right (i) = 2i + 1 Array index ::= 1 level order traversal 2 15 8 3 1 2 4 6 A[1..10] 8 5 9 16 3 Parent (i) = i/2 6 12 4 4 9 4 10 12 6 27 8 7 11 Heap Property: for all i A[Parent(i)] A[i] 10 5 10 6 7 8 9 27 11 15 16 10 9 MinHeap – Insert operation (1) HEAP-INSERT(A, key): 1 insert at end of array SIFT-UP to restore HP 2 4 8 3 8 5 9 4 6 12 15 Example: HEAP-INSERT(A, 5) 16 9 27 6 7 5 10 10 Restore heap property with SIFT-UP 1 2 3 4 5 6 7 8 9 10 11 4 6 10 12 8 27 11 15 16 9 5 A[1..10] 11 MinHeap – Insert operation (2) HEAP-INSERT(A, key): 1 insert at end of array SIFT-UP to restore HP 2 4 8 3 5 5 9 4 6 12 15 Example: HEAP-INSERT(A, 5) 16 9 27 6 7 8 10 10 Restore heap property with SIFT-UP 1 2 3 4 5 6 7 8 9 10 11 4 6 10 12 5 27 11 15 16 9 8 A[1..10] 11 MinHeap – Insert operation (3) HEAP-INSERT(A, key): 1 insert at end of array SIFT-UP to restore HP 2 4 8 3 6 5 9 4 5 12 15 Example: HEAP-INSERT(A, 5) 16 9 27 6 7 8 10 10 Restore heap property with SIFT-UP 1 2 3 4 5 6 7 8 9 10 11 4 5 10 12 6 27 11 15 16 9 8 A[1..10] 11 MinHeap – Insert operation (4) HEAP-INSERT(A, key): 1 insert at end of array SIFT-UP to restore HP 2 4 8 3 6 5 9 4 5 12 15 Example: HEAP-INSERT(A, 5) 16 9 27 6 10 7 11 8 10 Done! 1 2 3 4 5 6 7 8 9 10 11 4 5 10 12 6 27 11 15 16 9 8 A[1..10] MinHeap – Insert operation (5) HEAP-INSERT(A, key) ⊳ A is a heap (array) heap-size(A) heap-size(A) + 1 A[heap-size(A)] key SIFT-UP(A, heap-size(A)) THEAP-INSERT(n) = TSIFT-UP(n) + (1) SIFT-UP(A, n) = O(lg n) key A[n] in while i > 1 and A[PARENT(i)] > key do A[i] A[PARENT(i)] i PARENT(i) A[i] key TSIFT-UP(n) = O(h) = O(lg n) (h comparisons, h data-moves) MinHeap – Extract-Min operation (1) HEAP-EXTRACT-MIN(A): 1 Exchange A[1] and A[n] SIFT-DOWN to restore HP 2 4 8 6 3 12 15 8 5 9 4 16 9 27 6 10 10 7 11 A[1] A[1] is is the the minimum. minimum Exchange A[1] with A[n] 1 2 3 4 5 6 7 8 9 10 4 6 10 12 8 27 11 15 16 9 A[1..10] MinHeap – Extract-Min operation (2) HEAP-EXTRACT-MIN(A): 1 Exchange A[1] and A[n] SIFT-DOWN to restore HP 2 4 8 15 3 8 5 9 4 9 6 12 16 4 27 6 10 10 7 11 SIFT-DOWN to restore heap property 1 2 3 4 5 6 7 8 9 10 9 6 10 12 8 27 11 15 16 4 A[1..10] return min MinHeap – Extract-Min operation (3) HEAP-EXTRACT-MIN(A): 1 Exchange A[1] and A[n] SIFT-DOWN to restore HP 2 4 6 9 3 12 5 8 27 6 8 15 1 2 3 4 5 6 7 8 9 6 9 10 12 8 27 11 15 16 A[1..10] 9 16 10 7 11 SIFT-DOWN to restore heap property 10 MinHeap – Extract-Min operation (4) HEAP-EXTRACT-MIN(A): 1 Exchange A[1] and A[n] SIFT-DOWN to restore HP 2 4 8 8 3 12 15 5 9 6 9 27 6 10 7 11 16 Done! 1 2 3 4 5 6 7 8 9 6 8 10 12 9 27 11 15 16 A[1..10] 10 MinHeap – Extract-Min operation (5) HEAP-EXTRACT-MIN(A, key) ⊳ A is a heap (array) min A[1] A[1] A[heap-size(A)] heap-size(A) heap-size(A) 1 SIFT-DOWN(A, 1) TSIFT-DOWN (n) = O(h) = O(lg n) (2h comparisons, h data-moves) THEAP-EXTRACT-MIN (n) = O(lg n) SIFT-DOWN(A, i) while i is not a leaf do let j be the index of min child of i if A[i] > A[j] then exchange A[i] A[j] ij else i heap-size(A)+1 ⊳ make i a leaf MinHeap – Decrease-Key (1) HEAP-DECREASE-KEY(A, i, key): 1 update the key of A[i] SIFT-UP to restore HP 2 4 8 3 8 5 9 4 6 12 15 HEAP-DECREASE-KEY(A,9,3) 16 9 27 6 7 10 1 2 3 4 5 6 7 8 9 10 4 6 10 12 8 27 11 15 16 9 A[1..10] 10 11 MinHeap – Decrease-Key (2) HEAP-DECREASE-KEY(A, i, key): 1 update the key of A[i] SIFT-UP to restore HP 2 4 8 3 8 5 9 4 6 12 15 HEAP-DECREASE-KEY(A,9,3) 3 9 27 6 7 11 10 Restore heap property with SIFT-UP 1 2 3 4 5 6 7 8 9 10 4 6 10 12 8 27 11 15 3 9 A[1..10] 10 MinHeap – Decrease-Key (3) HEAP-DECREASE-KEY(A, i, key): 1 update the key of A[i] SIFT-UP to restore HP 2 4 8 3 8 5 9 4 6 3 15 HEAP-DECREASE-KEY(A,9,3) 12 9 27 6 7 10 1 2 3 4 5 6 7 8 9 10 4 6 10 3 8 27 11 15 12 9 A[1..10] 10 11 MinHeap – Decrease-Key (4) HEAP-DECREASE-KEY(A, i, key): 1 update the key of A[i] SIFT-UP to restore HP 2 4 8 3 8 5 9 4 3 6 15 HEAP-DECREASE-KEY(A,9,3) 12 9 27 6 7 10 1 2 3 4 5 6 7 8 9 10 4 3 10 6 8 27 11 15 12 9 A[1..10] 10 11 MinHeap – Decrease-Key (5) HEAP-DECREASE-KEY(A, i, key): 1 update the key of A[i] SIFT-UP to restore HP 2 4 8 3 8 5 9 3 4 6 15 HEAP-DECREASE-KEY(A,9,3) 12 9 27 6 10 7 11 10 DONE ! 1 2 3 4 5 6 7 8 9 10 3 4 10 6 8 27 11 15 12 9 A[1..10] MinHeap – Insert operation (6) HEAP-DECREASE-KEY (A, i, key) ⊳ Update A[i] to key A[i] key SIFT-UP(A, i) TDECREASE-KEY(n) = TSIFT-UP(n) + (1) = O(lg n) (h comparisons, h data-moves) Binary Heap (Summary) HEAP-MINIMUM(A) return root O(1) HEAP-INSERT(A, x) append to end, sift-up O(lg n) HEAP-EXTRACT-MIN(A) Replace root, sift-down O(lg n) HEAP-DECREASE-KEY(A, i, k) update key, sift-up O(lg n) What about HEAP-DELETE(A, i) HEAP-MELD(A, B) How about Union? A mergeable heap is any data structure that supports the basic heap operation plus union Union (H1, H2) creates and returns a new heap Other Heaps Binomial Trees Recursive definition: Bk Bk B0 Bk1 B2 Bk1 Bk1 Some examples: B0 B1 B2 B3 B4 B1 B0 Properties of Binomial Trees For a Binomial Tree Bk (of order k) 1. 2. 3. 4. there are 2k nodes, the height of the tree is k, root has degree k and deleting the root gives binomial trees B0, B1, …, Bk1 Proof: (DIY, by induction) depth 0 1 2 3 B0 B1 B2 B3 B4 4 Defining Property of Binomial Trees k There are exactly i nodes at depth i, (0 i k) depth B4 Nodes 0 1 1 4 2 6 3 4 4 1 Binomial Heap (Vuillemin, 1978) A sequence of binomial trees that satisfy binomial heap property (each tree Bk is a min-heap) 0 or 1 binomial tree Bk of order k, There are at most lg n + 1 binomial trees. Eg: A binomial heap H with n = 11 nodes. head[H] 18 3 6 37 48 11 = (1011)2 29 10 31 17 50 B0 B1 B3 44 Representing Binomial Heaps (1) Each node x stores key[x] degree[x] p[x] child[x] sibling[x] parent key 10 1 degree sibling (3 pointers per node) child Representing Binomial Heap (2) head[H] 18 3 6 37 48 29 10 31 17 44 50 head[H] 18 0 Each node x has p[x] child[x] sibling[x] degree[x], key[x] 3 1 37 0 48 1 50 2 29 2 10 1 31 0 17 0 6 3 44 0 The Binomial Heap: It’s actual implementation Operations on a Binomial Heap MAKE-BINOMIAL-HEAP(H) Allocate object H, make head[H] = NIL. (1). BINOMIAL-HEAP-MINIMUM(H) Search the root list for minimum. O(lg n). head[H] 18 3 6 37 48 29 10 31 17 50 B0 B1 B3 44 Linking Step: Fundamental Op BINOMIAL-LINK (y, z) y z Bk1 Bk1 Assume z y Linking step z y Bk1 Bk1 BINOMIAL-LINK (y, z) ⊳ Assume z y p[y] z sibling[y] child[z] Constant time O(1) child[z] y degree[z] degree[z] + 1 Binomial Heap Union 8 30 45 + 32 23 24 22 48 29 10 31 17 6 3 44 37 15 7 33 25 50 28 55 41 19 + 7 = 26 + 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 18 12 Binomial Heap Union 8 30 45 + 55 32 23 24 22 48 29 10 31 17 6 3 44 37 15 7 33 25 50 28 41 18 12 12 Binomial Heap Union 8 30 45 + 55 32 23 24 22 48 29 10 31 17 18 6 3 44 37 15 7 33 25 50 28 41 18 12 7 3 12 37 18 25 8 30 45 + 55 32 23 24 22 48 29 10 31 17 6 3 44 37 15 7 33 25 50 28 41 12 18 18 12 3 28 15 7 33 25 37 7 3 12 37 18 25 41 8 30 45 + 55 32 23 24 22 48 29 10 31 17 6 3 44 37 15 7 33 25 50 28 41 12 18 18 12 3 28 15 7 33 25 37 7 3 12 37 18 25 41 8 30 45 + 32 23 24 22 48 29 10 31 17 6 3 44 37 15 7 33 25 50 28 55 41 28 41 15 7 33 25 3 12 37 18 18 12 3 28 15 7 33 25 37 7 3 12 37 18 25 41 8 30 45 + 32 23 22 24 48 29 10 31 17 6 3 44 37 15 7 33 25 50 28 55 41 6 8 45 55 30 23 32 24 22 48 50 29 10 31 17 44 28 41 15 7 33 25 3 12 37 18 18 12 Binomial Heap Union MAKE-BINOMIAL-HEAP-UNION (H1, H2) : Create a heap H that is the union of two heaps H1 and H2 Analogous to binary addition of n1 and n2 Running time.: O(log n) [n = n1 + n2] Prop to # of trees in root lists 2( log2 n + 1). 19 + 7 = 26 + 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 More Operations (1) BINOMIAL-HEAP-INSERT(H, x) Create a one-item (x) binomial heap H1 and then union H and H1. O(lg n). BINOMIAL-HEAP-EXTRACT-MIN(H) Find minimum, remove root, then union. O(lg n). head[H] 18 3 6 37 48 29 10 31 17 50 B0 B1 B3 44 More Operations (2) BINOMIAL-HEAP-DECREASE (H, x, k) BINOMIAL-HEAP-DELETE (H, x) head[H] 18 3 6 37 48 29 10 31 17 50 B0 B1 B3 44 Binomial Heaps (Summary) MINIMUM(H) O(lg n) UNION(H1, H2) O(lg n) INSERT(H, x) O(lg n) EXTRACT-MIN(H) O(lg n) DECREASE-KEY (H, x, k) O(lg n) DELETE (H, x) O(lg n) Binomial Fibonacci Heaps Key advantages of Binomial Heap Elegant and fast – O(lg n) But, it takes O(lg n) to “maintain” the elegant structure all the time. Fibonacci Heaps Want fast INSERT, DECREASE-KEY Be lazy… Do as little as possible, until there is no choice. Relax the structure slightly Fibonacci Heap (Fredman & Tarjan) Modified from Binomial Heaps With following relaxations… Set of heap-ordered trees Any number of trees of each rank Trees are doubly-linked, but not ordered min[H] 7 30 24 26 35 23 46 17 marked nodes H 3 18 39 52 41 44 Representing Fibonacci Heaps (1) Each node x stores key[x] degree[x] (also rank(x)) mark[x] p[x] child[x] key, degree left[x] left right [x] (4 pointers per node) parent 10 1 FALSE mark right child Representing Fibonacci Heaps (2) min[H] 7 30 24 26 23 17 46 3 18 35 52 41 44 39 min[H] 7 30 24 26 35 23 46 17 3 18 H 39 52 41 44 Properties and Potential Function Properties of FIB-HEAP H: Mark(x) = TRUE (marked, black in my notes), (yellow in notes) n[H] = number of nodes in H t(H) = number of trees in H m(H) = number of marked notes in H FALSE Potential Function for Amortized Analysis (H) = t(H) + 2 m(H) . 7 n[H] = 14 t(H) = 5 m(H) = 3 30 24 26 35 23 46 min[H] 17 3 18 H 39 52 41 44 Operations on a Fibonacci Heap MAKE-FIB-HEAP(H) Allocate object H, make min[H] = NIL. (1). FIB-HEAP-MINIMUM(H) min[H] points to minimum element. O(1). min[H] 7 n[H] = 14 t(H) = 5 m(H) = 3 30 24 26 35 23 46 17 3 18 H 39 52 41 44 Lazy Operation: INSERT (1) FIB-HEAP-INSERT(H, x) Be lazy: Create singleton tree with node x 21 Eg: Insert 21 min[H] 7 n[H] = 14 t(H) = 5 m(H) = 3 30 24 26 35 23 46 17 3 18 H 39 52 41 44 Lazy Operation: INSERT (2) FIB-HEAP-INSERT(H, x) Be lazy: Create singleton tree with node x Concatenate x with root list of H Update min[H], n[H]. Eg: Insert 21 min[H] 7 n[H] = 15 14 t(H) = 65 m(H) = 3 30 24 26 35 23 46 17 21 3 18 H 39 52 41 44 Pseudocode for INSERT FIB-HEAP-INSERT (H, x) O(1) Worst case time = O(1) degree[x] 0 Amortized time = O(1) p[x] NIL child[x] NIL left[x] x right[x] x mark[x] FALSE concatenate the root list containing x with root list H if min[H] = NIL or key[x] < key[min[H]] then min[H] x n[H] n[H] + 1 Amortized Time of INSERT: c’(H) = c(H) + (H’) (H) = O(1) + 1 = O(1) Lazy Operations: MELD FIB-HEAP-MELD(H1, H2) Concatenate the two root lists Update min[H], n[H] min[H2] min[H1] 7 n[H1] = 7 t(H1) = 3 m(H1) = 1 30 24 26 35 46 H1 23 17 n[H2] = 7 t(H2) = 2 m(H2) = 2 3 18 52 41 39 H2 44 Lazy Operations: MELD FIB-HEAP-MELD(H1, H2) Concatenate the two root lists Update min[H], n[H] min[H] 7 n[H] = 14 t(H) = 5 m(H) = 3 30 24 26 35 23 46 17 3 18 H 39 52 41 44 What have we got now? With lazy INSERT and MELD, We have a doubly-linked list, with pointer to minimum… ( So, when do we need to do real work? ) Linking Step: Fundamental Op FIB-HEAP-LINK (H, y, x) y x Linking step x y Assume z y FIB-HEAP-LINK (H, y, x) ⊳ Assume x y remove y from the root list of H make y a child of x, incrementing degree[x] mark[z] FALSE Constant time O(1) DELETE-MIN Operation (1) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list min[H] 7 n[H] = 14 t(H) = 5 m(H) = 3 30 24 26 35 23 46 17 3 18 H 39 52 41 44 DELETE-MIN Operation (2) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Then what? Where is the new minimum? min[H] ? 7 n[H] = 13 t(H) = 7 m(H) = 3 30 24 26 35 23 46 17 18 39 H 52 41 44 DELETE-MIN Operation (3) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 2 3 current min 7 n[H] = 13 t(H) = 7 m(H) = 3 30 24 26 35 23 46 17 18 39 H 52 41 44 DELETE-MIN Operation (4) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 2 3 current min 7 n[H] = 13 t(H) = 7 m(H) = 3 30 24 26 35 23 46 17 18 39 H 52 41 44 DELETE-MIN Operation (5) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 2 3 min 7 n[H] = 13 t(H) = 7 m(H) = 3 30 24 26 35 46 23 current H 17 18 39 52 41 44 DELETE-MIN Operation (5) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 3 current min 7 n[H] = 13 t(H) = 7 m(H) = 3 2 30 24 26 35 23 46 17 18 39 H 52 41 44 Link 17 and 23 (degree 0) DELETE-MIN Operation (6) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 3 current min 7 n[H] = 13 t(H) = 6 m(H) = 3 2 30 24 26 35 17 46 23 H 18 39 52 41 44 Link 17 and 7 (degree 1) DELETE-MIN Operation (7) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 n[H] = 13 t(H) = 5 m(H) = 3 26 35 7 46 17 H 23 3 current min 24 2 30 18 39 52 41 44 Link 7 and 24 (degree 2) DELETE-MIN Operation (8) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 min 26 35 24 17 H 46 23 3 current 7 n[H] = 13 t(H) = 4 m(H) = 3 2 30 18 39 52 41 44 DELETE-MIN Operation (9) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 7 26 35 24 17 H 46 23 3 current min n[H] = 13 t(H) = 4 m(H) = 3 2 30 18 39 52 41 44 DELETE-MIN Operation (10) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 2 3 current min 7 n[H] = 13 t(H) = 4 m(H) = 3 26 35 24 17 H 46 23 30 18 39 52 41 44 DELETE-MIN Operation (11) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 2 3 current min 7 n[H] = 13 t(H) = 4 m(H) = 3 24 26 35 H 46 17 23 30 18 39 52 41 44 Link 41 and 18 (degree 1) DELETE-MIN Operation (12) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) 0 1 2 3 current min 7 n[H] = 13 t(H) = 3 m(H) = 3 24 26 35 H 46 17 18 52 41 30 DONE ! 23 44 39 DELETE-MIN Operation (13) FIB-HEAP-DELETE-MIN(H) Delete the min and concatenate its children into root list Consolidate trees (so that no two roots of same degree) min[H] Final outcome 7 n[H] = 13 t(H) = 3 m(H) = 3 26 35 24 17 46 23 18 52 41 30 H 44 39 Analysis of DELETE-MIN Notations: Let H be the heap before DELETE-MIN op; t(H) is number of trees in H; D(n) is max degree in any n-node FH k linking steps are done during consolidation Steps in DELETE-MIN Remove min node x Concat children of x to root list Initialize ptr data structure A Consolidation step… TOTAL: # trees Cost O(1) O(D(n)) O(D(n)) O(D(n)+k) O(D(n)+k) Amortized Time: c’(H) = c(H) + = O(D(n)) t(H) t(H)+D(n)1 t(H)+D(n)1k = D(n)1k Show later that D(n) = O(lg n) What have we got now? (2) With Mergeable Heap Operations, i.e., INSERT and MELD, DELETE-MIN can show that all the tree in H are actually Binomial Trees ! ( Now, how about DECREASE-KEY? ) DECREASE-KEY Operation (1-1) FIB-HEAP-DECREASE-KEY(H, x, k) [1st example: case 1] Decrease key of x to k Cut off x from its parent, min[H] 7 n[H] = 16 t(H) = 3 m(H) = 3 35 24 17 26 46 45 30 88 72 23 21 18 38 39 41 52 Decrease 45 to 16 DECREASE-KEY Operation (1-2) FIB-HEAP-DECREASE-KEY(H, x, k) [1st example: case 1] Decrease key of x to k Cut off x from its parent, insert x into root list, update min[H] min[H] 7 n[H] = 16 t(H) = 3 m(H) = 3 35 24 17 26 46 16 30 88 72 23 21 18 38 39 41 52 Decrease 45 to 16 DECREASE-KEY Operation (1-3) FIB-HEAP-DECREASE-KEY(H, x, k) [1st example: case 1] Decrease key of x to k Cut off x from its parent, insert x into root list, update min[H] If p[x] is not marked, mark p[x] min[H] 7 46 16 72 Mark p[x] n[H] = 16 t(H) = 4 m(H) = 43 24 26 30 Done ! 35 88 17 23 21 18 38 39 41 52 Decrease 45 to 16 DECREASE-KEY Operation (2-1) FIB-HEAP-DECREASE-KEY(H, x, k) [2nd example: case 2] Decrease key of x to k Cut off x from its parent, insert x into root list, update min[H] min[H] 7 46 16 24 72 n[H] = 16 t(H) = 4 m(H) = 4 26 35 88 17 30 23 21 18 38 39 41 52 Decrease 35 to 4 DECREASE-KEY Operation (2-2) FIB-HEAP-DECREASE-KEY(H, x, k) [2nd example: case 2] Decrease key of x to k Cut off x from its parent, insert x into root list, update min[H] If p[x] is marked, then cut off p[x], unmark, insert… min[H] 46 16 72 n[H] = 16 t(H) = 5 m(H) = 4 4 7 p[x] is marked 26 88 24 17 30 23 21 18 38 39 41 52 Decrease 35 to 4 DECREASE-KEY Operation (2-3) FIB-HEAP-DECREASE-KEY(H, x, k) [2nd example: case 2] Decrease key of x to k Cut off x from its parent, insert x into root list, update min[H] If p[x] is marked, then cut off p[x], unmark, insert… REPEAT min[H] 46 16 72 n[H] = 16 t(H) = 6 m(H) = 3 4 26 88 7 24 p[p[x]] is marked 17 30 23 21 18 38 39 41 52 Decrease 35 to 4 DECREASE-KEY Operation (2-4) FIB-HEAP-DECREASE-KEY(H, x, k) [2nd example: case 2] Decrease key of x to k Cut off x from its parent, insert x into root list, update min[H] If p[x] is marked, then cut off p[x], unmark, insert… REPEAT min[H] 46 16 72 n[H] = 16 t(H) = 7 m(H) = 2 4 26 24 88 7 17 30 23 21 18 38 39 41 52 Done ! Decrease 35 to 4 Analysis of DECREASE-KEY Notations: Let H be the heap before DECREASE-KEY op; t(H) is number of trees in H; m(H) is # marked nodes in H c cascading cuts are done in total Steps in DECREASE-KEY Decrease key of x Cascading cuts (unmark) Mark final parent node TOTAL: Amortized Time: c’(H) = c(H) + = O(1) Cost # trees O(1) O(c) O(1) O(c) t(H) t(H)+c t(H)+c # mark m(H) m(H)c+1 m(H)c+2 = c + 2(2c) = (4 c ) Viola !! DELETE Operation FIB-HEAP-DELETE(H, x) DECREASE-KEY(H, x, ) DELETE-MIN(H) Amortized Time: O(D(n)) min[H] 7 n[H] = 14 t(H) = 5 m(H) = 3 30 24 26 35 23 46 17 3 18 H 39 52 41 44 Bounding the Maximum Degree D(n) ::= maximum degree in any FIB-HEAP with n nodes Shall prove that D(n) lg n = O(lg n) where = (1+5)/2 = 1.61803 [golden ratio] and lg n = 1.44 lg n Bounding D(n) (1) Lemma 1: Let x be any node in FIB-HEAP with degree[x] = k. Let y1, y2,…, yn be children of x in the order in which they are linked to x (from earliest to latest). Then x degree[y1] 0 and degree[yi] i2 for i=2, … ,k. … yk … yi y2 y1 Proof: When yi was linked to x, degree[x] = i1 since all of y1, y2,…, yi1 were already children of x. Thus, degree[yi] = degree[x] = i1 at the time of linking. In addition, yi could lose at most 1 child, so degree[yi] i2 Bounding D(n) (2) To bound D(n), two possible approaches: 1. For a given size n, what is the maximum degree[x] ? 2. For a given degree k, what is the smallest size ? Define sk ::= minimum size of a tree of degree k in a FH. & let fk be such a minimal degree-k tree. f0 f1 f2 f3 f0 f0 Fibonacci numbers x f4 f2 f1 … yk … yi y2 y1 Bounding D(n) (3) Lemma: Let x be node in FH, and degree[x]=k. Then, size(x) sk Fk+2 k . Proof: First some small values: s0 = 1, s1 = 2, s2 = 3 General Case: x … yk … yi y2 y1 f0 f1 f2 k sk 1 sdeg[ yk ] Then show: i 1 Fk+2 = 1 + (F0+F1+…+Fk) k Fk+2 k sk 2 si 2 i 2 sk Fk+2 Corollary: D(n) lgn = 1.44 lg n = O(lg n) Fibonacci Heaps (Summary) MINIMUM(H) O(1) UNION(H1, H2) O(1) INSERT(H, x) O(1) EXTRACT-MIN(H) O(lg n)* DECREASE-KEY (H, x, k) O(1)* DELETE (H, x) O(lg n)*