Fibonacci heaps are a priority queue data structure achieving O(1) amortized time for insert, find-min, decrease-key, and merge, with O(log n) amortized time for delete-min. The decrease-key in O(1) amortized time (versus O(log n) for binary heaps) is the critical improvement: it makes Dijkstra's algorithm run in O(m + n log n) and Prim's algorithm run in O(m + n log n), both optimal for dense graphs. The analysis uses the potential method of amortized analysis, where the potential function Phi = t(H) + 2*m(H) counts the number of root-list trees plus twice the number of marked nodes. The three pillars of amortized analysis — aggregate, accounting, and potential methods — are unified through Fibonacci heaps as their most sophisticated application.
Amortized analysis is one of the most important analytical frameworks in data structure design. The core idea is that the cost of individual operations can be misleading — some operations are expensive, but they can only occur after many cheap operations that "pay" for the expensive one. The amortized cost of each operation is the average cost per operation over a worst-case sequence, and it is always an upper bound on the true average cost. The three methods (aggregate, accounting, potential) are different lenses on the same concept. The aggregate method simply sums the total cost and divides by the number of operations. The accounting method assigns credits: cheap operations are overcharged, and the excess credit pays for expensive operations. The potential method abstracts this into a state function, where amortized cost equals actual cost plus the change in potential.
Fibonacci heaps are the quintessential application of the potential method. A Fibonacci heap is a collection of heap-ordered trees (each node's key is at most its children's keys) with a pointer to the minimum. Insert simply adds a new single-node tree to the root list in O(1). Merge concatenates two root lists in O(1). The subtlety is in decrease-key and delete-min. Decrease-key reduces a node's key and, if the heap property is violated, cuts the node from its parent and adds it to the root list. If the parent was already marked (meaning it previously lost a child), a cascading cut removes the parent too, continuing up the tree. This cascading cut can touch many nodes, but the potential method shows the amortized cost is O(1): each cascading cut releases potential (by unmarking a node, reducing 2*m(H) by 2) that pays for the actual work.
Delete-min is the expensive operation: it removes the minimum, adds its children to the root list, then consolidates the root list by linking trees of equal degree until no two roots have the same degree. Consolidation takes O(D(n) + t) time, where t is the number of root-list trees before consolidation and D(n) is the maximum degree of any node. The potential method absorbs the t term (the potential drops by t - D(n) - 1 during consolidation), yielding O(D(n)) amortized cost. The Fibonacci number argument bounds D(n) = O(log n): a degree-k node has at least F_{k+2} >= phi^k descendants (because children are only removed one at a time before cascading cuts trigger), so k <= log_phi(n).
The practical impact of Fibonacci heaps is the O(m + n log n) bound for Dijkstra's and Prim's algorithms on graphs with m edges and n vertices. With binary heaps, both algorithms run in O(m log n), because each of the m decrease-key operations costs O(log n). Fibonacci heaps reduce this to O(1) per decrease-key, saving a logarithmic factor on the dominant term. For dense graphs (m = Theta(n^2)), this is the difference between O(n^2 log n) and O(n^2) — asymptotically optimal since you must read all edges. While practical implementations often use pairing heaps (which have similar empirical performance without the complex marking machinery), the theoretical significance of Fibonacci heaps is undeniable: they demonstrated that the potential method, carefully applied, could yield bounds that seemed impossible from a worst-case perspective.
No topics depend on this one yet.