DSA Interview Prep · पाठ

लूप और नेस्टेड लूप का विश्लेषण

एकल लूप, नेस्टेड लूप और घटती सीमाओं वाले लूप की समय-जटिलता निकालिए, जैसे द्विआधारी खोज या त्रिकोणीय पुनरावृत्तियाँ।

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

लूप और नेस्टेड लूप का विश्लेषण, CoddyKit पर DSA Interview Prep का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह DSA Interview Prep सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। DSA Interview Prep पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

एकल लूप: O(n)

सबसे सरल लूप अपने शरीर को n बार चलाता है, इसलिए यह O(n) होता है। बड़ा चरण गिनती बदल देता है, लेकिन वर्ग नहीं बदलता। शुरुआत हमेशा यह गिनकर कीजिए कि लूप का शरीर कितनी बार चलता है। कोड देखें।

# O(n): body runs n times
def count_ops_linear(n):
    ops = 0
    for i in range(n):
        ops += 1     # constant work
    return ops

print(count_ops_linear(100))  # 100

# Still O(n): step=2 halves count but same class
def count_ops_half(n):
    ops = 0
    for i in range(0, n, 2):
        ops += 1
    return ops

print(count_ops_half(100))    # 50  => O(n)

नेस्टेड लूप: O(n²) और उससे आगे

दो लूप, जिनमें से प्रत्येक n बार चलता है और एक-दूसरे के भीतर है, n x n = O(n^2) देते हैं; तीन लूप O(n^3) देते हैं। लेकिन यदि आंतरिक लूप निश्चित संख्या में चलता है, तो पूरी जटिलता रैखिक ही रहती है।

def count_pairs(n):
    ops = 0
    for i in range(n):          # n iterations
        for j in range(n):      # n iterations each
            ops += 1
    return ops

print(count_pairs(10))   # 100 = 10^2
print(count_pairs(100))  # 10000 = 100^2
# Doubling n quadruples ops: classic O(n^2)

त्रिकोणीय लूप: O(n²/2) = O(n²)

जब आंतरिक लूप i+1 से शुरू होता है, तो पुनरावृत्तियाँ त्रिकोण बनाती हैं: n(n-1)/2, जो आधे को हटाने के बाद भी O(n^2) ही रहती है। सभी-विशिष्ट युग्मों वाली समस्याएँ ऐसी ही दिखती हैं।

def count_unique_pairs(n):
    ops = 0
    for i in range(n):          # n iterations
        for j in range(i+1, n): # n-1, n-2, ..., 0
            ops += 1
    return ops

print(count_unique_pairs(10))  # 45 = 10*9/2
print(count_unique_pairs(100)) # 4950
# Still O(n^2) -- constant factor 1/2 dropped

सिकुड़ती सीमा वाला लूप: O(log n)

जब लूप चर हर चरण में आधा हो जाता है, तो आपको O(log n) मिलता है। मुख्य प्रश्न यह है: क्या सीमा गुणात्मक रूप से सिकुड़ती है (log n) या योगात्मक रूप से (n)? कोड देखें।

def count_log_ops(n):
    ops = 0
    i = n
    while i >= 1:
        ops += 1
        i //= 2   # halve each iteration
    return ops

import math
for n in [8, 16, 64, 1024]:
    ops = count_log_ops(n)
    print(f'n={n}, ops={ops}, log2={int(math.log2(n))}')
# ops tracks log2(n) closely

सिकुड़ते आंतरिक लूप वाला नेस्टेड लूप: O(n log n)

n बार चलने वाला बाहरी लूप और O(log n) वाला आंतरिक लूप मिलकर O(n log n) देते हैं — यही मर्ज सॉर्ट की संरचना है। O(log n) वाले आंतरिक चरण को पहचानना सॉर्ट का विश्लेषण करने की कुंजी है।

import math

def count_n_log_n(n):
    ops = 0
    for i in range(n):    # n iterations
        j = n
        while j >= 1:     # log n iterations
            ops += 1
            j //= 2
    return ops

for n in [8, 32, 128]:
    ops = count_n_log_n(n)
    predicted = int(n * math.log2(n))
    print(f'n={n}: actual={ops}, n*log2(n)~={predicted}')

निर्भर आंतरिक लूप

जब आंतरिक लूप की सीमा बाहरी सूचकांक पर निर्भर करती है, तो प्रति-चरण नहीं, बल्कि कुल पुनरावृत्तियाँ गिनिए। 0..i तक चलने वाला आंतरिक लूप n(n-1)/2 = O(n^2) का योग देता है। कोड देखें।

# Inner loop runs i times: total = 0+1+2+...+(n-1) = n(n-1)/2 => O(n^2)
def sum_inner_i(n):
    ops = 0
    for i in range(n):
        for j in range(i):   # runs 0,1,2,...,n-1 times
            ops += 1
    return ops

print(sum_inner_i(10))  # 45 = 10*9/2  => O(n^2)

# Inner loop runs n/i times (i doubles): sum ≈ n*log n => O(n log n)
def sum_inner_n_over_i(n):
    ops = 0
    i = 1
    while i <= n:
        for j in range(n // i):
            ops += 1
        i *= 2
    return ops
print(sum_inner_n_over_i(64))  # ~ 64*6 = 384

बबल सॉर्ट का चरण-दर-चरण विश्लेषण

बबल सॉर्ट n(n-1)/2 बार तुलना करता है, इसलिए यह O(n^2) है। जल्दी रुकने की सुविधा के बावजूद, उलटे क्रम में दिया गया input फिर भी हर तुलना आवश्यक बनाता है। बड़े input के लिए यह बहुत धीमा है।

def bubble_sort(arr):
    n = len(arr)
    comparisons = 0
    for i in range(n):
        swapped = False
        for j in range(0, n - i - 1):
            comparisons += 1
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = True
        if not swapped:  # early exit if sorted
            break
    return comparisons

arr = list(range(10, 0, -1))  # worst case: reversed
ops = bubble_sort(arr)
print(f'Sorted: {arr}')
print(f'Comparisons: {ops}')  # 45 = 10*9/2

स्ट्रिंग और सबस्ट्रिंग पर लूप

सावधान रहें: Python की स्लाइसिंग O(k) होती है, न कि निःशुल्क, और लूप में + से स्ट्रिंग जोड़ना O(n^2) होता है क्योंकि हर बार प्रतिलिपि बनती है। इसके बजाय ''.join(parts) का उपयोग करें। कोड देखें।

# O(n^2): string concat in loop
def build_bad(n):
    s = ''
    for i in range(n):
        s += str(i)  # copies s each time!
    return s

# O(n): join is a single pass
def build_good(n):
    parts = []
    for i in range(n):
        parts.append(str(i))
    return ''.join(parts)

print(build_good(10))  # '0123456789'

एकाधिक input पैरामीटर

दो input के साथ जटिलता दोनों का उपयोग कर सकती है: अलग-अलग कार्यों के लिए O(m + n), और नेस्टेड कार्यों के लिए O(m x n)। ग्राफ़ की जटिलता अक्सर O(V + E) के रूप में लिखी जाती है। हर चर का नाम स्पष्ट रखिए।

# O(m + n): two independent loops
def independent(m, n):
    a = sum(range(m))  # O(m)
    b = sum(range(n))  # O(n)
    return a + b       # total O(m + n)

# O(m * n): nested
def nested(m, n):
    count = 0
    for i in range(m):     # O(m)
        for j in range(n): # O(n) each
            count += 1
    return count  # O(m * n)

print(independent(5, 10))  # 10 + 45 = 55
print(nested(5, 10))       # 50

लूप के भीतर लूप बनाम क्रमिक कॉल

फ़ंक्शन कॉल निःशुल्क नहीं होती — उसके भीतर का लूप भी गिना जाता है। O(n) सहायक फ़ंक्शन को n बार कॉल करने पर O(n^2) मिलता है। विश्लेषण करते समय हमेशा पर्दे के पीछे की कॉल के भीतर भी देखिए।

# Naive string matching: O(n*m)
def naive_search(text, pattern):
    n, m = len(text), len(pattern)
    matches = []
    for i in range(n - m + 1):  # O(n)
        if text[i:i+m] == pattern:  # O(m) comparison + O(m) slice
            matches.append(i)
    return matches
# Total: O(n*m)

print(naive_search('abcabcabc', 'abc'))  # [0, 3, 6]

व्यावहारिक अभ्यास: एक नज़र में जटिलता पहचानना

एक आदत बनाइए: लूपों की नेस्टिंग गिनिए, जाँचिए कि आंतरिक लूप बाहरी लूप पर निर्भर है या नहीं, और फ़ंक्शन कॉल तथा स्लाइसिंग की छिपी लागत पर ध्यान दीजिए। कोड एक आज़माने योग्य पहेली है।

# What is the complexity of this function?
def mystery(nums):
    result = []
    for i in range(len(nums)):          # O(n)
        for j in range(i, len(nums)):   # O(n) worst
            if sum(nums[i:j+1]) == 0:   # O(n) slice + sum!
                result.append((i, j))
    return result
# Answer: O(n^3)  -- three nested n-proportional ops
# Outer O(n) x inner O(n) x sum/slice O(n) = O(n^3)

त्वरित जाँच

त्वरित जाँच — देखिए कि लूप-विश्लेषण की तरकीबें आपको कितनी अच्छी तरह याद रहीं। यहाँ अपने तर्क पर भरोसा रखिए। 💪

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

पुनरावलोकन: नेस्टेड लूप गुणा होते हैं और स्वतंत्र लूप जुड़ते हैं, आधा होने वाला आंतरिक लूप O(n log n) देता है, और कॉल तथा स्लाइसिंग के भीतर की छिपी लागतों को भी गिनना आवश्यक है।

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

एआई शिक्षक के साथ Python सीखें — निःशुल्क

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

पाठ्यक्रम
30
पाठ
120

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

क्या “लूप और नेस्टेड लूप का विश्लेषण” पाठ निःशुल्क है?

हाँ — DSA Interview Prep अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “लूप और नेस्टेड लूप का विश्लेषण” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। DSA Interview Prep पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“लूप और नेस्टेड लूप का विश्लेषण” में मैं क्या सीखूँगा?

एकल लूप, नेस्टेड लूप और घटती सीमाओं वाले लूप की समय-जटिलता निकालिए, जैसे द्विआधारी खोज या त्रिकोणीय पुनरावृत्तियाँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ DSA Interview Prep का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या DSA Interview Prep शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

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

“लूप और नेस्टेड लूप का विश्लेषण” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. शुरुआत से Big-O संकेतन
  2. लूप और नेस्टेड लूप का विश्लेषण
  3. पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि
  4. स्थान-जटिलता और संतुलन
← DSA Interview Prep पर वापस जाएँ