LESSON 50 · ADVANCED4 min read

Binary Heaps & Priority Queues: Sift-Up, Sift-Down & Top-K Streams

Master heap data structures. Understand the Complete Binary Tree property, array-backed heap indexing, sift-up/sift-down mechanics, and solve Top-K Frequent Elements.

OpenJDK 21+ (LTS)Free to readModule 13 of 15
YOUR NEXT SMALL WINS

By the end, you’ll be able to…

  • Map a Complete Binary Tree into a contiguous array: parent = (i - 1) / 2, children = 2i + 1, 2i + 2.
  • Implement Min-Heap and Max-Heap sift-up (bubble-up) and sift-down (sink) in O(log N) time.
  • Solve streaming Top-K Frequent Elements in O(N log K) time using a bounded PriorityQueue.

01The Complete Binary Tree Property

A Binary Heap is a Complete Binary Tree that satisfies the Heap Property. In a Min-Heap, every parent node is less than or equal to its children (the root is always the global minimum). In a Max-Heap, every parent is greater than or equal to its children.

A tree is Complete if all levels are fully filled except possibly the last level, which is filled from left to right. Because there are no missing holes, a complete binary tree can be mapped directly into a contiguous Array with ZERO pointer overhead! For any node at array index i: Left Child = 2i + 1 Right Child = 2i + 2 Parent = (i - 1) / 2.

notes.txtPlain text
+---------------------------------------------------+|          Array Representation of Binary Heap      |+---------------------------------------------------+| Array:  [ 10,   15,   20,   17,   25 ]            || Index:     0     1     2     3     4              || Tree:              (10)                           ||                  /      \                         ||               (15)      (20)                      ||              /    \                               ||            (17)   (25)                            |+---------------------------------------------------+

02Sift-Up and Sift-Down Mechanics

When inserting a new element into a heap, we append it to the end of the array and perform Sift-Up (Bubble-Up): while the element is smaller than its parent, swap it with its parent in O(log N) time.

When extracting the minimum (the root), we replace the root with the last element in the array, decrement size, and perform Sift-Down (Sink): swap the element with the smaller of its two children until the min-heap property is restored in O(log N) time.

example.js☕Java
Ctrl + ↵
Output
Click Run or press Ctrl+Enter
Output will appear here after you run the code.

03Top-K Elements: The Bounded Min-Heap Pattern

A common problem in data processing is finding the K largest elements in a stream of N elements. Sorting the entire dataset takes O(N log N) time.

Using a Bounded Min-Heap of size K (java.util.PriorityQueue), we process elements one by one. If heap.size() > K, we poll the minimum! The smaller elements are discarded. After scanning all N elements, the heap contains the K largest elements in O(N log K) time and O(K) space! When N = 100 million and K = 10, this is exponentially faster than full sorting.

example.js☕Java
Ctrl + ↵
Output
Click Run or press Ctrl+Enter
Output will appear here after you run the code.

04Why This Matters in Production

Heaps power PriorityQueues in operating system CPU task schedulers (scheduling threads by priority), event simulation engines, and network packet bandwidth traffic shapers.

In distributed stream processors (like Apache Flink and Kafka Streams), bounded heaps compute real-time leaderboards (e.g. top 10 trending products) over continuous streaming windows without buffering entire datasets into memory.

05Production Architecture & Engineering Trade-Offs

When selecting data structures for high-concurrency environments, developers must analyze both time complexity and memory overhead. Standard collection classes wrap primitive values in heap-allocated wrapper objects, introducing substantial pointer overhead and degrading CPU cache locality. In high-frequency messaging pipelines, storing millions of boxed integers in an ArrayList creates gigabytes of object overhead that stresses garbage collection cycles.

To achieve predictable low-latency throughput, production systems favor primitive-specialized collections or contiguous off-heap direct buffers. Additionally, when using ConcurrentHashMap, choosing the appropriate initial capacity and load factor avoids expensive table rehashing and concurrent bucket redistribution during peak transaction surges.

LET IT CLICK

The ideas worth keeping.

  • Binary heaps represent complete binary trees inside contiguous arrays without pointer overhead.
  • Sift-up and sift-down restore the heap property in O(log N) time.
  • Use a bounded Min-Heap of size K to find Top-K largest elements in streaming datasets in O(N log K) time.
TURN UNDERSTANDING INTO SOMETHING YOU CAN DO

Make it yours.

Type and test your code right here in the interactive workspace. Run your solution, check the output, and compare with the worked guide when ready.

01

Exercise 1: Max-Heap Comparator in Java

How do you instantiate a java.util.PriorityQueue as a Max-Heap rather than the default Min-Heap?

your_turn_1.java☕Java
Ctrl + ↵
Output
Click Run or press Ctrl+Enter
Output will appear here after you run the code.
Explore a worked solution
one_possible_solution.javaJava
// Max-Heap using reverseOrder comparator:PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());// Or using lambda: (a, b) -> Integer.compare(b, a);

Inverting the comparator flips the heap ordering, keeping the maximum element at the root.

02

Exercise 2: Heapify in Linear O(N) Time

Explain why building a binary heap bottom-up from an unsorted array takes O(N) time rather than O(N log N).

your_turn_2.java☕Java
Ctrl + ↵
Output
Click Run or press Ctrl+Enter
Output will appear here after you run the code.
Explore a worked solution
one_possible_solution.javaJava
Bottom-up heapify runs siftDown on non-leaf nodes starting from (N/2)-1 down to 0. Most nodes are at the bottom with small height (height 1, 2). The sum of (N / 2^h) * h converges to O(N).

Summing node counts multiplied by their height forms an arithmetico-geometric series bounded by 2N = O(N).

A SMALL QUESTION. A USEFUL NEXT STEP.

What stayed with you?

Check the ideas while they’re fresh. Your answers stay in this page and feedback appears as you go.

A LITTLE ACTIVE RECALL0 / 3 answered
01How are the children of node at index i located in an array-backed binary heap?
02What is the time complexity of finding the K largest elements in an array of size N using a bounded Min-Heap of size K?
03What is the time complexity of poll() (extracting the root) from a PriorityQueue of size N?
⚡CODING CHALLENGE
🔒Required to Mark Lesson Complete

Exercise 1: Max-Heap Comparator in Java

How do you instantiate a java.util.PriorityQueue as a Max-Heap rather than the default Min-Heap?

EXPECTED OUTPUT
Build successful. (Java 15)
[Process exited normally]
Main.javaJava
Ctrl + ↵
Execution Console
Click "Run & Verify" (or press Ctrl + Enter) to test your code against the challenge.

Keep exploring.

The official references behind this lesson, when you want a second angle or the full details.

One lesson closer.

Reading is a start. Trying it yourself makes the connection.

Solve the hands-on coding challenge in the knowledge section to verify your code and unlock lesson completion.