DSA Interview Prep · पाठ

खातों का विलय और जुड़े हुए घटक

ईमेल साझा करने वाले खातों को ईमेलों को DSU नोड मानकर समूहित कीजिए, फिर मर्ज किए गए खातों का पुनर्निर्माण करने के लिए प्रत्येक घटक के सभी ईमेल एकत्र कीजिए।

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

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

समस्या: खातों का विलय

खातों का विलय समस्या (LeetCode 721) में आपको खातों की एक सूची दी जाती है। प्रत्येक खाता पाठ-श्रृंखलाओं की एक सूची होता है, जिसमें पहला तत्व खाते का नाम और बाकी ईमेल पते होते हैं। यदि दो खातों में कम-से-कम एक ईमेल समान हो, तो वे same व्यक्ति के होते हैं। same व्यक्ति के सभी खातों का विलय करें और क्रमबद्ध ईमेल सूचियाँ लौटाएँ।

मूल रूप से यह संयोजित घटकों की समस्या है, जिसमें ईमेल शीर्ष होते हैं और साझा खाता उन्हें जोड़ता है। DSU इसके लिए आदर्श साधन है: एक ही खाते के सभी ईमेल का union करें, फिर प्रत्येक घटक के ईमेल एकत्रित करें।

# Example input
accounts = [
    ['John', 'john@mail.com', 'john1@mail.com'],
    ['John', 'john2@mail.com'],
    ['Mary', 'mary@mail.com'],
    ['John', 'john1@mail.com', 'john2@mail.com'],
]
# john@mail.com and john1@mail.com are in account[0]
# john1@mail.com and john2@mail.com are in account[3]
# => john@, john1@, john2@ are all the same person
# Expected output:
# ['John', 'john1@mail.com', 'john2@mail.com', 'john@mail.com']
# ['Mary', 'mary@mail.com']
print('Goal: merge accounts sharing any email into one account')

ईमेलों को पूर्णांक ID में बदलना

DSU पूर्णांक सूचकांकों पर काम करता है, लेकिन हमारे शीर्ष ईमेल पाठ-श्रृंखलाएँ हैं। हमें हर अलग ईमेल को एक पूर्णांक ID में बदलना होगा। हमें यह भी याद रखना होगा कि प्रत्येक ईमेल का स्वामी कौन-सा नाम है। क्रमशः बढ़ती हुई ID देने के लिए एक शब्दकोश email_to_id का उपयोग करें और प्रत्येक ईमेल से जुड़े खाते के नाम का लेखा रखने के लिए email_to_name का उपयोग करें।

हर अलग ईमेल को एक ID मिलती है। यदि वही ईमेल कई खातों में दिखाई दे, तो उसे वही ID मिलेगी — और एक खाते के ईमेलों की ID का union करने से वे एक ही घटक में जुड़ जाएँगे। मूल ईमेल की ID से जुड़ा नाम ही विलय किए गए खाते का नाम होता है।

accounts = [
    ['John', 'john@mail.com', 'john1@mail.com'],
    ['John', 'john2@mail.com'],
    ['Mary', 'mary@mail.com'],
    ['John', 'john1@mail.com', 'john2@mail.com'],
]

email_to_id = {}
email_to_name = {}
next_id = [0]

for account in accounts:
    name = account[0]
    for email in account[1:]:
        if email not in email_to_id:
            email_to_id[email] = next_id[0]
            next_id[0] += 1
        email_to_name[email] = name

print('Total unique emails:', len(email_to_id))
for email, eid in email_to_id.items():
    print(f'  {email} => id {eid} (owner: {email_to_name[email]})')

प्रत्येक खाते के भीतर ईमेलों का union

हर खाते के लिए हम साथ में सूचीबद्ध सभी ईमेलों की ID का union करते हैं। हम खाते के पहले ईमेल को प्रतिनिधि मानते हैं और हर दूसरे ईमेल की ID का उसके साथ union करते हैं। इससे खाते के सभी ईमेल एक ही घटक में जुड़ जाते हैं।

सभी खातों को संसाधित करने के बाद, जो ईमेल साथ दिखाई दिए थे (सीधे या विभिन्न खातों में साझा ईमेलों के माध्यम से), उन सभी का DSU मूल same होता है। यही वह महत्वपूर्ण चरण है जो कई खातों के बीच संयोजकता को आगे फैलाता है।

class DSU:
    def __init__(self, n):
        self.parent = list(range(n))
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    def union(self, x, y):
        self.parent[self.find(x)] = self.find(y)

# After building email_to_id (from previous step)
# email_to_id = {'john@mail.com':0, 'john1@mail.com':1,
#                'john2@mail.com':2, 'mary@mail.com':3}

dsu = DSU(5)  # 4 unique emails

# For account ['John', 'john@mail.com', 'john1@mail.com']:
dsu.union(0, 1)    # john@ and john1@ share account => same component

# For account ['John', 'john1@mail.com', 'john2@mail.com']:
dsu.union(1, 2)    # john1@ and john2@ share account => same component

# Now 0,1,2 all share a root; 3 (mary) is separate
print('find(0)==find(2)?', dsu.find(0) == dsu.find(2))  # True
print('find(0)==find(3)?', dsu.find(0) == dsu.find(3))  # False

प्रत्येक घटक के ईमेल एकत्रित करना

सभी union पूरे होने के बाद हम हर ईमेल को क्रम से देखते हैं, उसका DSU मूल find करते हैं और सूचियों के शब्दकोश का उपयोग करके मूल के आधार पर ईमेलों को समूहों में रखते हैं। मूल ID कुंजी बनती है। अंत में, प्रत्येक समूह के लिए खाते का नाम प्राप्त करें, ईमेल सूची को sort करें और नाम को सबसे आगे जोड़ें।

समस्या के अनुसार ईमेलों को क्रमबद्ध करना आवश्यक है — विलय किए गए खाते के भीतर ईमेल शब्दकोशीय क्रम में होने चाहिए। नाम समूह के किसी भी ईमेल से प्राप्त किया जा सकता है (एक ही घटक के सभी ईमेल same व्यक्ति के होते हैं)।

from collections import defaultdict

# After DSU unions, group by root
def collect_components(email_to_id, email_to_name, dsu):
    root_to_emails = defaultdict(list)
    for email, eid in email_to_id.items():
        root = dsu.find(eid)
        root_to_emails[root].append(email)

    result = []
    for root, emails in root_to_emails.items():
        # Find the name from any email in this group
        name = email_to_name[emails[0]]
        result.append([name] + sorted(emails))
    return result

# Mock data for illustration
email_to_id = {'john@m.com':0,'john1@m.com':1,'john2@m.com':2,'mary@m.com':3}
email_to_name = {e:'John' for e in list(email_to_id)[:3]}
email_to_name['mary@m.com'] = 'Mary'

class DSU:
    def __init__(self,n): self.p=list(range(n))
    def find(self,x): self.p[x]=self.p[self.p[x]] if self.p[x]!=x else x; return self.p[x] if self.p[x]==x else self.find(self.p[x])
    def union(self,x,y): self.p[self.find(x)]=self.find(y)

dsu=DSU(4); dsu.union(0,1); dsu.union(1,2)
for row in collect_components(email_to_id, email_to_name, dsu):
    print(row)

खातों के विलय का पूर्ण समाधान

यह पूरा समाधान तीनों चरणों को जोड़ता है: ईमेल से ID का मानचित्र बनाना, प्रत्येक खाते के भीतर ईमेलों का union करना और DSU मूल के आधार पर समूहित ईमेल एकत्रित करना। कुल समय जटिलता O(n × m × alpha(n × m)) है, जहाँ n खातों की संख्या और m प्रत्येक खाते में ईमेलों की अधिकतम संख्या है; यह प्रभावी रूप से O(n × m) है।

स्थान जटिलता ईमेल मानचित्रों और DSU सारणियों के लिए O(n × m) है। यह समाधान संक्रमणीय विलय को सही ढंग से संभालता है: यदि खाता A का ईमेल X खाता B के साथ साझा हो और खाता B का ईमेल Y खाता C के साथ साझा हो, तो A, B और C सभी एक ही समूह में विलय हो जाते हैं।

from collections import defaultdict

def accounts_merge(accounts):
    email_to_id = {}
    email_to_name = {}
    eid = 0

    for account in accounts:
        name = account[0]
        for email in account[1:]:
            if email not in email_to_id:
                email_to_id[email] = eid
                eid += 1
            email_to_name[email] = name

    parent = list(range(eid))

    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    def union(x, y):
        parent[find(x)] = find(y)

    for account in accounts:
        first_id = email_to_id[account[1]]
        for email in account[2:]:
            union(first_id, email_to_id[email])

    root_to_emails = defaultdict(list)
    for email, i in email_to_id.items():
        root_to_emails[find(i)].append(email)

    return [[email_to_name[emails[0]]] + sorted(emails)
            for emails in root_to_emails.values()]

accounts = [['John','a@m.com','b@m.com'],['John','c@m.com'],
            ['Mary','d@m.com'],['John','b@m.com','c@m.com']]
for row in accounts_merge(accounts):
    print(row)

खातों को मर्ज करने का BFS/DFS विकल्प

एक वैकल्पिक तरीका ईमेल-से-खातों का ग्राफ बनाता है, जिसमें ईमेल नोड होते हैं और एक ही खाते में दिखाई देने वाले ईमेल को किनारे जोड़ते हैं। फिर BFS/DFS प्रत्येक कनेक्टेड घटक को खोजता है। यह तरीका सही है, लेकिन इसमें ग्राफ को स्पष्ट रूप से बनाना और प्रत्येक ऐसे ईमेल से BFS चलाना पड़ता है जिस पर अभी तक नहीं पहुँचा गया है — DSU की तुलना में इसमें अधिक कोड होता है और तर्क समझना कठिन होता है।

DSU अधिक साफ़ है, क्योंकि संघ-खोज संरचना बिना किसी स्पष्ट सन्निकटता सूची की आवश्यकता के घटक-सदस्यता को स्वाभाविक रूप से दर्शाती है। यहाँ BFS तभी बेहतर है जब आपको दो खातों के बीच साझा ईमेलों का वास्तविक पथ या श्रृंखला फिर से बनानी हो।

# BFS alternative (for comparison)
from collections import defaultdict, deque

def accounts_merge_bfs(accounts):
    email_to_accounts = defaultdict(set)
    for i, account in enumerate(accounts):
        for email in account[1:]:
            email_to_accounts[email].add(i)

    visited_accounts = set()
    result = []

    for i, account in enumerate(accounts):
        if i in visited_accounts:
            continue
        queue = deque([i])
        emails_in_group = set()
        while queue:
            acc_idx = queue.popleft()
            if acc_idx in visited_accounts:
                continue
            visited_accounts.add(acc_idx)
            for email in accounts[acc_idx][1:]:
                emails_in_group.add(email)
                for j in email_to_accounts[email]:
                    queue.append(j)
        result.append([account[0]] + sorted(emails_in_group))
    return result

accounts = [['John','a@m.com','b@m.com'],['John','b@m.com','c@m.com'],['Mary','d@m.com']]
for row in accounts_merge_bfs(accounts):
    print(row)

सामान्यीकरण: ग्राफ के कनेक्टेड घटक

खातों को मर्ज करने का पैटर्न किसी भी लेबल वाले कनेक्टेड-घटक समस्या पर लागू किया जा सकता है: आपके पास वस्तुओं का एक समूह है, कुछ वस्तुओं को समतुल्य यानी जुड़ा हुआ घोषित किया गया है, और आप सभी संक्रमणात्मक रूप से समतुल्य वस्तुओं को एक साथ समूहित करना चाहते हैं। इसके उदाहरणों में समूहीकरण संबंधी समस्याएँ, सामाजिक नेटवर्क के मित्र समूह और दोहराए गए अभिलेखों की पहचान शामिल हैं।

सामान्य एल्गोरिदम हमेशा यह होता है: (1) प्रत्येक वस्तु को एक पूर्णांक ID दें, (2) समतुल्य घोषित वस्तुओं के ID का union करें, (3) वस्तुओं को उनके DSU मूल के आधार पर समूहित करें। DSU मूलतः समतुल्यता संबंधों के लिए एक समूह बनाने वाला इंजन है।

# Generalised grouping template
def group_equivalents(items, equivalences):
    item_to_id = {item: i for i, item in enumerate(items)}
    n = len(items)
    parent = list(range(n))

    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    def union(x, y):
        parent[find(x)] = find(y)

    for a, b in equivalences:
        if a in item_to_id and b in item_to_id:
            union(item_to_id[a], item_to_id[b])

    groups = {}
    for item in items:
        root = find(item_to_id[item])
        groups.setdefault(root, []).append(item)
    return list(groups.values())

# Example: merging duplicate customer records
customers = ['Alice-NY','Alice-LA','Bob','Alice-TX','Carol']
links = [('Alice-NY','Alice-LA'),('Alice-LA','Alice-TX')]
print(group_equivalents(customers, links))

विशेष स्थितियों को संभालना

खातों को मर्ज करने में महत्वपूर्ण विशेष स्थितियाँ:

  • एक-ईमेल वाले खाते: केवल एक ईमेल वाला खाता अपना अलग घटक बनाता है, जब तक कि कोई दूसरा खाता उस ईमेल को साझा न करे।
  • एक ही नाम, अलग-अलग लोग: दो खातों में 'John' का दिखाई देना यह नहीं दर्शाता कि वे एक ही व्यक्ति हैं — केवल साझा ईमेल खातों को मर्ज करते हैं। नाम प्रत्येक ईमेल के साथ संग्रहीत होता है, घटक के साथ नहीं।
  • खाली खाते: बिना ईमेल वाले खाते को छोड़ देना चाहिए, ताकि अनुक्रमणिका संबंधी त्रुटियाँ न हों।

हमेशा जाँचें कि आपका समाधान केवल एक ही नाम साझा करने वाले खातों को मर्ज न कर दे। DSU के संबंध पूरी तरह साझा ईमेल पतों से निर्धारित होते हैं।

# Edge case: two Johns with no shared email => separate output
accounts = [
    ['John', 'john_a@m.com'],
    ['John', 'john_b@m.com'],   # different email => different component
    ['Mary'],                    # no emails => skip
]

def accounts_merge_safe(accounts):
    email_to_id = {}; email_to_name = {}; eid = 0
    for account in accounts:
        name = account[0]
        for email in account[1:]:
            if email not in email_to_id:
                email_to_id[email] = eid; eid += 1
            email_to_name[email] = name

    parent = list(range(eid))
    def find(x):
        while parent[x]!=x: parent[x]=parent[parent[x]]; x=parent[x]
        return x
    def union(x,y): parent[find(x)]=find(y)

    for account in accounts:
        if len(account) < 2: continue          # skip no-email accounts
        first = email_to_id[account[1]]
        for email in account[2:]:
            union(first, email_to_id[email])

    from collections import defaultdict
    groups = defaultdict(list)
    for email, i in email_to_id.items():
        groups[find(i)].append(email)
    return [[email_to_name[e[0]]] + sorted(e) for e in groups.values()]

for row in accounts_merge_safe(accounts):
    print(row)

ग्राफ में कनेक्टेड घटकों की संख्या

एक संबंधित समस्या (LeetCode 323) अनिर्देशित ग्राफ में कनेक्टेड घटकों की संख्या पूछती है। यह खातों को मर्ज करने की समस्या से सरल है: n नोड वाले DSU को प्रारंभ करें, सभी किनारों को union के साथ संसाधित करें, फिर अलग-अलग मूलों की गिनती करें।

घटकों की गिनती करने का सबसे संक्षिप्त तरीका यह है कि n से शुरू होने वाला count चर रखें और हर बार सफल union से दो अलग-अलग घटक मिलने पर इसकी गिनती 1 घटा दें। दूसरा तरीका यह है कि अंत में उन नोडों i की गिनती करें जिनके लिए find(i) == i हो।

def count_components(n, edges):
    parent = list(range(n))

    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    count = n
    for u, v in edges:
        pu, pv = find(u), find(v)
        if pu != pv:
            parent[pu] = pv
            count -= 1
    return count

print(count_components(5, [[0,1],[1,2],[3,4]]))  # 2: {0,1,2} and {3,4}
print(count_components(5, [[0,1],[1,2],[2,3],[3,4]]))  # 1: all connected
print(count_components(5, []))   # 5: no edges, all isolated

सबसे छोटा और सबसे बड़ा घटक

आकार की जानकारी रखने वाले DSU के बाद आप “सबसे बड़े कनेक्टेड घटक का आकार क्या है?” या “ठीक 3 नोड वाले कितने घटक हैं?” जैसे प्रश्नों का उत्तर आकार-सारणी में मूल नोडों को O(n) में देखकर दे सकते हैं।

ये प्रश्न ग्रिड में “सबसे बड़ा जुड़ा हुआ द्वीप खोजें” या “सबसे छोटा नेटवर्क विभाजन पहचानें” जैसी समस्याओं में दिखाई देते हैं। सभी union पूरे हो जाने के बाद, उन नोडों i को देखें जिनके लिए find(i) == i हो (ये मूल होते हैं) और उनके आकार जाँचें।

class DSU:
    def __init__(self, n):
        self.parent = list(range(n))
        self.size = [1] * n
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    def union(self, x, y):
        px, py = self.find(x), self.find(y)
        if px == py: return
        if self.size[px] < self.size[py]: px, py = py, px
        self.parent[py] = px
        self.size[px] += self.size[py]

def component_stats(n, edges):
    dsu = DSU(n)
    for u, v in edges:
        dsu.union(u, v)
    sizes = [dsu.size[i] for i in range(n) if dsu.find(i) == i]
    print('Component sizes:', sizes)
    print('Largest component:', max(sizes))
    print('Smallest component:', min(sizes))
    print('Number of components:', len(sizes))

component_stats(8, [(0,1),(1,2),(3,4),(5,6),(6,7)])

DSU समस्याओं के लिए साक्षात्कार सुझाव

जब आपको समूहों को मिलाने, जुड़ाव संबंधी प्रश्नों या अतिरिक्त किनारा खोजने वाली समस्या मिले, तो तुरंत DSU के बारे में सोचें। साक्षात्कार के दौरान दोनों अनुकूलनों (पथ संपीड़न + रैंक/आकार के अनुसार union) का उल्लेख करें, ताकि आपके गहरे ज्ञान का प्रदर्शन हो, भले ही दी गई सीमाओं में सरल प्रारंभिक DSU भी सफल हो जाए।

इन सामान्य गलतियों से बचें: दोनों सिरों के पहले से जुड़े होने की स्थिति को न संभालना (union में कोई बदलाव नहीं होता), 0-आधारित और 1-आधारित अनुक्रमण का गलत उपयोग करना, और खातों को मर्ज करने के परिणाम को क्रमबद्ध न करना (समस्या में क्रमबद्ध ईमेल सूचियाँ आवश्यक हैं)। कोड लिखने से पहले हमेशा इनपुट की सीमाएँ स्पष्ट कर लें।

# Interview checklist for DSU problems
checklist = [
    '1. Identify: is this a grouping/connectivity/cycle problem?',
    '2. Map problem entities to integer node IDs if needed',
    '3. Implement DSU with path compression + union by rank/size',
    '4. Process all relationships (edges/pairs) with union()',
    '5. Answer queries using find() and size/count tracking',
    '6. Handle edge cases: already connected, single nodes, no edges',
    '7. Check output format: sorted? 1-indexed? Name included?',
    '8. State time complexity: O(n * alpha(n)) ~ O(n)',
]
for item in checklist:
    print(item)

त्वरित जाँच

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

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

इस पाठ में आपने सीखा: खातों को मर्ज करना एक कनेक्टेड-घटक समस्या है, जिसमें ईमेल नोड होते हैं और खाते ईमेल को जोड़ते हैं, DSU प्रत्येक ईमेल को पूर्णांक ID से मानचित्रित करके, प्रत्येक खाते के भीतर ID का union करके और मूल के आधार पर समूह बनाकर इसे हल करता है, और यही DSU समूह बनाने का प्रारूप किसी भी समतुल्यता-वर्ग या समूह बनाने वाली समस्या पर लागू होता है। अब हम बिट हेरफेर की ओर बढ़ेंगे, जिसकी शुरुआत मूलभूत AND, OR, XOR, NOT और शिफ्ट संचालकों से होगी।

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

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

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

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

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

क्या “खातों का विलय और जुड़े हुए घटक” पाठ निःशुल्क है?

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

“खातों का विलय और जुड़े हुए घटक” में मैं क्या सीखूँगा?

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

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

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

“खातों का विलय और जुड़े हुए घटक” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. पथ संपीड़न के साथ DSU
  2. रैंक के आधार पर Union और Inverse Ackermann सीमा
  3. अनावश्यक कड़ी और चक्र का पता लगाना
  4. खातों का विलय और जुड़े हुए घटक
← DSA Interview Prep पर वापस जाएँ