📘 CodingMarble Learn

एल्गोरिदम डिज़ाइन की तकनीकें

एल्गोरिदम बनाने के लिए पहले समस्या स्पष्ट करो: इनपुट डेटा, अपेक्षित आउटपुट और शर्तें। फिर साफ़, सीमित चरण लिखो: सामान्य भाषा में, सूची में, स्यूडोकोड या फ़्लोचार्ट में। बड़ी समस्या को ऊपर से नीचे (top-down) छोटे भागों में बाँटा जाता है या नीचे से ऊपर (bottom-up) छोटे जाँचे हुए टुकड़ों से बनाया जाता है। मुख्य तकनीकें: ब्रूट फ़ोर्स (सब आज़माओ), विभाजन और विजय (बाँटो, हल करो, जोड़ो; बाइनरी सर्च और मर्ज सॉर्ट जैसा आधा करना), लालची (हर बार अभी सबसे अच्छा दिखने वाला चुनाव; तेज़ पर हमेशा सबसे अच्छा नहीं), डायनेमिक प्रोग्रामिंग (हर छोटी उप-समस्या एक बार हल करके तालिका में सहेजो) और बैकट्रैकिंग (चुनाव आज़माओ, बंद गली पर वापस लो)। तकनीक और डेटा संरचना (ऐरे, स्टैक, बाइनरी ट्री) सही होने और दक्षता (समय जटिलता) देखकर चुनो।

🎬 कदम-दर-कदम कहानी

  1. पहले समस्या स्पष्ट करो। इनपुट: 8 संख्याएँ। आउटपुट: सबसे बड़ी। चरण: हर डिब्बा देखो और अब तक का सबसे बड़ा रखो।
  2. विभाजन और विजय: 1 से 16 में संख्या खोजने के लिए बीच वाली पूछो और आधा फेंक दो। सिर्फ़ 4 सवाल।
  3. लालची: हमेशा सबसे बड़ा फिट होने वाला सिक्का लो। यह तेज़ है, पर 1, 3, 4 के सिक्कों से 6 के लिए 3 सिक्के देता है, सबसे अच्छे 2 नहीं।
  4. डायनेमिक प्रोग्रामिंग: पहले छोटी रकम हल करो और हर उत्तर तालिका में सहेजो। तालिका 6 = 3 + 3 खोज लेती है।
  5. बैकट्रैकिंग: एक रास्ते पर चलो; बंद गली मिले तो पिछले मोड़ पर लौटकर दूसरा रास्ता लो, जब तक निकास न मिले।
  6. आपकी बारी: रकम और सिक्के चुनो। अनुमान लगाओ: क्या लालची तरीका सबसे कम सिक्के देता है? DP से मिलाओ।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

कोड से पहले इनपुट और आउटपुट क्यों लिखें?

अगर ठीक से पता न हो कि क्या आता है और क्या जाना चाहिए, तो चरण सही हैं या नहीं, जाँच नहीं सकते।

16 संख्याओं के लिए 4 सवाल कैसे काफ़ी हैं?

हर उत्तर आधा फेंक देता है: 16, 8, 4, 2, 1। धूसर डिब्बे हटाया गया आधा दिखाते हैं।

लालची गलत हो सकता है तो इसका उपयोग क्यों?

यह बहुत तेज़ और आसान है, और कई समस्याओं (सामान्य सिक्के, सबसे पहले खत्म होने वाली गतिविधि) में सही सिद्ध है।

DP सब कुछ आज़माने से कैसे अलग है?

यह हर छोटी रकम एक बार हल करके दोबारा इस्तेमाल करता है, इसलिए तालिका कदम-दर-कदम बढ़ती है, हर जोड़ आज़माना नहीं पड़ता।

क्या बैकट्रैकिंग शुरू से दोबारा चलती है?

नहीं। यह सिर्फ़ उस पिछले मोड़ तक लौटती है जहाँ कोई रास्ता बाकी है, फिर आगे बढ़ती है।

कैसे पता करूँ कि मेरे सिक्कों पर लालची चलेगा?

कई रकमों पर DP से मिलाओ। फ़्री प्ले में 1, 7, 10 आज़माओ।

समस्या को स्पष्ट करना: इनपुट, आउटपुट और चरण

कोड लिखने से पहले समस्या को ठीक-ठीक लिखो। यह विनिर्देश (specification) है।

चरण लिखना

एल्गोरिदम साफ़ चरणों की सीमित सूची है जो हर सही इनपुट को सही आउटपुट में बदलती है। इसे ऐसे लिखो:

छोटे इनपुट पर हाथ से जाँचो, मुश्किल वाले भी (सब बराबर, ऋणात्मक संख्याएँ, सिर्फ़ एक संख्या)।

ऊपर से नीचे और नीचे से ऊपर डिज़ाइन

ऊपर से नीचे (top-down), क्रमिक परिशोधन: पूरे काम से शुरू करो, उसे कुछ बड़े चरणों में बाँटो, फिर हर चरण को फिर बाँटो जब तक हर भाग आसानी से कोड न हो। उदाहरण: "रिपोर्ट कार्ड बनाओ" → अंक पढ़ो → औसत निकालो → ग्रेड दो → छापो।

नीचे से ऊपर (bottom-up): पहले छोटे, दोबारा काम आने वाले टुकड़े बनाओ और जाँचो (सबसे बड़ा खोजने वाला फ़ंक्शन, क्रम से लगाने वाला), फिर उन्हें जोड़कर पूरा प्रोग्राम बनाओ।

असली प्रोजेक्ट दोनों मिलाते हैं: योजना ऊपर से नीचे, बनाना और जाँचना नीचे से ऊपर।

विभाजन और विजय, और आधा करने की विधि

विभाजन और विजय के तीन कदम: समस्या को उसी तरह के छोटे भागों में बाँटो, हर भाग हल करो (अक्सर पुनरावर्तन/recursion से), उत्तरों को जोड़ो।

लालची एल्गोरिदम

लालची (greedy) एल्गोरिदम वह चुनाव करता है जो अभी सबसे अच्छा दिखे और उसे कभी नहीं बदलता।

पर लालची हमेशा सही नहीं: 1, 3, 4 के सिक्कों से 6 देने पर 4 + 1 + 1 (3 सिक्के), जबकि 3 + 3 में 2। लालची तरीके पर भरोसा करने के लिए उसे सिद्ध करना या पक्के तरीके से जाँचना होता है।

डायनेमिक प्रोग्रामिंग और बैकट्रैकिंग

डायनेमिक प्रोग्रामिंग (DP)

जब वही छोटी समस्याएँ बार-बार आएँ, हर एक को एक बार हल करके उत्तर तालिका में रखो। रकम a के लिए सबसे कम सिक्के: best[a] = 1 + min(best[a - c]), सभी सिक्कों c ≤ a पर, शुरुआत best[0] = 0। सिक्के 1, 3, 4 के लिए: best = 0, 1, 2, 1, 1, 2, 2। छोटे से बड़े की ओर तालिका भरना bottom-up है; याददाश्त वाला पुनरावर्तन top-down (memoization)। ज़्यादा के लिए अलग "डायनेमिक प्रोग्रामिंग" पाठ देखो।

बैकट्रैकिंग

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

ब्रूट फ़ोर्स

हर संभव उत्तर आज़माओ। हमेशा सही, पर अक्सर बहुत धीमा (2ⁿ उपसमुच्चय, n! क्रम)।

तकनीक चुनना: सही होना, दक्षता और डेटा संरचनाएँ

तकनीककबउदाहरणआम समय
ब्रूट फ़ोर्सइनपुट बहुत छोटा3 अंकों के सारे पासवर्डअक्सर 2ⁿ या n!
विभाजन और विजयभाग स्वतंत्र होंबाइनरी सर्च, मर्ज सॉर्टO(log n), O(n log n)
लालचीस्थानीय सबसे अच्छा चुनाव सुरक्षित सिद्ध होगतिविधि चयन, छुट्टेO(n log n)
डायनेमिक प्रोग्रामिंगउप-समस्याएँ दोहराएँसिक्का समस्या, सबसे छोटे रास्तेतालिका का आकार
बैकट्रैकिंगनियमों वाली खोजभूलभुलैया, सुडोकूघातांकी, पर छँटाई के साथ

सिद्ध करो

सही होना: दिखाओ कि एल्गोरिदम हमेशा रुकता है और सही आउटपुट देता है (लूप इनवेरिएंट, प्रमाण, या किनारे वाले मामलों पर जाँच)। दक्षता: n बढ़ने पर चरण गिनो (Big O) और दूसरे तरीकों से तुलना करो।

डेटा संरचनाएँ मदद करती हैं

तालिका (DP) के लिए ऐरे, बैकट्रैकिंग के लिए स्टैक (कहाँ लौटना है याद रखने को), स्तर-दर-स्तर खोज के लिए क्यू। बाइनरी ट्री में हर नोड के अधिकतम दो बच्चे होते हैं; बाइनरी सर्च ट्री में छोटी कुंजियाँ बाएँ और बड़ी दाएँ जाती हैं, इसलिए हर स्तर पर खोज का काम आधा होता है, बिल्कुल बाइनरी सर्च की तरह।

करके देखो: सिक्के और अनुमान का खेल

  1. दोस्त के साथ 1-100 अनुमान का खेल खेलो। हमेशा बीच वाली पूछो। क्या 7 सवालों में हमेशा जीत सकते हो? (2⁷ = 128।)
  2. 1, 3, 4 के सिक्कों के लिए 0 से 10 तक की DP तालिका कागज़ पर लिखो। लालची कहाँ गलत होता है?
  3. 3D का आख़िरी कदम खोलो। सिक्के 1, 7, 10 और रकम 14 लो। लालची 10 + 1 + 1 + 1 + 1 देता है; DP 7 + 7।
  4. "सूची में सबसे छोटी संख्या खोजो" की चरण सूची लिखो और 5, 5, 5 तथा सिर्फ़ एक संख्या पर जाँचो।

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. n संख्याओं में सबसे बड़ी खोजने का विनिर्देश और चरण सूची लिखो।

इनपुट: n ≥ 1 संख्याएँ। आउटपुट: सबसे बड़ी। चरण: 1. best ← पहली संख्या। 2. हर दूसरी संख्या x के लिए: अगर x > best, best ← x। 3. best दिखाओ। 4, 9, 2, 7, 12, 5, 10, 3 के लिए 7 तुलनाओं के बाद आउटपुट 12।

2. 1 से 1000 में संख्या खोजने के लिए आधा करने वाले कितने सवाल चाहिए?

हर सवाल सीमा आधी करता है: 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1। यानी 10 सवाल (2¹⁰ = 1024 ≥ 1000)।

3. 50, 20, 10, 5, 2, 1 के सिक्कों से 87 लालची तरीके से दो।

50 (37 बचे), 20 (17), 10 (7), 5 (2), 2 (0): 50 + 20 + 10 + 5 + 2 = 5 सिक्के।

4. सिक्के 1, 3, 4 के लिए 7 तक DP तालिका भरो।

best[0]=0, [1]=1, [2]=2, [3]=1, [4]=1, [5]=min(best4, best2, best1)+1=2, [6]=min(best5, best3, best2)+1=2, [7]=min(best6, best4, best3)+1=2 (3 + 4)।

5. गतिविधियाँ (शुरू-खत्म): A 9-11, B 10-12, C 11-13, D 12-14, E 13-15। बिना टकराए सबसे ज़्यादा गतिविधियाँ चुनो।

सबसे पहले खत्म होने वाली के लालची नियम से: A (11 पर खत्म), फिर C (11 से 13), फिर E (13 से)। 3 गतिविधियाँ: A, C, E।

6. ऊपर से नीचे योजना बनाओ: एक प्रोग्राम जो कक्षा का औसत और टॉपर बताए।

स्तर 1: डेटा पढ़ो → गणना → छापो। स्तर 2: नाम और अंक सूचियों में पढ़ो; कुल और औसत निकालो; सबसे बड़ा अंक और उसका नाम खोजो; दोनों छापो। फिर हर टुकड़ा नीचे से ऊपर कोड और जाँच होता है।

आम गलतियाँ

अभ्यास क्विज़

1. समस्या के विनिर्देश में क्या होना चाहिए?
2. 16 क्रमबद्ध चीज़ों पर बाइनरी सर्च को अधिकतम लगभग चाहिए:
3. कौन-सी तकनीक हमेशा अभी सबसे अच्छा दिखने वाला चुनाव लेती है?
4. डायनेमिक प्रोग्रामिंग अच्छी चलती है जब:
5. भूलभुलैया में बंद गली के बाद पिछले मोड़ पर लौटना है:

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

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

एल्गोरिदम डिज़ाइन की मुख्य तकनीकें कौन-सी हैं?

ब्रूट फ़ोर्स, विभाजन और विजय, लालची, डायनेमिक प्रोग्रामिंग और बैकट्रैकिंग, जो इनपुट और आउटपुट तय करने के बाद चुनी जाती हैं।

लालची और डायनेमिक प्रोग्रामिंग में क्या अंतर है?

लालची हर कदम पर एक सबसे अच्छा दिखने वाला चुनाव करता है और पीछे नहीं देखता। DP छोटी उप-समस्याओं के सारे विकल्प देखकर सबसे अच्छे उत्तर सहेजता है, इसलिए दोहराई उप-समस्याओं में असली सबसे अच्छा उत्तर देता है।

ऊपर से नीचे और नीचे से ऊपर डिज़ाइन क्या है?

ऊपर से नीचे पूरे काम को छोटे चरणों में बाँटता है; नीचे से ऊपर पहले छोटे भाग बनाकर जाँचता और जोड़ता है। ज़्यादातर प्रोग्राम दोनों लेते हैं।

यह कहाँ पढ़ाया जाता है

पोलैंडSzkoła podstawowa, klasa VIIUnderstanding, analysing and solving problems
पोलैंडSzkoła podstawowa, klasa VIIIUnderstanding, analysing and solving problems
पोलैंडLiceum ogólnokształcące, klasa IUnderstanding, analysing and solving problems
चीन高三Electives (选修)

पहले यह पढ़ें

आगे पढ़ें

इससे जुड़े पाठ

सभी कंप्यूटर विज्ञान पाठ