शुरुआत से Big-O संकेतन
समझिए कि आसमितीय वृद्धि क्यों महत्वपूर्ण है, स्थिरांकों और निम्न-क्रम पदों को कैसे हटाया जाता है, और Big-O को तुरंत कैसे पढ़ें।
शुरुआत से Big-O संकेतन, CoddyKit पर कोडिंग साक्षात्कार की तैयारी का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह कोडिंग साक्षात्कार की तैयारी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
एल्गोरिदम की दक्षता क्यों मापें
दो प्रोग्राम सही हो सकते हैं, फिर भी एक पलक झपकते पूरा हो जाता है और दूसरा घंटों चलता रहता है। समय जटिलता बताती है कि input बड़ा होने पर runtime कैसे बढ़ता है।
# O(n) approach
def find_max_linear(nums):
m = nums[0]
for n in nums:
if n > m: m = n
return m
# O(n^2) approach (unnecessary double loop)
def find_max_quadratic(nums):
for i in range(len(nums)):
is_max = all(nums[i] >= nums[j] for j in range(len(nums)))
if is_max: return nums[i]
print(find_max_linear([3, 1, 4, 1, 5, 9])) # 9Big-O: स्पर्शोन्मुख ऊपरी सीमा
Big-O बताता है कि लागत की वृद्धि की सबसे खराब स्थिति वाली ऊपरी सीमा क्या है। तरकीब यह है कि स्थिरांकों और छोटे पदों को हटा दें, क्योंकि बड़े पैमाने पर केवल सबसे प्रभावी पद मायने रखता है। कोड देखें।
# T(n) = 3n^2 + 5n + 100 is O(n^2)
# because the n^2 term dominates for large n
# T(n) = 2n + 1000 is O(n)
# the constant 1000 becomes negligible
# Rule: drop constants and lower-order terms
# 5n^3 + 2n^2 + n + 1 => O(n^3)
# 100 * log(n) + n => O(n)
print('O(n^2) example: counting iterations')
n = 1000
count = sum(1 for i in range(n) for j in range(n))
print(count) # 1_000_000 = n^2सामान्य जटिलता वर्ग
सबसे तेज़ से सबसे धीमे तक: O(1), O(log n), O(n), O(n log n), O(n^2), O(2^n), O(n!)। इन्हें जानने से आप एक भी पंक्ति लिखने से पहले सही तरीका चुन सकते हैं।
import math
n = 1000
print(f'O(1): {1}')
print(f'O(log n): {int(math.log2(n))}')
print(f'O(n): {n}')
print(f'O(n log n): {int(n * math.log2(n))}')
print(f'O(n^2): {n**2}')
# O(2^n) for n=1000 is astronomically large
# O(n!) even largerस्थिरांक हटाना: यह क्यों महत्वपूर्ण है
5n चरण चलाना और 2n चरण चलाना, दोनों O(n) हैं — स्थिरांक हार्डवेयर पर निर्भर करते हैं, एल्गोरिदम पर नहीं। Big-O उन्हें हटा देता है, ताकि आप समान आधार पर स्केलिंग की तुलना कर सकें।
# Both are O(n) — different constants
def count_a(n):
total = 0
for i in range(n): # n ops
total += 1
for i in range(n): # n ops
total += 1
return total # T(n) = 2n => O(n)
def count_b(n):
total = 0
for i in range(5 * n): # 5n ops
total += 1
return total # T(n) = 5n => O(n)
print(count_a(10), count_b(10)) # 20 50श्रेष्ठ, औसत और सबसे खराब स्थितियाँ
बिग-ओ सबसे खराब स्थिति को दर्शाता है; ओमेगा सबसे अच्छी स्थिति को, और थीटा दोनों पर एक सटीक सीमा को। जब साक्षात्कारकर्ता "जटिलता" पूछता है, तो उसका मतलब लगभग हमेशा सबसे खराब स्थिति से होता है।
def linear_search(nums, target):
for i, n in enumerate(nums):
if n == target:
return i # best case: target at index 0 => O(1)
return -1 # worst case: not found => O(n)
# Best case O(1): target is first element
print(linear_search([5,1,2,3], 5)) # 0
# Worst case O(n): target not in list
print(linear_search([1,2,3,4], 9)) # -1O(log n): खोज-क्षेत्र को आधा करना
कोई एल्गोरिदम O(log n) तब होता है, जब वह हर चरण में input को आधा कर देता है, जैसे बाइनरी खोज। एक अरब items के लिए भी केवल लगभग 30 चरण लगते हैं — अविश्वसनीय रूप से तेज़। कोड देखें।
def binary_search(arr, target):
lo, hi = 0, len(arr) - 1
steps = 0
while lo <= hi:
steps += 1
mid = (lo + hi) // 2
if arr[mid] == target:
return mid, steps
elif arr[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1, steps
import math
arr = list(range(1000))
idx, s = binary_search(arr, 999)
print(f'Found at {idx} in {s} steps (log2(1000)~={math.log2(1000):.1f})')O(n log n): सॉर्टिंग की निचली सीमा
किसी भी तुलना-आधारित सॉर्ट को सबसे खराब स्थिति में कम-से-कम O(n log n) समय चाहिए — यह गणितीय रूप से सिद्ध निचली सीमा है। इसलिए पहले सॉर्ट करके फिर स्कैन करना कुल मिलाकर O(n log n) है, O(n^2) नहीं। कोड में मर्ज सॉर्ट दिखाया गया है।
# Merge sort: O(n log n)
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(a, b):
res, i, j = [], 0, 0
while i < len(a) and j < len(b):
if a[i] <= b[j]: res.append(a[i]); i+=1
else: res.append(b[j]); j+=1
return res + a[i:] + b[j:]
print(merge_sort([5,2,8,1,9,3])) # [1,2,3,5,8,9]परिशोधित जटिलता
परिशोधित विश्लेषण कई ऑपरेशनों पर लागत का औसत निकालता है। Python का append परिशोधित रूप से O(1) है: यह आम तौर पर तुरंत पूरा होता है, जबकि कभी-कभार होने वाला O(n) आकार-विस्तार सभी append ऑपरेशनों पर थोड़ा-थोड़ा बाँट दिया जाता है।
# Dynamic array append is O(1) amortised
import sys
lst = []
capacities = []
for i in range(16):
lst.append(i)
capacities.append(sys.getsizeof(lst))
# Size jumps show reallocation events
for i, c in enumerate(capacities):
if i > 0 and capacities[i] != capacities[i-1]:
print(f'Realloc at i={i}, new size={c} bytes')कोड में जटिलता पहचानना
एक त्वरित नियम: लूप गिनिए। एक लूप O(n) होता है, दो नेस्टेड लूप O(n^2), और आधा होने वाला लूप O(log n)। स्वतंत्र चरणों को add किया जाता है; केवल नेस्टेड लूपों को multiply किया जाता है। कोड देखें।
# Two independent passes: O(n) + O(n) = O(n)
def two_passes(nums):
total = sum(nums) # O(n)
mean = total / len(nums)
diffs = [abs(n - mean) for n in nums] # O(n)
return max(diffs) # O(n)
# Overall: O(n) -- NOT O(n^2)
# Nested loops: O(n) * O(n) = O(n^2)
def all_pairs(nums):
pairs = []
for i in range(len(nums)): # O(n)
for j in range(i+1, len(nums)): # O(n)
pairs.append((nums[i], nums[j]))
return pairs # O(n^2)स्थान-जटिलता की मूल बातें
स्थान-जटिलता उस अतिरिक्त मेमोरी को मापती है, जिसका आप input के अलावा उपयोग करते हैं। उसी स्थान पर किया गया उलटना O(1) है; हैश मैप O(n) है। जब आप समय के बदले स्थान का उपयोग करते हैं, तो हमेशा दोनों स्पष्ट रूप से बताइए।
# O(1) space: reverse in-place
def reverse_inplace(arr):
l, r = 0, len(arr) - 1
while l < r:
arr[l], arr[r] = arr[r], arr[l]
l += 1; r -= 1
# O(n) space: create reversed copy
def reverse_copy(arr):
return arr[::-1]
a = [1, 2, 3, 4, 5]
reverse_inplace(a)
print(a) # [5, 4, 3, 2, 1]साक्षात्कार में जटिलता पर बात करना
बिना पूछे ही हमेशा जटिलता बता दीजिए: "इसमें O(n log n) समय और O(n) स्थान लगता है।" फिर कोई तेज़ विकल्प सुझाइए। यह आदत वास्तविक वरिष्ठता दर्शाती है।
# Example of explaining complexity step by step
def two_sum(nums, target):
# O(n) time: one pass through nums
# O(n) space: hash map stores up to n elements
seen = {} # value -> index
for i, n in enumerate(nums):
complement = target - n
if complement in seen: # O(1) lookup
return [seen[complement], i]
seen[n] = i
return []
print(two_sum([2, 7, 11, 15], 9)) # [0, 1]त्वरित जाँच
त्वरित जाँच — Big-O और जटिलता वर्गों के बारे में आपने अब तक क्या समझा है, यह दिखाइए। एक प्रश्न है, आप इसे कर लेंगे। 🎯
पाठ का पुनरावलोकन
पुनरावलोकन: Big-O स्थिरांकों को हटाकर सबसे खराब स्थिति की वृद्धि दर्शाता है, आप O(1) से O(n!) तक के वर्गों को जानते हैं, और स्वतंत्र लूप जुड़ते हैं जबकि नेस्टेड लूप गुणा होते हैं।
एआई शिक्षक के साथ कोडिंग साक्षात्कार की तैयारी सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 90
- पाठ
- 360
अक्सर पूछे जाने वाले प्रश्न
क्या “शुरुआत से Big-O संकेतन” पाठ निःशुल्क है?
हाँ—“शुरुआत से Big-O संकेतन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“शुरुआत से Big-O संकेतन” में मैं क्या सीखूँगा?
समझिए कि आसमितीय वृद्धि क्यों महत्वपूर्ण है, स्थिरांकों और निम्न-क्रम पदों को कैसे हटाया जाता है, और Big-O को तुरंत कैसे पढ़ें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ कोडिंग साक्षात्कार की तैयारी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या कोडिंग साक्षात्कार की तैयारी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर कोडिंग साक्षात्कार की तैयारी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“शुरुआत से Big-O संकेतन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस कोडिंग साक्षात्कार की तैयारी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर कोडिंग साक्षात्कार की तैयारी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- शुरुआत से Big-O संकेतन
- लूप और नेस्टेड लूप का विश्लेषण
- पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि
- स्थान-जटिलता और संतुलन