Skip to content

Fibonacci Heap — Mathematical Foundations and Complexity Theory

Audience: researcher, staff engineer, competitive programmer. Prerequisite: comfort with amortised analysis (accounting / potential method), binomial heaps, and the Fibonacci recurrence.

The Fibonacci heap, introduced by Fredman and Tarjan (FOCS 1984, journal version JACM 1987), is the data structure that brought Dijkstra and Prim down to O(m + n log n). Its asymptotic crown rests on two non-obvious pillars: a forest whose tree shapes can be arbitrarily unbalanced, and an amortisation argument that pays for that laziness using a single integer counter — the mark bit. This file establishes the structure formally, proves its degree bound, derives every amortised cost step by step, and then steps outside the structure to survey the lineage of follow-up work (rank-pairing heaps, strict Fibonacci heaps, the Brodal queue) that achieved what Fredman–Tarjan could not.

Table of Contents

  1. Formal Definition — F-heap as a forest with cascading-cut bookkeeping
  2. The Degree Bound — F_{k+2} ≤ size(node of degree k); proof via cascading-cut invariant
  3. Loop Invariants for consolidate
  4. Amortised Analysis via the Potential Function Φ = #roots + 2·#marked
  5. Per-Operation Amortised Costs (insert / meld / decrease-key / extract-min / delete)
  6. Why decrease-key Bound Drops to Ω(log n) Without Cascading Cuts
  7. Lower Bound and the Brodal–Lagogiannis–Tarjan O(1) Worst-Case Heap
  8. Successor Structures — Rank-pairing heap, Strict Fibonacci heap, Brodal queue
  9. Comparison Matrix (asymptotics + constants)
  10. Open Problems
  11. Summary

1. Formal Definition

A Fibonacci heap (F-heap) H over a totally ordered key universe K is a tuple

H = (F, min, n)

where

  • F is a forest of min-ordered rooted trees. For every node x with parent p(x), key(p(x)) ≤ key(x).
  • min : F → V(F) is a pointer to the root of minimum key (ties broken arbitrarily).
  • n is the number of nodes.

Each node x ∈ V(F) carries the record

node x {
    key       : K
    parent    : node?           // null at roots
    child     : node?           // pointer to one arbitrary child
    left,right: node            // doubly linked, circular, list of siblings
    degree    : ℕ               // number of children
    mark      : {0,1}           // has x lost a child since it last became a child of someone?
}

The root list and every child list are circular doubly linked, which yields O(1) splice and unsplice. The choice of which child the child pointer references is arbitrary; structural invariants are preserved under any rotation of the child list.

Structural invariants

  1. Heap order. For every edge (p, c), key(p) ≤ key(c).
  2. Mark semantics. A node x is marked iff x is not a root and x has lost exactly one child since it became a child of its current parent. A node loses its mark the moment it is re-parented (i.e., cut and inserted into the root list).
  3. Min invariant. key(min) = min_{r ∈ roots(F)} key(r). The minimum always sits in the root list.

The forest itself can be arbitrarily unbalanced between consolidations; the bound D(n) = O(log n) on maximum degree is a consequence of the invariants, not part of the definition.


2. The Degree Bound

Theorem (Fredman–Tarjan, 1987). Let x be any node of an F-heap with degree(x) = k. Then size(x) ≥ F_{k+2}, where F_i is the i-th Fibonacci number with F_1 = F_2 = 1. Corollary. D(n) ≤ ⌊log_φ n⌋, where φ = (1+√5)/2 ≈ 1.618. Therefore D(n) = O(log n).

The proof proceeds in two stages: first a structural lemma about cascading cuts, then a Fibonacci-style recurrence.

Lemma 1 (Child-degree-after-cut lemma)

Let y_1, y_2, …, y_k be the children of a node x, ordered by the time they were linked to x (oldest first). Then

degree(y_1) ≥ 0,
degree(y_i) ≥ i − 2     for i ≥ 2.

Proof. When y_i was linked to x, the link operation in consolidate only links two roots that have the same degree. Just before that link, x already had children y_1, …, y_{i-1}, so degree(x) ≥ i − 1 at that moment, and thus degree(y_i) ≥ i − 1 at the moment of linking.

Since then, y_i may have lost at most one child without being cut (the second loss would have triggered a cascading cut, severing y_i from x). Therefore degree(y_i) ≥ (i − 1) − 1 = i − 2. ∎

The cascading-cut mechanism is precisely what makes the "lost at most one" clause hold; without it, an attacker could shave arbitrarily many children off y_i while keeping it attached.

Lemma 2 (Size lower bound)

Let s_k = min { size(x) : degree(x) = k }. Then

s_0 = 1,
s_1 = 2,
s_k ≥ 2 + Σ_{i=2}^{k} s_{i−2}     (k ≥ 2).

Proof. Consider any x of degree k. Its children are y_1, …, y_k. Then

size(x) ≥ 1                 // x itself
       + 1                 // y_1, which is at least a single node
       + Σ_{i=2}^{k} size(y_i)
       ≥ 2 + Σ_{i=2}^{k} s_{degree(y_i)}
       ≥ 2 + Σ_{i=2}^{k} s_{i-2}

using Lemma 1. ∎

Lemma 3 (Fibonacci closed form)

Define F_1 = F_2 = 1, F_{k+2} = F_{k+1} + F_k. Then F_{k+2} = 1 + Σ_{i=0}^{k} F_i.

Proof. By induction on k. Base k=0: F_2 = 1 = 1 + F_0, where F_0 = 0. Step:

1 + Σ_{i=0}^{k+1} F_i = (1 + Σ_{i=0}^{k} F_i) + F_{k+1}
                     = F_{k+2} + F_{k+1}
                     = F_{k+3}.   ∎

Putting it together

By induction on k, s_k ≥ F_{k+2}. Bases: s_0 = 1 = F_2, s_1 = 2 = F_3. Step:

s_k ≥ 2 + Σ_{i=2}^{k} s_{i-2}
    = 2 + Σ_{j=0}^{k-2} s_j
    ≥ 2 + Σ_{j=0}^{k-2} F_{j+2}
    = 2 + (F_2 + F_3 + … + F_k)
    = 1 + (F_0 + F_1 + … + F_k)        // since F_0 = 0, F_1 = 1
    = F_{k+2}.

Since F_{k+2} ≥ φ^k, we conclude D(n) ≤ log_φ n. The constant 1/log φ ≈ 1.4404, so the maximum degree is roughly 1.44 · log_2 n.


3. Loop Invariants for consolidate

The consolidate routine is the only place where the degree bound is enforced. It maintains an auxiliary array A[0..D(n)] mapping each degree to at most one root.

procedure consolidate(H):
    let D = ⌊log_φ n⌋
    let A[0..D] = (null, null, …, null)
    let R = snapshot of root list of H            // freeze iteration order
    for w in R:                                   // i ranges over 0..|R|-1
        x = w
        d = degree(x)
        while A[d] ≠ null:
            y = A[d]
            if key(x) > key(y): swap(x, y)
            link(y, x)                            // y becomes child of x; degree(x) increases
            A[d] = null
            d = d + 1
        A[d] = x
    rebuild root list and min pointer from A

Invariants

Let R = (r_0, r_1, …, r_{m-1}) be the frozen root-list snapshot, and let R_i = {r_0, …, r_{i-1}} be the prefix already processed.

Invariant I1 (uniqueness). At the start of iteration i, for every degree d ∈ [0, D], A[d] is either null or a tree root whose subtree's nodes are a subset of R_i.

Invariant I2 (degree-d-collision absorption). At any point during the inner while loop, both x and A[d] have degree d. After the link, x has degree d+1, and A[d] is cleared. The loop continues until either d > D (impossible by the degree bound) or A[d] is null.

Invariant I3 (root-set partition). At the start of iteration i, { r in current root list of H } = { A[d] : A[d] ≠ null } ∪ { r_i, r_{i+1}, …, r_{m-1} }, i.e., processed roots have all been folded into A.

Invariant I4 (heap order preservation). Every link(y, x) preserves heap order because the call site guarantees key(x) ≤ key(y).

Termination of inner loop. Each iteration of while A[d] ≠ null increments d by exactly 1 and consumes one slot of A. Since d ≤ D = O(log n), the inner loop runs at most D+1 times per outer iteration, and total work is O(|R| + D).

Post-condition. After all iterations, every root in H has a distinct degree, so the root list contains at most D(n)+1 ≤ log_φ n + 1 roots.


4. Amortised Analysis via the Potential Function

Define the potential

Φ(H) = t(H) + 2·m(H)

where t(H) = |root list| and m(H) = #{ x : mark(x) = 1 }.

Φ ≥ 0 at all times, and Φ(∅) = 0, so for any sequence of operations the amortised cost upper-bounds the actual cost up to the final Φ, which is non-negative — we never overcharge.

The amortised cost of an operation is ĉ = c + ΔΦ.

The factor 2 on marks is chosen precisely so that cascading cuts pay for themselves: each cascading cut releases one mark (saves 2 units of potential) while costing 1 unit of work and increasing t by 1 (cost +1 to potential), for a net ΔΦ = +1 − 2 = −1, paying for the work.


5. Per-Operation Amortised Costs

5.1 insert(H, x)

Actual work: 1 (splice x into root list, compare against min, update min if needed).

Potential change: Δt = +1, Δm = 0, so ΔΦ = +1.

ĉ_insert = 1 + 1 = 2 = O(1).

5.2 meld(H_1, H_2)

Actual work: 1 (concatenate the two circular root lists, update min).

Potential change: Φ(H_1 ⊎ H_2) − Φ(H_1) − Φ(H_2) = 0 because t and m are additive.

ĉ_meld = 1 + 0 = 1 = O(1).

5.3 extract-min(H)

Let D = D(n) and let t = t(H) before the call, t' = t(H') after the call.

Actual work: - Promote the k = degree(min) children of min to roots: O(k) ≤ O(D). - Remove min from root list: O(1). - consolidate: traverses the new root list of size t + k − 1 and performs at most t + k − 1 − t' links, total O(t + D − t').

Conservative upper bound: O(t + D).

Potential change: - t' ≤ D + 1 after consolidation (post-condition of Section 3). - m does not increase; marks can only decrease (if a marked node was a child of min, it is now a root and unmarked). - Δt = t' − t, Δm ≤ 0, so ΔΦ ≤ t' − t ≤ D + 1 − t.

Amortised cost:

ĉ_extract-min = O(t + D) + (D + 1 − t)
             = O(D)
             = O(log n).

The t term in the actual cost is paid by the −t term in the potential change — the linear scan of the root list is paid for by the potential that previous insert operations deposited.

5.4 decrease-key(H, x, k)

Assume k < key(x). Set key(x) = k. If x is a root or heap order is not violated (rare), update min if needed and return.

Otherwise, let y = parent(x). Perform cut(x, y): detach x, splice into root list, unmark x. Then perform cascading-cut(y):

procedure cascading-cut(y):
    z = parent(y)
    if z = null: return                       // y is a root, stop
    if mark(y) = 0:
        mark(y) = 1
        return                                // first loss, just remember
    else:
        cut(y, z)                             // second loss → propagate
        cascading-cut(z)

Let c be the number of cascading-cut calls that actually performed a cut, plus 1 for the initial cut on x. Total actual cost: O(c).

Potential change: - Each of the c cuts adds a node to the root list: Δt = +c. - Each cascading cut that fired unmarked a node: each saves 2. The initial cut on x may have unmarked x (saves 2). The final non-cutting cascading-cut(z) on a previously-unmarked z newly marks z (costs +2). - Net: Δm ≤ −(c − 1) + 1 = 2 − c. Hence 2 Δm ≤ 4 − 2c. - ΔΦ ≤ c + (4 − 2c) = 4 − c.

Amortised cost:

ĉ_decrease-key = O(c) + (4 − c) = O(1).

The constant is tight: a careful accounting gives ĉ = 4 plus the unit cost of the initial decrement and rebalancing of min, hence O(1) with small constants.

5.5 delete(H, x)

Implement as decrease-key(H, x, −∞) followed by extract-min(H).

ĉ_delete = ĉ_decrease-key + ĉ_extract-min = O(1) + O(log n) = O(log n).

Summary table

Operation Actual Amortised
insert O(1) O(1)
meld O(1) O(1)
find-min O(1) O(1)
decrease-key O(log n) w.c. O(1)
extract-min O(n) w.c. O(log n)
delete O(n) w.c. O(log n)

The worst-case O(n) rows reflect that a single extract-min may face a root list of size Θ(n) after many cheap inserts. The amortised analysis pays this back from the potential built up by those inserts.


6. Why decrease-key Bound Regresses Without Cascading Cuts

Suppose we drop cascading cuts entirely: decrease-key simply cuts x from its parent and inserts into the root list, without touching the parent's mark or grandparent.

The degree bound s_k ≥ F_{k+2} collapses, because Lemma 1 fails: a node y_i can now lose all its children without being cut from x. Therefore degree(y_i) can drop to 0 while still hanging off x, so size(x) is no longer bounded below by Fibonacci numbers.

Concrete counter-example. Build a binomial tree B_k of order k (size 2^k, depth k). Then repeatedly call decrease-key on the rightmost leaf of each subtree, cutting them out one by one. After O(2^k) such operations the root has degree k but size 1 (only itself), violating the degree bound.

Now consider an adversarial sequence: insert n elements (cost O(n)), build a single tree of degree Θ(log n) via one extract-min, then alternate decrease-key on a leaf with extract-min. With cascading cuts, the root list stays at O(log n) after each consolidation. Without them, decrease-key accumulates roots while never paying for the eventual extract-min cost via potential. A standard adversary argument (see Fredman–Tarjan §4) shows the amortised cost of decrease-key must rise to Θ(log n).

Stronger statement. Without cascading cuts, in any pointer-machine implementation of a mergeable heap that supports decrease-key by cutting and re-inserting, the amortised cost of decrease-key is Ω(log n) against an adaptive adversary. Cascading cuts are essential, not cosmetic.


7. Lower Bound and the Brodal–Lagogiannis–Tarjan O(1) Worst-Case Heap

7.1 The amortised vs worst-case gap

Fibonacci heaps give O(1) amortised decrease-key. A natural question is whether the same bound can be achieved in the worst case. Fredman (1998) proved a lower bound: in the comparison-based pointer-machine model, any heap supporting insert, find-min, delete-min, meld, and decrease-key with worst-case cost o(log n) for delete-min must use Ω(log log n) per decrease-key if certain pointer-mutation restrictions hold. For general models the bound is weaker but the question remained open for a quarter century.

7.2 The Brodal queue (1996)

Brodal (SODA 1996) constructed the first heap with O(1) worst-case insert, meld, and decrease-key, and O(log n) worst-case delete-min. The construction was widely considered impractical due to its complexity (multiple layers of auxiliary structures, redundant binary counters), and it was not until 2012 that Brodal, Lagogiannis, and Tarjan presented a simplified variant.

7.3 The strict Fibonacci heap (POPL 2012)

Brodal, Lagogiannis, Tarjan. Strict Fibonacci Heaps. In Proceedings of the 44th Symposium on Theory of Computing (STOC 2012), pp. 1177–1184.

Result. A pointer-based heap with:

Operation Worst-case
insert O(1)
find-min O(1)
meld O(1)
decrease-key O(1)
delete-min O(log n)

This matches the amortised bounds of Fibonacci heaps in the worst case, no amortisation, no adversarial accumulation.

Key ideas. 1. A single tree (not a forest) with a rank attached to every node, analogous to Fibonacci degree. 2. A pool of auxiliary structures: an active/passive partition, an active-roots list, a rank-list, a non-linkable-child list, and a loss field replacing the mark bit. 3. Bounded transformations. Every operation performs O(1) "transformations" from a fixed repertoire (link, cut, reduction of rank, etc.). The transformations are designed so that no chain of cascading work is ever needed; bookkeeping happens lazily within O(1) work per call. 4. The amortised analysis of Fibonacci heaps becomes an explicit credit scheme on rank, with credit redistributed in O(1) per operation.

The construction is intricate but no longer hopeless: an implementation fits in roughly 1000 lines of C++ and runs at constant factors a few times worse than std::priority_queue. In practice it is rarely used because pairing heaps and d-ary heaps dominate empirically on Dijkstra-style workloads.


8. Successor Structures

8.1 Rank-pairing heap (Haeupler–Sen–Tarjan, 2011)

Haeupler, Sen, Tarjan. Rank-Pairing Heaps. SIAM Journal on Computing 40 (6): 1463–1485, 2011.

A pairing heap (Fredman–Sedgewick–Sleator–Tarjan, 1986) with explicit ranks attached to each node. Amortised bounds match Fibonacci heaps exactly:

insert       O(1) amortised
meld         O(1) amortised
find-min     O(1) amortised
decrease-key O(1) amortised
delete-min   O(log n) amortised

Implementation is dramatically simpler than Fibonacci heaps: - A single half-ordered binary tree (left child / right sibling). - decrease-key cuts the subtree, attaches it as a new sibling of the root, and adjusts ranks along a short path — no cascading-cut recursion. - delete-min does a two-pass pairing combine.

Empirically rank-pairing heaps beat Fibonacci heaps and rival pairing heaps in cache-friendly workloads. They are the preferred theoretical construction when O(1) amortised decrease-key is required.

8.2 Strict Fibonacci heap

Covered in §7.3. Currently the only structure with O(1) worst-case decrease-key and pointer-based simplicity comparable to Fibonacci heaps.

8.3 Brodal queue

Covered in §7.2. Predecessor of the strict Fibonacci heap, historically important but superseded.

8.4 Brodal–Okasaki purely functional heap (1996)

Brodal, Okasaki. Optimal Purely Functional Priority Queues. Journal of Functional Programming 6 (6): 839–857, 1996.

Persistent (functional) heap with O(1) worst-case insert, find-min, and meld, and O(log n) worst-case delete-min. No decrease-key, since persistence makes the operation expensive — you cannot mutate the predecessor pointer in place. The construction layers a bootstrapped binomial heap atop a "scheduling" primitive that forces lazy thunks at amortised O(1).

8.5 Driscoll–Gabow–Shrairman–Tarjan relaxed heaps (1988)

Driscoll, Gabow, Shrairman, Tarjan. Relaxed Heaps: An Alternative to Fibonacci Heaps with Applications to Parallel Computation. Communications of the ACM 31 (11): 1343–1354, 1988.

Two variants: - Rank-relaxed heap. Allows a bounded number of "active" nodes that violate heap order, with bookkeeping akin to Fibonacci's marks. O(log n) worst-case decrease-key, but supports efficient parallel updates. - Run-relaxed heap. Tighter constants, suitable for parallel Dijkstra.

Relaxed heaps are the structural ancestor of strict Fibonacci heaps; the idea of "violations" replacing marks is the conceptual seed.


9. Comparison Matrix

All bounds are per-operation; n is current size; amortised noted as (a), worst-case as (w).

Structure insert meld find-min delete-min decrease-key Notes
Binary heap log n (w) n (w) 1 (w) log n (w) log n (w) Implicit array; tiny constants
d-ary heap log_d n (w) n (w) 1 (w) d · log_d n (w) log_d n (w) d ≈ m/n optimal for dense Dijkstra
Binomial heap log n (w) / 1 (a) log n (w) 1 (w) log n (w) log n (w) Lazy version gives 1 (a) insert
Leftist heap log n (w) log n (w) 1 (w) log n (w) log n (w) Simple recursive meld
Skew heap log n (a) log n (a) 1 (a) log n (a) log n (a) Self-adjusting; no balance info
Pairing heap 1 (a) 1 (a) 1 (a) log n (a) o(log n) (a) Empirically fastest; decrease-key O(log log n) conjectured
Fibonacci heap 1 (a) 1 (a) 1 (a) log n (a) 1 (a) Cascading cuts
Rank-pairing heap 1 (a) 1 (a) 1 (a) log n (a) 1 (a) Simpler implementation than F-heap
Strict Fibonacci heap 1 (w) 1 (w) 1 (w) log n (w) 1 (w) Worst-case bounds; complex
Brodal queue 1 (w) 1 (w) 1 (w) log n (w) 1 (w) Original O(1)-decrease-key heap
Brodal–Okasaki 1 (w) 1 (w) 1 (w) log n (w) n/a Purely functional / persistent
Relaxed heap (DGST) 1 (a) 1 (w) 1 (w) log n (w) 1 (a) Parallel-friendly

† Iacono and Özkan (2014) proved a lower bound of Ω(log log n) amortised per decrease-key on pairing heaps under a natural model; the gap to O(log n) is still open.

Constant factors and cache behaviour

Asymptotic bounds tell only part of the story. Approximate constants on modern hardware (Skylake-class, L1 64 KB, 64-byte cache line):

Structure Bytes per node Pointers chased per decrease-key Sequential access
Binary heap 8 (key only) log n array indexing Excellent
4-ary heap 8 0.5 · log_2 n array indexing Excellent
Pairing heap ~32 2–4 random accesses Poor
Fibonacci heap ~48 4–8 random accesses (cuts + cascade) Poor
Rank-pairing ~40 3–5 random accesses Poor

For Dijkstra on graphs with m = Θ(n^{1.5}) edges, d-ary heaps with d = 4 typically beat Fibonacci heaps by a factor of 3–5 in wall-clock time despite the inferior asymptotic complexity. Fibonacci heaps shine only when m / n → ∞ (very dense graphs) or when decrease-key dominates.


10. Open Problems

  1. Pairing-heap decrease-key complexity. The exact amortised cost of decrease-key in standard pairing heaps is unknown. Fredman, Sedgewick, Sleator, and Tarjan (1986) conjectured O(1). Pettie (2005) proved O(2^{2√log log n}), sub-logarithmic but super-constant. Iacono and Özkan (2014) proved a matching Ω(log log n) lower bound for a generalised model. The gap remains.

  2. Cache-oblivious priority queues with O(1) decrease-key. Arge–Bender–Demaine–Holland-Minkley–Munro (2002) gave a cache-oblivious priority queue with O((1/B) log_{M/B} (n/B)) amortised I/O per operation, but no version supports decrease-key at the same I/O bound. Open: is there a cache-oblivious heap with optimal I/O complexity supporting decrease-key in amortised O((1/B) log_{M/B} (n/B))?

  3. Deterministic O(1) worst-case decrease-key with optimal cache behaviour. Strict Fibonacci heaps achieve O(1) worst-case decrease-key in the pointer-machine model but with poor cache locality. Open: does there exist a structure with both O(1) worst-case decrease-key and an optimal cache-oblivious cost for delete-min?

  4. Soft heap lower bounds in stronger models. Chazelle's soft heap (2000) achieves O(1) amortised per operation at the cost of corrupting an ε-fraction of keys. Open: can soft-heap techniques give a non-corrupting heap with all operations o(log n) in the cell-probe model?

  5. Tight constant for decrease-key. The proof in §5.4 gives ĉ_decrease-key ≤ 4. Is this tight? Can a different potential push the constant to 2 or 1 under the same structural rules?

  6. Functional persistence with decrease-key. Brodal–Okasaki gives purely functional heaps without decrease-key. Open: is there a purely functional priority queue supporting decrease-key in amortised O(log n) with O(1) find-min, insert, meld?


11. Summary

The Fibonacci heap is the canonical example of how a potential function can convert a structurally lazy data structure into one with optimal amortised bounds. The argument rests on three legs:

  1. A degree bound proved via Fibonacci numbers (§2). The cascading-cut mark mechanism guarantees that a node of degree k has at least F_{k+2} descendants, capping the maximum degree at log_φ n.

  2. A loop invariant for consolidate (§3). The auxiliary array A[0..D] enforces unique degrees after each extract-min, exhausting the laziness accumulated during inserts.

  3. A potential function Φ = #roots + 2·#marked (§4–5). Insert and meld deposit potential; extract-min and cascading cuts withdraw it. The factor 2 on marks is exactly right to pay for cascading work in decrease-key.

The structure is not the end of the story. Rank-pairing heaps (Haeupler–Sen–Tarjan 2011) achieve the same amortised bounds with simpler code. Strict Fibonacci heaps (Brodal–Lagogiannis–Tarjan 2012) achieve O(1) worst-case decrease-key. Brodal–Okasaki gives persistent heaps without decrease-key. The empirical winners on real Dijkstra workloads are d-ary heaps and pairing heaps; Fibonacci heaps remain a theoretical landmark whose cache behaviour disqualifies it from most production paths.

Open problems persist around cache-oblivious priority queues with decrease-key, the exact pairing-heap decrease-key complexity, and persistent heaps with key updates. Each is a worthy target for a STOC / FOCS paper today.

References

  • M. L. Fredman and R. E. Tarjan. Fibonacci heaps and their uses in improved network optimization algorithms. Journal of the ACM 34 (3): 596–615, 1987.
  • J. R. Driscoll, H. N. Gabow, R. Shrairman, R. E. Tarjan. Relaxed heaps: An alternative to Fibonacci heaps with applications to parallel computation. Communications of the ACM 31 (11): 1343–1354, 1988.
  • M. L. Fredman, R. Sedgewick, D. D. Sleator, R. E. Tarjan. The pairing heap: A new form of self-adjusting heap. Algorithmica 1 (1): 111–129, 1986.
  • G. S. Brodal. Worst-case efficient priority queues. In Proceedings of the 7th ACM-SIAM Symposium on Discrete Algorithms (SODA 1996), pp. 52–58.
  • G. S. Brodal and C. Okasaki. Optimal purely functional priority queues. Journal of Functional Programming 6 (6): 839–857, 1996.
  • B. Haeupler, S. Sen, R. E. Tarjan. Rank-pairing heaps. SIAM Journal on Computing 40 (6): 1463–1485, 2011.
  • G. S. Brodal, G. Lagogiannis, R. E. Tarjan. Strict Fibonacci heaps. In Proceedings of the 44th ACM Symposium on Theory of Computing (STOC 2012), pp. 1177–1184.
  • B. Chazelle. The soft heap: An approximate priority queue with optimal error rate. Journal of the ACM 47 (6): 1012–1027, 2000.
  • S. Pettie. Towards a final analysis of pairing heaps. In Proceedings of the 46th IEEE Symposium on Foundations of Computer Science (FOCS 2005), pp. 174–183.
  • J. Iacono and Ö. Özkan. Why some heaps support constant-amortized-time decrease-key operations, and others do not. In Proceedings of the 41st International Colloquium on Automata, Languages, and Programming (ICALP 2014), pp. 637–649.
  • L. Arge, M. A. Bender, E. D. Demaine, B. Holland-Minkley, J. I. Munro. Cache-oblivious priority queue and graph algorithm applications. In Proceedings of the 34th ACM Symposium on Theory of Computing (STOC 2002), pp. 268–276.