कोडिंग साक्षात्कार की तैयारी · पाठ

Heap गुण और ऐरे निरूपण

ऐरे में संग्रहीत complete-binary-tree संरचना समझिए, अभिभावक और संतान सूचकांक के सूत्र निकालिए तथा sift-up और sift-down संचालन को दृश्य रूप से समझिए।

पाठ 1, कुल 4 में से13 चरण

Heap गुण और ऐरे निरूपण, CoddyKit पर कोडिंग साक्षात्कार की तैयारी का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह कोडिंग साक्षात्कार की तैयारी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

हीप क्या है

हीप एक विशेष पूर्ण बाइनरी ट्री है जो हीप गुण का पालन करता है: min-heap में प्रत्येक parent अपने children से छोटा या उनके बराबर होता है; max-heap में प्रत्येक parent अपने children से बड़ा या उनके बराबर होता है। यह गुण सुनिश्चित करता है कि न्यूनतम (या अधिकतम) तत्व हमेशा मूल पर हो, जिससे चरम तत्व तक O(1) में पहुँचा जा सके। प्राथमिकता कतारों के पीछे हीप डेटा संरचना होती है।

# Min-heap example:
#         1
#        / \
#       3   2
#      / \ / \
#     7  4 5  6
# Every parent <= its children
# Root (1) is always the minimum

# Max-heap example:
#         9
#        / \
#       7   8
#      / \ / \
#     3  4 5  6
# Every parent >= its children
# Root (9) is always the maximum
print('Heap property: parent dominates all descendants')

पूर्ण बाइनरी ट्री की संरचना

हीप को पूर्ण बाइनरी ट्री के रूप में संग्रहीत किया जाता है — अंतिम स्तर को छोड़कर सभी स्तर पूरी तरह भरे होते हैं, और अंतिम स्तर बाएँ से दाएँ भरा जाता है। यही संरचना बिना कोई स्थान व्यर्थ किए और बिना पॉइंटर के प्रभावशाली सारणी निरूपण संभव बनाती है। पूर्णता का यह गुण सुनिश्चित करता है कि हीप की ऊँचाई हमेशा floor(log₂ n) हो, जिससे push और pop क्रियाएँ O(log n) में होती हैं।

# Complete binary tree properties:
# 1. All levels filled except possibly the last
# 2. Last level filled from LEFT to right
# 3. For n nodes: height = floor(log2(n))

# NOT complete (last level not left-filled):
#     1
#    / \
#   2   3
#        \
#         4  <- right child without left sibling

# Valid complete binary tree with 4 nodes:
#     1
#    / \
#   2   3
#  /
# 4
print('Complete BT: height = floor(log2(n)) always')

हीप का सारणी निरूपण

पूर्ण बाइनरी ट्री की संरचना हीप को बिना किसी पॉइंटर के साधारण सारणी में संग्रहीत करने की अनुमति देती है। 0-आधारित सूचकांक i वाले नोड का parent (i-1) // 2 पर, left child 2i+1 पर और right child 2i+2 पर होता है। यह पूर्णांक अंकगणित पॉइंटर ट्रैवर्सल का स्थान लेती है और हीप को कैश के लिए अत्यंत अनुकूल बनाती है।

# Array representation (0-indexed):
# Index:  0  1  2  3  4  5  6
# Array: [1, 3, 2, 7, 4, 5, 6]
# Tree:        1          (index 0)
#             / \         
#            3   2        (indices 1, 2)
#           / \ / \       
#          7  4 5  6      (indices 3,4,5,6)

# Index formulas (0-based):
def parent(i):      return (i - 1) // 2
def left_child(i):  return 2 * i + 1
def right_child(i): return 2 * i + 2

heap = [1, 3, 2, 7, 4, 5, 6]
print('Parent of index 3:', parent(3), '-> value', heap[parent(3)])
print('Left child of 1:', left_child(1), '-> value', heap[left_child(1)])

Sift-Up: प्रविष्टि के बाद हीप को पुनर्स्थापित करना

नए तत्व को हीप सारणी के अंत में डालने के बाद Sift-up (जिसे bubble-up या heapify-up भी कहा जाता है) का उपयोग किया जाता है। नए तत्व की तुलना उसके parent से करें; यदि हीप गुण का उल्लंघन हो रहा हो, तो दोनों की अदला-बदली करें और ऊपर की ओर बढ़ते रहें। यह तब तक दोहराएँ जब तक तत्व सही स्थान पर न पहुँच जाए या मूल तक न पहुँच जाए। यह O(log n) में चलता है, क्योंकि ट्री की ऊँचाई O(log n) होती है।

def sift_up(heap, i):
    while i > 0:
        p = (i - 1) // 2  # parent index
        if heap[p] > heap[i]:  # min-heap: parent should be smaller
            heap[p], heap[i] = heap[i], heap[p]
            i = p
        else:
            break  # heap property restored

# Demonstrate: insert 0 into an existing min-heap
heap = [1, 3, 2, 7, 4, 5, 6]
heap.append(0)  # add at end
print('Before sift-up:', heap)
sift_up(heap, len(heap) - 1)
print('After sift-up:', heap)  # 0 should bubble to root

Sift-Down: Pop के बाद हीप को पुनर्स्थापित करना

मूल को हटाने के बाद Sift-down (heapify-down) का उपयोग किया जाता है। अंतिम तत्व को मूल पर ले जाएँ, फिर उसे बार-बार छोटे child के साथ अदला-बदली करके नीचे ले जाएँ (min-heap के लिए), जब तक हीप गुण पुनर्स्थापित न हो जाए। यह भी O(log n) में चलता है। Sift-up और sift-down दोनों ही सभी हीप क्रियाओं के मूलभूत घटक हैं।

def sift_down(heap, i, n):
    while True:
        smallest = i
        l = 2 * i + 1  # left child
        r = 2 * i + 2  # right child
        if l < n and heap[l] < heap[smallest]:
            smallest = l
        if r < n and heap[r] < heap[smallest]:
            smallest = r
        if smallest == i:
            break  # already in correct position
        heap[i], heap[smallest] = heap[smallest], heap[i]
        i = smallest

heap = [1, 3, 2, 7, 4, 5, 6]
# Pop min: move last to root, then sift-down
heap[0] = heap[-1]
heap.pop()
print('After move last to root:', heap)
sift_down(heap, 0, len(heap))
print('After sift-down:', heap)  # valid min-heap again

सारणी से हीप बनाना: Floyd का एल्गोरिदम

n तत्वों को एक-एक करके डालना सरल तरीके से O(n log n) लेता है। Floyd का heapify एल्गोरिदम प्रत्येक गैर-पत्ती नोड पर sift-down लागू करके O(n) में हीप बनाता है। यह अंतिम गैर-पत्ती (n//2 - 1 सूचकांक) से शुरू होकर मूल की ओर पीछे चलता है। पत्ती नोड पहले से ही सरल हीप होते हैं, इसलिए हमें केवल आंतरिक नोड को ठीक करना होता है — इसी कारण कुल कार्य O(n) होता है, O(n log n) नहीं।

def build_heap(arr):
    n = len(arr)
    # Start from last non-leaf node: index n//2 - 1
    for i in range(n // 2 - 1, -1, -1):
        sift_down(arr, i, n)
    return arr

arr = [5, 3, 8, 1, 9, 2, 7]
print('Before:', arr)
build_heap(arr)
print('After (min-heap):', arr)  # root should be 1

# Why O(n)? Most nodes are near the bottom (leaves).
# Level k from bottom has ~n/2^k nodes, each needing
# at most k swaps. Sum = n * sum(k/2^k) = O(n).

सारणी वाले हीप का उपयोग करके Heap sort

Heap sort O(1) अतिरिक्त स्थान के साथ O(n log n) में चलता है। चरण 1: सारणी से O(n) में max-heap बनाएँ। चरण 2: मूल और अंतिम अक्रमबद्ध तत्व की अदला-बदली करके अधिकतम मान को बार-बार निकालें, फिर छोटे किए गए हीप पर sift-down करें। n बार निकालने के बाद सारणी आरोही क्रम में क्रमबद्ध हो जाती है। यह स्थान पर काम करने वाला एल्गोरिदम दिखाता है कि सारणी निरूपण से अलग डेटा संरचना बनाए बिना क्रमबद्ध किया जा सकता है।

def sift_down_max(arr, i, n):
    while True:
        largest = i
        l, r = 2*i+1, 2*i+2
        if l < n and arr[l] > arr[largest]: largest = l
        if r < n and arr[r] > arr[largest]: largest = r
        if largest == i: break
        arr[i], arr[largest] = arr[largest], arr[i]
        i = largest

def heap_sort(arr):
    n = len(arr)
    # Build max-heap
    for i in range(n // 2 - 1, -1, -1):
        sift_down_max(arr, i, n)
    # Extract elements one by one
    for end in range(n - 1, 0, -1):
        arr[0], arr[end] = arr[end], arr[0]  # move max to end
        sift_down_max(arr, 0, end)

arr = [5, 3, 8, 1, 9, 2, 7]
heap_sort(arr)
print(arr)  # [1, 2, 3, 5, 7, 8, 9]

Min-Heap बनाम Max-Heap

min-heap में सबसे छोटा तत्व मूल पर होता है; pop करने पर हमेशा न्यूनतम मान मिलता है। max-heap में सबसे बड़ा तत्व मूल पर होता है; pop करने पर हमेशा अधिकतम मान मिलता है। दोनों की संरचना और क्रियाएँ समान होती हैं — केवल तुलना की दिशा बदलती है। Python का heapq मॉड्यूल केवल min-heap लागू करता है, इसलिए max-heap का अनुकरण करने के लिए आपको मानों का ऋणात्मक रूप लेना पड़ता है।

import heapq

# Python heapq is a MIN-HEAP
min_heap = []
heapq.heappush(min_heap, 5)
heapq.heappush(min_heap, 1)
heapq.heappush(min_heap, 3)
print('Min-heap min:', heapq.heappop(min_heap))  # 1

# Simulate MAX-HEAP by negating values
max_heap = []
for val in [5, 1, 3]:
    heapq.heappush(max_heap, -val)  # negate on push
print('Max-heap max:', -heapq.heappop(max_heap))  # 5 (negate on pop)

# For tuples: heapq sorts by first element
print(min_heap, max_heap)

हीप क्रियाओं की जटिलता का सारांश

सभी हीप क्रियाएँ sift-up और sift-down से प्राप्त होती हैं, और दोनों O(log n) होती हैं। Push: append + sift-up = O(log n)। Pop: मूल और अंतिम तत्व की अदला-बदली + sift-down = O(log n)। Peek: सूचकांक 0 तक पहुँचना = O(1)। Build heap: Floyd के एल्गोरिदम से O(n)। Heap sort: O(n log n)। ये जटिलताएँ हीप को तब आदर्श संरचना बनाती हैं, जब आपको बदलते हुए संग्रह से न्यूनतम या अधिकतम मान बार-बार चाहिए।

# Heap complexity summary:
# Operation     | Time       | Space
# --------------|------------|-------
# Push          | O(log n)   | O(1)
# Pop (min/max) | O(log n)   | O(1)
# Peek          | O(1)       | O(1)
# Build from n  | O(n)       | O(1) in-place
# Heap sort     | O(n log n) | O(1)
# nlargest(k,n) | O(n log k) | O(k)

import heapq
data = [5, 3, 8, 1, 9, 2, 7]
print('Top 3 largest:', heapq.nlargest(3, data))  # [9, 8, 7]
print('Top 3 smallest:', heapq.nsmallest(3, data))  # [1, 2, 3]

इंटरव्यू में हीप के व्यावहारिक पैटर्न

हीप एक सामान्य पैटर्न के माध्यम से इंटरव्यू की कई समस्याएँ हल करते हैं: n तत्वों के प्रवाह में आगे बढ़ते हुए k उम्मीदवारों की प्राथमिकता कतार बनाए रखें। सबसे अधिक बार आने वाले शीर्ष-k तत्व, मूल बिंदु के निकटतम k बिंदु और कार्य अनुसूचक — सभी इसी पैटर्न का उपयोग करते हैं। जब आपको यह दिखाई दे, तो इसे पहचानें: 'n वस्तुओं की धारा दी गई है, k सर्वोत्तम वस्तुओं को बनाए रखें' — इसके लिए हमेशा k आकार का हीप चाहिए, जिससे कुल समय O(n log k) होता है।

import heapq

# Top-K closest points to origin using a max-heap of size k
def k_closest(points, k):
    # Use max-heap (negate distance) of size k
    heap = []
    for x, y in points:
        dist = -(x*x + y*y)  # negate for max-heap
        heapq.heappush(heap, (dist, x, y))
        if len(heap) > k:
            heapq.heappop(heap)  # remove farthest
    return [[x, y] for _, x, y in heap]

points = [[1,3], [-2,2], [5,8], [0,1]]
print(k_closest(points, 2))  # 2 closest to origin

हीप बनाम क्रमबद्ध सारणी: समझौते

जब आपको केवल न्यूनतम या अधिकतम मान तक बार-बार पहुँचना हो और संग्रह गतिशील रूप से बदलता हो, तब हीप चुनें। जब आपको सूचकांक के आधार पर यादृच्छिक पहुँच या सीमा-प्रश्न चाहिए, तब क्रमबद्ध सारणी चुनें। हीप की कमजोरी यह है कि मनमाने तत्वों को खोजने में O(n) लगता है; इसकी ताकत O(log n) में प्रविष्टि/विलोपन और O(1) में न्यूनतम/अधिकतम मान तक पहुँच है। क्रमबद्ध सारणी में प्रविष्टि O(n) लेती है, लेकिन बाइनरी खोज से खोज O(log n) में होती है।

# Trade-off comparison:
# Structure     | insert  | delete_min | search | range_query
# --------------|---------|------------|--------|------------
# Min-heap      | O(logn) | O(logn)    | O(n)   | O(n)
# Sorted array  | O(n)    | O(n)       | O(logn)| O(logn+k)
# BST (balanced)| O(logn) | O(logn)    | O(logn)| O(logn+k)
# Hash map      | O(1)    | O(1)       | O(1)   | O(n)

# Interview heuristic:
# 'Find minimum repeatedly from dynamic collection' -> HEAP
# 'Binary search or range query' -> sorted array or BST
# 'Fast lookup by key' -> hash map
print('Heap = dynamic collection with priority access')

त्वरित जाँच

इस पाठ में सिखाई गई डेटा संरचनाएँ और एल्गोरिदम — कोडिंग इंटरव्यू की तैयारी — संबंधी अवधारणाओं की अपनी समझ जाँचें।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: हीप गुण और पूर्ण बाइनरी ट्री की संरचना, parent/child सूचकांक के सूत्रों वाला सारणी निरूपण, तथा Floyd के O(n) निर्माण सहित सभी हीप क्रियाओं के मूलभूत घटक के रूप में sift-up और sift-down। अगले पाठ में हम heapify लागू करेंगे और Python के heapq मॉड्यूल का अध्ययन करेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ कोडिंग साक्षात्कार की तैयारी सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
90
पाठ
360

अक्सर पूछे जाने वाले प्रश्न

क्या “Heap गुण और ऐरे निरूपण” पाठ निःशुल्क है?

हाँ—“Heap गुण और ऐरे निरूपण” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Heap गुण और ऐरे निरूपण” में मैं क्या सीखूँगा?

ऐरे में संग्रहीत complete-binary-tree संरचना समझिए, अभिभावक और संतान सूचकांक के सूत्र निकालिए तथा sift-up और sift-down संचालन को दृश्य रूप से समझिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ कोडिंग साक्षात्कार की तैयारी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या कोडिंग साक्षात्कार की तैयारी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर कोडिंग साक्षात्कार की तैयारी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“Heap गुण और ऐरे निरूपण” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस कोडिंग साक्षात्कार की तैयारी पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर कोडिंग साक्षात्कार की तैयारी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Heap गुण और ऐरे निरूपण
  2. Heapify, Push और Pop शुरुआत से
  3. Python heapq और Max-Heap युक्तियाँ
  4. डेटा प्रवाह का माध्यिका और K-तरफ़ा विलय
← कोडिंग साक्षात्कार की तैयारी पर वापस जाएँ