📘 CodingMarble Learn

बाँटो और जीतो (Divide and Conquer)

बाँटो और जीतो में बड़ी समस्या तीन चालों में हल होती है: उसे उसी तरह की छोटी समस्याओं में बाँटो (divide), हर छोटी समस्या हल करो (conquer), अक्सर रिकर्शन से सबसे आसान स्थिति तक, और फिर उत्तर जोड़ो (combine)। मर्ज सॉर्ट, बाइनरी सर्च, क्विकसॉर्ट और तेज़ घात इसी तरीके से चलते हैं।

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

  1. समस्या: 8 डिब्बे हैं, ऊँचाई अलग-अलग। इन्हें छोटे से बड़े क्रम में सजाना है। सबको एक साथ सजाना भारी काम है।
  2. बाँटो (Divide): पूरी कतार को बीच से दो आधे हिस्सों में तोड़ दो: 4 और 4।
  3. फिर बाँटो: 4 के हिस्से 2 और 2 में, फिर 2 के हिस्से 1-1 में। अकेला डिब्बा पहले से क्रम में है। यही सबसे आसान समस्या है।
  4. जीतो और जोड़ो (Conquer, Combine): पास-पास के दो डिब्बों को सही क्रम में मिलाकर जोड़ियाँ बनाओ।
  5. जोड़ियों को मिलाकर चार-चार के क्रमबद्ध समूह बनाओ, और अंत में आठों एक क्रमबद्ध कतार में।
  6. खुद करो: स्लाइडर से अवस्थाएँ बदलो और "नई कतार" दबाकर नई गड़बड़ कतार बनाओ।

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

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

बाँटते ही क्यों हैं?

छोटी समस्याएँ आसान होती हैं। अकेला डिब्बा पहले से क्रम में है और दो छोटी क्रमबद्ध कतारें मिलाना सरल है। बाँटने वाले चरण देखो।

बाँटना कहाँ रुकता है?

अकेले तत्वों पर, यानी आधार स्थिति पर। चरण 2 में हर डिब्बा अकेला दिखता है।

क्या बाँटते समय कुछ सजता है?

नहीं। डिब्बे बस दूर खिसकते हैं। क्रम मिलाते समय बनता है, चरण 3 में।

मिलाना (merge) कैसे होता है?

हर समूह का पहला डिब्बा देखो, छोटा वाला लो, दोहराओ। जोड़ियाँ बनते देखो।

8 डिब्बों के लिए कितने स्तर हैं?

तीन (8 से 4 से 2 से 1), क्योंकि 8 = 2×2×2।

क्या मैं डिब्बे फिर मिला सकता हूँ?

हाँ, "नई कतार" दबाओ और स्लाइडर से अवस्थाएँ देखो।

सामान्य विचार

बाँटो और जीतो (रोमानियाई में Divide et Impera, लैटिन में "बाँटो और राज करो") के तीन भाग हैं:

  1. समस्या को उसी तरह की छोटी समस्याओं में बाँटो (divide)।
  2. हल करो (conquer): हर छोटी समस्या हल करो। बहुत छोटी हो (आधार स्थिति, base case) तो सीधे हल करो, वरना वही तरकीब फिर लगाओ (रिकर्शन)।
  3. छोटे उत्तरों को जोड़कर बड़ी समस्या का उत्तर बनाओ (combine)।

यह तब चलता है जब छोटी समस्याएँ एक-दूसरे पर निर्भर न हों और जोड़ना सस्ता हो। फ़ंक्शन खुद को कैसे बुलाता है, यह रिकर्शन में देखें।

मर्ज सॉर्ट: सबसे मशहूर उदाहरण

n संख्याओं की सूची सजाओ:

mergeSort(list):
  if list has 1 item: return list
  left  = mergeSort(first half)
  right = mergeSort(second half)
  return merge(left, right)

दो क्रमबद्ध सूचियों को मिलाना (merge): दोनों के पहले तत्व देखो, छोटा वाला निकालो, और तब तक दोहराओ जब तक दोनों खाली न हों। n तत्व मिलाने में लगभग n कदम लगते हैं।

बँटवारे के लगभग log₂ n स्तर होते हैं (8 तत्व: 3 स्तर) और हर स्तर पर लगभग n काम होता है, इसलिए कुल लगभग n log₂ n कदम। यह सरल तरीके (बबल सॉर्ट, लगभग n² कदम) से बहुत तेज़ है।

बाइनरी सर्च: आधा करते जाओ

क्रमबद्ध सूची में संख्या खोजनी हो तो उसे बीच के तत्व से मिलाओ। छोटी हो तो केवल बायाँ आधा देखो; बड़ी हो तो केवल दायाँ। हर जाँच में आधे तत्व छूट जाते हैं।

n तत्वों के लिए अधिकतम लगभग log₂ n जाँचें चाहिए: 16 के लिए 4, 1000 के लिए 10 और 10 लाख के लिए केवल 20।

अन्य उपयोग

कब काम नहीं आता

यदि छोटी समस्याएँ एक-दूसरे से मिलती हैं (वही उप-समस्या बार-बार आती है, जैसे फ़िबोनाची में) तो साधारण बाँटो-और-जीतो काम दोहराता है। तब डायनेमिक प्रोग्रामिंग लो। कई विकल्प आज़माकर वापस लौटना हो तो बैकट्रैकिंग लो।

करके देखो

8 ताश के पत्ते लो। उन्हें 4-4 के दो ढेरों में, फिर 2-2 में, फिर अकेले पत्तों में बाँटो। फिर जोड़ियाँ मिलाते जाओ, हमेशा ऊपर का छोटा पत्ता लेकर। गिनो कितने स्तर बने। 3D में स्लाइडर चलाने से पहले अगली अवस्था का अंदाज़ा लगाओ।

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

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

1. 8 तत्वों को अकेले तत्वों तक बाँटो। बँटवारे के कितने स्तर?

8 → 4 → 2 → 1। यानी 3 स्तर (log₂ 8 = 3)।

2. क्रमबद्ध सूचियाँ [2, 5, 9] और [3, 4, 10] मिलाओ।

हर बार आगे का छोटा लो: 2, 3, 4, 5, 9, 10। परिणाम: [2, 3, 4, 5, 9, 10]।

3. [5, 2, 7, 1] को मर्ज सॉर्ट से सजाओ। चरण दिखाओ।

बाँटो: [5, 2] और [7, 1]। फिर बाँटो: [5] [2] [7] [1]। जोड़ियाँ मिलाओ: [2, 5] और [1, 7]। मिलाओ: [1, 2, 5, 7]।

4. 1000 क्रमबद्ध संख्याओं के लिए बाइनरी सर्च में अधिकतम कितनी जाँचें?

2¹⁰ = 1024 ≥ 1000, इसलिए अधिकतम 10 जाँचें।

5. तेज़ घात से 2¹⁰ निकालो। कितने गुणा लगे?

2¹⁰ = (2⁵)²। 2⁵ = 2 × (2²)²। 2² में 1 गुणा, (2²)² में 1 और, ×2 में 1 और, अंतिम वर्ग में 1 और: 9 की जगह 4 गुणा।

6. [3, 8, 15, 23, 31, 42, 57] में 23 खोजो। बाइनरी सर्च दिखाओ।

बीच का तत्व 23 है (7 में से चौथा)। 1 जाँच में मिल गया।

आम गलतियाँ

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

1. बाँटो-और-जीतो के तीन भाग हैं:
2. 16 तत्वों पर मर्ज सॉर्ट में बँटवारे के लगभग कितने स्तर?
3. बाइनरी सर्च के लिए सूची होनी चाहिए:
4. मर्ज सॉर्ट में असली सजाने का काम कब होता है?
5. तेज़ घात से a⁸ कितने गुणा में निकलता है?

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

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

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

बाँटो-और-जीतो और रिकर्शन में क्या अंतर है?

रिकर्शन एक औज़ार है जिसमें फ़ंक्शन खुद को बुलाता है। बाँटो-और-जीतो एक योजना है (बाँटो, हल करो, जोड़ो), जिसे अक्सर रिकर्शन से लिखा जाता है।

मर्ज सॉर्ट बबल सॉर्ट से तेज़ क्यों है?

बबल सॉर्ट में लगभग n² कदम लगते हैं। मर्ज सॉर्ट में लगभग n × log₂ n। 1000 तत्वों के लिए लगभग 10,000 कदम बनाम 10,00,000 कदम।

क्या बाइनरी सर्च भी बाँटो-और-जीतो है?

हाँ, सरल रूप में। वह सूची को आधा करती है, पर केवल एक आधा हल करती है, इसलिए जोड़ने को कुछ नहीं बचता।

पहले यह पढ़ें

आगे पढ़ें

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

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