Lesson 3 — Intermediate
Heap / Priority Queue
Heap ek special tree hai jisme root hamesha minimum (min-heap) ya maximum (max-heap) hota hai. Iska use top-k problems, scheduling, aur real-time data mein hota hai jahan tumhe fastest access chahiye.
Heap Data Structure Kya Hai?
Heap ek complete binary tree hai jo heap property satisfy karta hai:
- Min-Heap: Har parent node apne children se chota ya equal hai. Root = minimum element.
- Max-Heap: Har parent node apne children se bada ya equal hai. Root = maximum element.
Heap ko array mein store karna easy hai — koi pointer ki zaroorat nahi. Agar index i pe node hai toh:
- Left child =
2*i + 1 - Right child =
2*i + 2 - Parent =
(i-1) // 2
Visual: Heap as Tree and Array
Min-Heap Tree: Array Representation: 1 [1, 3, 5, 7, 9, 8, 6] / \ 0 1 2 3 4 5 6 3 5 / \ / \ Index mapping: 7 9 8 6 Parent(1) = 0 ? 1 Left(0) = 1 ? 3 Right(0) = 2 ? 5 Parent(3) = 1 ? 3 Left(1) = 3 ? 7 Right(1) = 4 ? 9 Heap property: Parent = Children (for min-heap) Root (index 0) = minimum element = 1
Heapify Operation
Heapify ek operation hai jo ek node ko uski sahi position pe le jaata hai. Agar ek node apne children se bada hai (min-heap mein), toh usse neeche push karo — swap with smaller child.
Build Heap: Array se heap banana hai toh last non-leaf node se shuru karo aur har node ko heapify karo. Time: O(n) — not O(n log n)!
Push: Naya element end mein daalo aur up heapify karo (parent se compare karo, swap if needed).
Pop: Root nikalo, last element ko root pe daalo aur down heapify karo (children se compare karo, swap with smaller).
Heap Sort
Heap sort mein pehle max-heap banao, phir root (maximum) ko last position pe swap karo, heap size reduce karo, aur repeat karo. Yeh in-place sorting hai — O(n log n) time, O(1) space.
Lekin practical mein heap sort kam use hota hai kyunki merge sort aur quicksort zyada cache-friendly hain.
Top-K Problems
Heap ka sabse common use case hai "k largest ya k smallest elements find karna". Approach:
- K smallest: Max-heap use karo size k ka. Elements iterate karo, agar heap size > k hai toh root pop karo. End mein heap mein k smallest hongi.
- K largest: Min-heap use karo size k ka. Same logic — agar element bada hai root se toh push karo aur root pop karo.
Time: O(n log k) — heap mein sirf k elements rakte hain.
Code: Python heapq
import heapq
# Min-heap operations
heap = []
heapq.heappush(heap, 5)
heapq.heappush(heap, 1)
heapq.heappush(heap, 3)
print(heapq.heappop(heap)) # 1 (minimum)
print(heapq.heappop(heap)) # 3
print(heapq.heappop(heap)) # 5
# Max-heap trick: negate values
max_heap = []
heapq.heappush(max_heap, -5)
heapq.heappush(max_heap, -1)
heapq.heappush(max_heap, -3)
print(-heapq.heappop(max_heap)) # 5 (maximum)
# K smallest elements
nums = [7, 10, 4, 3, 20, 15]
k = 3
print(heapq.nsmallest(k, nums)) # [3, 7, 10]
# K largest elements
print(heapq.nlargest(k, nums)) # [20, 15, 10]
# Build heap from array in O(n)
arr = [7, 10, 4, 3, 20, 15]
heapq.heapify(arr) # arr ab heap hai
Code: Kth Largest Element
def find_kth_largest(nums, k):
# Min-heap of size k maintain karo
min_heap = []
for num in nums:
heapq.heappush(min_heap, num)
if len(min_heap) > k:
heapq.heappop(min_heap)
# Root = kth largest element
return min_heap[0]
# Example
print(find_kth_largest([3, 2, 1, 5, 6, 4], 2)) # 5
print(find_kth_largest([3, 2, 3, 1, 2, 4, 5, 5, 6], 4)) # 4
Median of Stream
Real-time data stream se median find karna classic heap problem hai. Approach: Do heaps use karo — max-heap for lower half, min-heap for upper half.
- Max-heap mein chote elements rakho (size = n/2 ya n/2+1)
- Min-heap mein bade elements rakho
- Median = max-heap root (odd count) ya (max-heap root + min-heap root) / 2 (even count)
Try it: code khud likho
Exercise: Kth Largest Element
Given array [3, 2, 1, 5, 6, 4] aur k = 2, kth largest element find karo.
Expected Output: 5
Bonus: Median of stream implement karo — har number add karne ke baad current median return karo.
Common Mistakes
- Max-heap banana bhoolna — Python mein sirf min-heap hai. Max-heap ke liye values negate karo
(-val). Pop ke baad wapas negate karo. - Heapify ka time complexity galat samajhna —
heapify()O(n) hai, O(n log n) nahi. Ye bottom-up approach use karta hai. - Heap size manage na karna — Top-k problems mein heap size k se zyada na hone do. Har push ke baad size check karo.
- Empty heap se pop karna —
heappopse pehle check karo ki heap empty nahi hai. Error aayega nahi toh. - Heap sort practical mein use karna — Interview mein heap sort mat likho sorting ke liye. Merge sort ya quicksort better hai. Heap sirf priority queue ke liye use karo.
Heap aur priority queue samajh aa gaya✓ Ab sorting algorithms dekho — merge sort, quicksort, counting sort, radix sort ka deep dive karo.
Next: Sorting: Merge, Quick, Radix ?