स्थान-जटिलता और संतुलन
कॉल स्टैक और सहायक डेटा संरचनाओं के लिए अतिरिक्त स्थान मापिए तथा memoisation और in-place एल्गोरिदम में समय-स्थान संतुलन पहचानिए।
स्थान-जटिलता और संतुलन, CoddyKit पर कोडिंग साक्षात्कार की तैयारी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह कोडिंग साक्षात्कार की तैयारी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
स्थान-जटिलता किसे मापती है
स्थान-जटिलता input से अलग अतिरिक्त मेमोरी को मापती है, जिसे सहायक स्थान कहा जाता है। कुछ चर O(1) होते हैं; परिणाम-सरणी या हैश मैप O(n) होता है। कोड देखें।
# O(1) auxiliary space
def sum_array(nums):
total = 0 # one integer variable
for n in nums:
total += n # constant extra space
return total
# O(n) auxiliary space
def copy_array(nums):
return list(nums) # allocates n slots
print(sum_array([1, 2, 3, 4])) # 10
print(copy_array([1, 2, 3, 4])) # [1, 2, 3, 4]पुनरावृत्ति में कॉल-स्टैक का स्थान
हर पुनरावर्ती कॉल एक स्टैक फ़्रेम जोड़ती है, इसलिए गहराई ही स्थान निर्धारित करती है। रैखिक पुनरावृत्ति O(n) है; संतुलित वृक्ष पर DFS O(log n) है। पुनरावृत्तिमूलक संस्करण इसे बेहतर ढंग से नियंत्रित कर सकता है।
import sys
def recursive_sum(n):
if n == 0: return 0
return n + recursive_sum(n - 1)
# Space: O(n) stack frames
def iterative_sum(n):
total = 0
while n > 0:
total += n
n -= 1
return total
# Space: O(1)
print(recursive_sum(100)) # 5050
print(iterative_sum(100)) # 5050मर्ज सॉर्ट का स्थान: O(n)
मर्ज सॉर्ट को अपनी अस्थायी सारणियों के लिए O(n) अतिरिक्त स्थान चाहिए। स्थिर O(n log n) सॉर्ट की यह कीमत है — हीप सॉर्ट स्थान बचाता है, लेकिन स्थिर नहीं होता। कोड देखें।
import tracemalloc
tracemalloc.start()
def merge_sort(arr):
if len(arr) <= 1: return arr
m = len(arr) // 2
l = merge_sort(arr[:m]) # new list
r = merge_sort(arr[m:]) # new list
out, i, j = [], 0, 0
while i < len(l) and j < len(r):
if l[i] <= r[j]: out.append(l[i]); i+=1
else: out.append(r[j]); j+=1
return out + l[i:] + r[j:]
data = list(range(1000, 0, -1))
merge_sort(data)
_, peak = tracemalloc.get_traced_memory()
print(f'Peak memory: {peak} bytes') # proportional to nउसी स्थान पर काम करने वाले एल्गोरिदम: O(1) स्थान
एक उसी स्थान पर काम करने वाला एल्गोरिदम input को सीधे बदलता है और अतिरिक्त आनुपातिक भंडारण का उपयोग नहीं करता — जैसे दो पॉइंटर से किसी array को उलटना। इससे स्थान O(1) रहता है। कोड देखें।
def reverse_inplace(arr):
l, r = 0, len(arr) - 1
while l < r:
arr[l], arr[r] = arr[r], arr[l] # swap
l += 1
r -= 1
# Space: O(1) -- only two pointer variables
def rotate_right(arr, k):
'''Rotate array right by k positions in-place.'''
n = len(arr)
k %= n
arr.reverse() # O(1) space
arr[:k] = arr[:k][::-1]
arr[k:] = arr[k:][::-1]
a = [1, 2, 3, 4, 5]
rotate_right(a, 2)
print(a) # [4, 5, 1, 2, 3]समय-स्थान समझौता: Two-Sum
समय-स्थान समझौता हर जगह दिखाई देता है। Two-Sum में O(1) स्थान के साथ O(n^2) समय लगता है, या हैश मैप के माध्यम से O(n) स्थान के साथ O(n) समय। दोनों विकल्पों का उल्लेख कीजिए और पूछिए कि अधिक महत्वपूर्ण क्या है।
# O(n^2) time, O(1) space
def two_sum_slow(nums, target):
for i in range(len(nums)): # O(n)
for j in range(i+1, len(nums)): # O(n)
if nums[i] + nums[j] == target:
return [i, j]
return []
# O(n) time, O(n) space
def two_sum_fast(nums, target):
seen = {} # O(n) space
for i, n in enumerate(nums):
comp = target - n
if comp in seen: # O(1) lookup
return [seen[comp], i]
seen[n] = i
return []
print(two_sum_fast([2, 7, 11, 15], 9)) # [0, 1]संस्मरणन बनाम सारणीकरण का स्थान
ऊपर-से-नीचे संस्मरणन में O(n) संस्मरण और O(n) स्टैक लगता है; नीचे-से-ऊपर सारणीकरण स्टैक को छोड़ देता है। केवल पिछली कुछ पंक्तियाँ रखकर इसे O(1) तक घटाया जा सकता है — स्थान-अनुकूलित DP।
# Fibonacci: O(n) space with full table
def fib_table(n):
dp = [0] * (n + 1)
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
# O(1) space: keep only last two values
def fib_optimal(n):
if n <= 1: return n
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
print(fib_table(10)) # 55
print(fib_optimal(10)) # 55हैश मैप का स्थान: O(n)
हैश मैप समाधानों में O(n) स्थान की सामान्य लागत है: देखे गए तत्वों के लिए seen-set और गिनती के लिए आवृत्ति मैप। इसे हमेशा बताइए — "O(n) समय, O(n) स्थान" ही पूरा उत्तर है।
def contains_duplicate(nums):
# O(n) time, O(n) space
seen = set()
for n in nums:
if n in seen: return True
seen.add(n)
return False
def group_anagrams(words):
# O(n*m) time, O(n) space (m = avg word length)
from collections import defaultdict
groups = defaultdict(list)
for w in words:
groups[tuple(sorted(w))].append(w)
return list(groups.values())
print(contains_duplicate([1,2,3,1])) # True
print(group_anagrams(['eat','tea','tan','ate','nat','bat']))ग्राफ़ एल्गोरिदम की स्थान-जटिलता का विश्लेषण
ग्राफ़ में वास्तविक स्थान लगता है: संलग्नता सूची O(V + E) होती है, BFS का visited set और queue O(V) होते हैं, और DFS की पुनरावृत्ति O(V) तक गहरी हो सकती है। ग्राफ़ का स्थान V और E में बताइए।
from collections import deque
def bfs(graph, start):
# Space: O(V) for visited set + O(V) for queue
visited = set() # O(V)
queue = deque([start]) # O(V) max
order = []
while queue:
node = queue.popleft()
if node in visited: continue
visited.add(node)
order.append(node)
for nb in graph.get(node, []):
queue.append(nb)
return order
g = {0:[1,2], 1:[3], 2:[3], 3:[]}
print(bfs(g, 0)) # [0, 1, 2, 3]स्ट्रिंग और array आवंटन की समस्याएँ
छिपे हुए आवंटन O(n) स्थान जोड़ सकते हैं: स्लाइसिंग नई सूची बनाती है, और लूप में स्ट्रिंग पर + का उपयोग O(n^2) होता है। sorted() प्रतिलिपि बनाता है, लेकिन lst.sort() उसी स्थान पर काम करता है। कोड देखें।
# Hidden allocations:
nums = [1, 2, 3, 4, 5]
# Creates a NEW list -- O(n) space
slice_copy = nums[1:4] # [2, 3, 4]
# Creates a NEW sorted list -- O(n) space
sorted_copy = sorted(nums) # nums unchanged
# Sorts IN PLACE -- O(1) extra space
nums.sort()
print(slice_copy) # [2, 3, 4]
print(sorted_copy) # [1, 2, 3, 4, 5]
print(nums) # [1, 2, 3, 4, 5]साक्षात्कार में स्थान-समझौतों को पहचानना
शुरुआत में ही अपनी स्थान-जटिलता बता दीजिए। यदि साक्षात्कारकर्ता कम स्थान चाहता है, तो सामान्य उपाय हैं: संस्मरण के बजाय नीचे-से-ऊपर DP, या हैश मैप के बजाय उसी स्थान पर काम करने वाला सॉर्ट। कोड देखें।
# Problem: find if array has duplicates
# Option 1: O(1) time-per-check, O(n) space
def has_dup_hash(nums):
return len(nums) != len(set(nums))
# Option 2: O(n log n) time, O(1) extra space
def has_dup_sort(nums):
nums_copy = sorted(nums) # O(n) space -- still!
for i in range(1, len(nums_copy)):
if nums_copy[i] == nums_copy[i-1]:
return True
return False
# Option 3: truly O(1) extra -- sort in-place
def has_dup_inplace(nums):
nums.sort() # modifies original
for i in range(1, len(nums)):
if nums[i] == nums[i-1]: return True
return Falseकुल जटिलता बताने का प्रारूप
हमेशा पूरा विवरण दीजिए — समय और स्थान दोनों: "O(n) समय, O(1) अतिरिक्त स्थान।" जहाँ समझौते हों, उनका उल्लेख कीजिए। यही वरिष्ठ उम्मीदवारों को दूसरों से अलग करता है।
# Complete complexity example: Merge Intervals
def merge_intervals(intervals):
# Time: O(n log n) for sort + O(n) for merge = O(n log n)
# Space: O(n) for output (could be n/2 to n intervals)
intervals.sort(key=lambda x: x[0]) # O(n log n)
merged = [intervals[0]]
for start, end in intervals[1:]:
if start <= merged[-1][1]:
merged[-1][1] = max(merged[-1][1], end)
else:
merged.append([start, end])
return merged
print(merge_intervals([[1,3],[2,6],[8,10],[15,18]]))
# [[1,6],[8,10],[15,18]]त्वरित जाँच
त्वरित जाँच — देखिए कि स्थान-जटिलता के विचार आपको कितनी अच्छी तरह समझ आए। आप इसके लिए तैयार हैं। ✅
पाठ का पुनरावलोकन
पुनरावलोकन: सहायक स्थान को input से अलग गिना जाता है, पुनरावृत्ति में O(depth) स्टैक स्थान लगता है, और समय-स्थान समझौता अधिकांश एल्गोरिदम-डिज़ाइन विकल्पों का आधार होता है।
एआई शिक्षक के साथ कोडिंग साक्षात्कार की तैयारी सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 90
- पाठ
- 360
अक्सर पूछे जाने वाले प्रश्न
क्या “स्थान-जटिलता और संतुलन” पाठ निःशुल्क है?
हाँ—“स्थान-जटिलता और संतुलन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“स्थान-जटिलता और संतुलन” में मैं क्या सीखूँगा?
कॉल स्टैक और सहायक डेटा संरचनाओं के लिए अतिरिक्त स्थान मापिए तथा memoisation और in-place एल्गोरिदम में समय-स्थान संतुलन पहचानिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ कोडिंग साक्षात्कार की तैयारी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या कोडिंग साक्षात्कार की तैयारी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर कोडिंग साक्षात्कार की तैयारी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“स्थान-जटिलता और संतुलन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस कोडिंग साक्षात्कार की तैयारी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर कोडिंग साक्षात्कार की तैयारी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- शुरुआत से Big-O संकेतन
- लूप और नेस्टेड लूप का विश्लेषण
- पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि
- स्थान-जटिलता और संतुलन