K-Way Merge — Log Merges of Sorted Streams
K-way merge combines K already-sorted sequences into one sorted stream. Think of a newsroom merging K sorted wire feeds, or a database external merge pass joining sorted runs on disk.
Why this shows up in the real world
Log-structured merge trees in databases repeatedly compact sorted runs—k-way merge is the heart. Multi-camera editing timelines may merge sorted event markers from each track. MapReduce shuffle sometimes outputs many sorted partitions that must be merged for the reducer. A min-heap of size K (one head from each list) yields O(n log K) total comparisons for n total elements.
Core idea (explained for students)
Initialize a heap with tuples (head_value, list_id, index_within_list) for each non-empty list. Pop the smallest, append to output, push the next element from that list if any. Tie-break by list id for stability if needed. When K=2, this reduces to the classic linear merge with two pointers—still O(n) time but simpler code.
Try this in Python
import heapq
runs = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
print(list(heapq.merge(*runs)))
Common mistakes
- Pushing infinity sentinels incorrectly—can duplicate outputs.
- Forgetting to advance within-list index after a pop.
- Using a heap when two-pointer merge suffices—overhead.
Key takeaways
- O(n log K) with a heap; O(n) space for output plus O(K) heap.
- Foundation for external sorting on huge files.
- Practice with
heapq.mergein Python for lazy merging iterators.
