Heap అనేది ప్రతి parent heap property ని సంతృప్తిపరిచే complete binary tree - ఎల్లప్పుడూ children కంటే చిన్నది (min-heap) లేదా పెద్దది (max-heap). "Complete" అంటే చివరి level తప్ప ప్రతి level నిండి ఉంటుంది, చివరిది ఎడమ నుండి కుడికి నిండుతుంది.
1 Min-heap
/ \
3 5
/ \
7 4
ఇది complete కాబట్టి, flat array లో నిల్వ చేస్తాం - pointers అవసరం లేదు. Index i కోసం: left child = 2i + 1, right child = 2i + 2, parent = (i - 1) // 2.
| లక్షణం | Min-Heap | Max-Heap | |----------|----------|----------| | Root | అతి చిన్న element | అతి పెద్ద element | | Parent ≤ Children? | ✅ అవును | ❌ కాదు (≥) | | Extract ఇస్తుంది | Minimum | Maximum |
Python heapq డిఫాల్ట్గా min-heap. Max-heap కోసం, insert చేసేటప్పుడు విలువలను negate చేసి, extract చేసేటప్పుడు మళ్ళీ negate చేయండి.
Insert - చివరికి push చేసి, bubble up చేయండి (చిన్నదైనంత వరకు parent తో swap):
import heapq
h = [1, 3, 5, 7]
heapq.heappush(h, 2) # h [1, 2, 5, 7, 3] అవుతుంది
Extract min - root ను చివరి element తో swap చేసి, చివరిది తొలగించి, sift down చేయండి (చిన్న child తో swap):
smallest = heapq.heappop(h) # 1 రిటర్న్ చేస్తుంది
రెండు operations O(log n) లో నడుస్తాయి ఎందుకంటే tree ఎత్తు log n.
heapq.heapify(arr) ను call చేయడం list ను O(n) లో heap గా మారుస్తుంది, O(n log n) కాదు. ఇది bottom-up పనిచేస్తుంది, ప్రతి non-leaf node ను కిందకు sift చేస్తుంది. CS లో అత్యంత ఆశ్చర్యకరమైన complexity ఫలితాలలో ఇది ఒకటి.
Sign in to join the discussion
Priority queue మీకు ఎల్లప్పుడూ అత్యధిక-ప్రాధాన్యత item కు ప్రాప్యత ఇస్తుంది. Insert మరియు extract రెండూ O(log n) కాబట్టి Heaps ఉత్తమ implementation. "ఇప్పటివరకు ఉత్తమ item ఇవ్వు" అనే అవసరం ఉన్నప్పుడల్లా ఉపయోగించండి.
"Unsorted array లో K అతిపెద్ద elements కనుగొనండి."
K పరిమాణం min-heap ఉంచండి. ప్రతి element కోసం push చేయండి; heap K కంటే పెరిగితే, అతి చిన్నదాన్ని pop చేయండి. మిగిలేవి K అతిపెద్దవి.
import heapq
def top_k(nums, k):
return heapq.nlargest(k, nums)
సమయం: O(n log k) - k ≪ n అయినప్పుడు sorting కంటే చాలా మెరుగు.
1 మిలియన్ entries నుండి అత్యధిక 5 scores కావాలి. ఏ heap రకం మరియు పరిమాణం?
ప్రతి list head ను min-heap లో push చేయండి. అతి చిన్నదాన్ని pop చేసి, ఆ list నుండి తదుపరి element ను push చేయండి. అన్ని lists అయిపోయే వరకు పునరావృతం చేయండి. సమయం: O(N log K) ఇక్కడ N మొత్తం elements.
రెండు heaps నిర్వహించండి: దిగువ సగానికి max-heap మరియు ఎగువ సగానికి min-heap. వాటి పరిమాణాలు గరిష్టంగా 1 తేడా ఉండేలా balance చేయండి. Median ఎల్లప్పుడూ ఒకటి లేదా రెండు roots వద్ద ఉంటుంది.
దిగువ సగం (max-heap): [1, 2, 3] ← max = 3
ఎగువ సగం (min-heap): [4, 5, 6] ← min = 4
Median = (3 + 4) / 2 = 3.5
రెండు-heap median విధానంలో, కొత్త element ముందు ఎక్కడికి వెళ్తుంది?
Scheduling లో heaps రాణిస్తాయి: meeting rooms (ముందుగా ముగిసే సమయం track చేయడం), cooldowns తో task scheduling, లేదా CPU job queues. కీలక అంతర్దృష్టి - heap "తర్వాత ఏది ముగుస్తుంది" అనేదాన్ని సమర్థవంతంగా track చేస్తుంది.
| అవసరం | ఉత్తమ ఎంపిక | ఎందుకు | |--------|-------------|--------| | పునరావృత min/max extraction | Heap | O(log n) insert + extract | | Static data, ఒకసారి sort | Sorted array | O(n log n) ఒకసారి, O(1) ప్రాప్యత | | Range queries + order stats | Balanced BST | అన్నింటికీ O(log n) | | Stream నుండి Top-K | K పరిమాణ Heap | O(n log k) మొత్తం |
Min-heap లో ఏ operation O(1)?
| Operation | సమయం | |-----------|------| | Insert | O(log n) | | Extract min/max | O(log n) | | Peek min/max | O(1) | | Heapify | O(n) | | n items నుండి Top-K | O(n log k) |