विभाजन-और-कन्कर एल्गोरिथ्म

कंप्यूटर विज्ञान में, फूट डालो और जीतो एल्गोरिथ्म डिजाइन प्रतिमान है। डिवाइड-एंड-कॉनकोर एल्गोरिदम रिकर्सन (कंप्यूटर विज्ञान) समस्या को ही या संबंधित प्रकार की दो या दो से अधिक उप-समस्याओं में तोड़ देता है, जब तक कि ये सीधे हल करने के लिए पर्याप्त सरल न हो जाएं। उप-समस्याओं के समाधान को तब मूल समस्या का समाधान देने के लिए संयोजित किया जाता है।

विभाजन और जीत तकनीक कई समस्याओं के लिए कुशल एल्गोरिदम का आधार है, जैसे छँटाई एल्गोरिथ्म (उदाहरण के लिए, त्वरित सॉर्ट, मर्ज़ सॉर्ट ), गुणन एल्गोरिदम (उदाहरण के लिए, कलन विधि ]]), अंक समस्या की निकटतम जोड़ी ढूंढना, वाक्य रचनात्मक विश्लेषण (उदाहरण के लिए, टॉप-डाउन पार्सर्स), और असतत फूरियर ट्रांसफॉर्म ([[असतत फूरियर रूपांतरण]]) की गणना करना। कुशल फूट डालो और जीतो एल्गोरिदम डिजाइन करना मुश्किल हो सकता है। जैसा कि गणितीय आगमन में होता है, अक्सर समस्या को पुनरावर्ती समाधान के लिए अनुकूल बनाने के लिए सामान्यीकरण करना आवश्यक होता है। विभाजन और जीत एल्गोरिथ्म की शुद्धता आमतौर पर गणितीय प्रेरण द्वारा सिद्ध होती है, और इसकी कम्प्यूटेशनल लागत अक्सर पुनरावृत्ति संबंधों को हल करके निर्धारित की जाती है।

फूट डालो और राज करो
फूट डालो और जीतो प्रतिमान का उपयोग अक्सर किसी समस्या का इष्टतम समाधान खोजने के लिए किया जाता है। इसका मूल विचार दी गई समस्या को दो या अधिक समान, लेकिन सरल, उप-समस्याओं में विघटित करना है, उन्हें बारी-बारी से हल करना और दी गई समस्या को हल करने के लिए उनके समाधानों की रचना करना है। पर्याप्त सरलता की समस्याएं सीधे हल हो जाती हैं। उदाहरण के लिए, n प्राकृतिक संख्याओं की दी गई सूची को क्रमबद्ध करने के लिए, इसे लगभग n/2 संख्याओं की दो सूचियों में विभाजित करें, उनमें से प्रत्येक को बारी-बारी से क्रमबद्ध करें, और दी गई सूची का क्रमबद्ध संस्करण प्राप्त करने के लिए दोनों परिणामों को उचित रूप से इंटरलीव करें (देखें) चित्र)। इस दृष्टिकोण को मर्ज सॉर्ट एल्गोरिथम के रूप में जाना जाता है।

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

प्रारंभिक ऐतिहासिक उदाहरण
इन एल्गोरिदम के शुरुआती उदाहरण मुख्य रूप से घटते हैं और जीतते हैं - मूल समस्या क्रमिक रूप से एकल उप-समस्याओं में टूट जाती है, और वास्तव में इसे पुनरावृत्त रूप से हल किया जा सकता है।

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

कई उप-समस्याओं के साथ विभाजित और जीत एल्गोरिथ्म का प्रारंभिक उदाहरण कार्ल फ्रेडरिक गॉस का 1805 का विवरण है जिसे अब कूली-तुकी एफएफटी एल्गोरिदम कहा जाता है। कूली-तुकी फास्ट फूरियर ट्रांसफॉर्म (एफएफटी) एल्गोरिदम। हालांकि उन्होंने मात्रात्मक रूप से एल्गोरिदम का विश्लेषण नहीं किया, और एफएफटी तब तक व्यापक नहीं हुए जब तक कि उन्हें सदी बाद फिर से खोजा नहीं गया।

प्रारंभिक दो-उप-समस्या डी एंड सी एल्गोरिथ्म जो विशेष रूप से कंप्यूटरों के लिए विकसित किया गया था और ठीक से विश्लेषण किया गया था, मर्ज सॉर्ट एल्गोरिथ्म है, जिसका आविष्कार जॉन वॉन न्यूमैन ने 1945 में किया था। अन्य उल्लेखनीय उदाहरण 1960 में अनातोली अलेक्सीविच करात्सुबा द्वारा आविष्कृत करात्सुबा एल्गोरिद्म है। अनातोली ए. करात्सुबा जो दो n-अंकीय संख्याओं का गुणा कर सकता है $$O(n^{\log_2 3})$$ संचालन (बिग ओ नोटेशन में)। इस एल्गोरिथ्म ने एंड्री कोलमोगोरोव के 1956 के अनुमान को खारिज कर दिया $$\Omega(n^2)$$ उस कार्य के लिए संचालन की आवश्यकता होगी।

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

कठिन समस्याओं का समाधान
फूट डालो और जीतो अवधारणात्मक रूप से कठिन समस्याओं को हल करने के लिए शक्तिशाली उपकरण है: इसके लिए केवल समस्या को उप-समस्याओं में तोड़ने, तुच्छ मामलों को हल करने और उप-समस्याओं को मूल समस्या से जोड़ने का तरीका है। इसी तरह, घटाना और जीतना केवल समस्या को छोटी समस्या में कम करने की आवश्यकता है, जैसे हनोई पहेली का क्लासिक टॉवर, जो ऊंचाई के टावर को कम कर देता है $$n$$ ऊंचाई के टॉवर को स्थानांतरित करने के लिए $$n-1$$.

एल्गोरिथम दक्षता
फूट डालो और जीतो प्रतिमान अक्सर कुशल एल्गोरिदम की खोज में मदद करता है। यह कुंजी थी, उदाहरण के लिए, करात्सुबा की तेजी से गुणन विधि, क्विकसॉर्ट और मर्जसॉर्ट एल्गोरिदम, मैट्रिक्स गुणन के लिए सड़क एल्गोरिथ्म, और तेजी से फूरियर रूपांतरण।

इन सभी उदाहरणों में, डी एंड सी दृष्टिकोण ने समाधान की उपगामी जटिलता में सुधार किया। उदाहरण के लिए, यदि (ए) रिकर्सन (कंप्यूटर विज्ञान) का आकार स्थिर है, तो समस्या को विभाजित करने और आंशिक समाधानों के संयोजन का कार्य समस्या के आकार के समानुपाती होता है $$n$$, और (बी) परिबद्ध संख्या है $$p$$ आकार की उप-समस्याओं की ~ $$n/p$$ प्रत्येक चरण में, तब फूट डालो और जीतो एल्गोरिथम की लागत होगी $$O(n\log_{p}n)$$.

समानता
मल्टी-प्रोसेसर मशीनों, विशेष रूप से साझा-मेमोरी सिस्टम में निष्पादन के लिए विभाजित और जीत एल्गोरिदम स्वाभाविक रूप से अनुकूलित होते हैं, जहां प्रोसेसर के बीच डेटा के संचार को पहले से नियोजित करने की आवश्यकता नहीं होती है क्योंकि अलग-अलग प्रोसेसर पर अलग-अलग उप-समस्याओं को निष्पादित किया जा सकता है।

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

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

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

रिकर्सन
फूट डालो और जीतो एल्गोरिदम को स्वाभाविक रूप से रिकर्सन (कंप्यूटर विज्ञान) के रूप में लागू किया जाता है। उस स्थिति में, वर्तमान में हल की जा रही आंशिक उप-समस्याओं को स्वचालित रूप से कॉल स्टैक में संग्रहीत किया जाता है। पुनरावर्ती कार्य ऐसा कार्य है जो स्वयं को अपनी परिभाषा में बुलाता है।

स्पष्ट ढेर
विभाजन और जीत एल्गोरिदम को गैर-पुनरावर्ती प्रोग्राम द्वारा भी कार्यान्वित किया जा सकता है जो आंशिक उप-समस्याओं को कुछ स्पष्ट डेटा संरचना, जैसे स्टैक (डेटा संरचना), कतार (डेटा संरचना), या प्राथमिकता कतार में संग्रहीत करता है। यह दृष्टिकोण उप-समस्या के चुनाव में अधिक स्वतंत्रता की अनुमति देता है जिसे अगले हल किया जाना है, विशेषता जो कुछ अनुप्रयोगों में महत्वपूर्ण है - उदा। इन चौड़ाई पहली रिकर्सन |ब्रेड्थ-फर्स्ट रिकर्सन और फंक्शन ऑप्टिमाइज़ेशन के लिए शाखा और बंधन मेथड। यह दृष्टिकोण प्रोग्रामिंग भाषाओं में मानक समाधान भी है जो पुनरावर्ती प्रक्रियाओं के लिए समर्थन प्रदान नहीं करता है।

ढेर का आकार
डी एंड सी एल्गोरिदम के पुनरावर्ती कार्यान्वयन में, किसी को यह सुनिश्चित करना चाहिए कि रिकर्सन स्टैक के लिए पर्याप्त मेमोरी आवंटित की गई है, अन्यथा स्टैक ओवरफ़्लो के कारण निष्पादन विफल हो सकता है। डी एंड सी एल्गोरिदम जो समय-कुशल होते हैं, अक्सर अपेक्षाकृत कम पुनरावर्तन गहराई होती है। उदाहरण के लिए, क्विकसॉर्ट एल्गोरिथम को लागू किया जा सकता है ताकि इसे कभी भी अधिक की आवश्यकता न हो $$\log_2 n$$ क्रमबद्ध करने के लिए नेस्टेड पुनरावर्ती कॉल $$n$$ सामान।

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

आधार मामलों का चयन
किसी भी पुनरावर्ती एल्गोरिदम में, आधार मामलों की पसंद में काफी स्वतंत्रता होती है, छोटी उप-समस्याएं जो पुनरावर्तन को समाप्त करने के लिए सीधे हल हो जाती हैं।

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

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

इस प्रकार, उदाहरण के लिए, सॉर्ट किए जाने वाले आइटमों की संख्या पर्याप्त रूप से कम होने के बाद, क्विकसॉर्ट के कई लाइब्रेरी कार्यान्वयन सरल लूप-आधारित सम्मिलन सॉर्ट (या समान) एल्गोरिथम पर स्विच हो जाएंगे। ध्यान दें कि, यदि खाली सूची एकमात्र आधार मामला था, तो सूची को क्रमबद्ध करना $$n$$ प्रविष्टियां अधिकतम रूप से आवश्यक होंगी $$n$$ क्विकॉर्ट कॉल जो कुछ नहीं करेगी लेकिन तुरंत वापस आ जाएगी। आधार मामलों को आकार 2 या उससे कम की सूचियों में बढ़ाने से उनमें से अधिकतर कुछ भी नहीं करने वाले कॉल समाप्त हो जाएंगे, और आम तौर पर 2 से बड़ा आधार मामला आमतौर पर फ़ंक्शन-कॉल ओवरहेड या स्टैक मैनिपुलेशन में बिताए गए समय के अंश को कम करने के लिए उपयोग किया जाता है।

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

इस विचार के सामान्यीकृत संस्करण को रिकर्सन अनोलिंग या मोटे होने के रूप में जाना जाता है, और आधार मामले को बढ़ाने की प्रक्रिया को स्वचालित करने के लिए विभिन्न तकनीकों का प्रस्ताव दिया गया है।

अतिव्यापी उप-समस्याओं के लिए गतिशील प्रोग्रामिंग
कुछ समस्याओं के लिए, शाखित पुनरावृत्ति ही उप-समस्या का कई बार मूल्यांकन कर सकती है। ऐसे मामलों में इन अतिव्यापी उपसमस्याओं के समाधानों को पहचानने और सहेजने के लायक हो सकता है, तकनीक को आमतौर पर ज्ञापन के रूप में जाना जाता है। सीमा तक अनुसरण करने पर, यह नीचे-ऊपर डिजाइन | बॉटम-अप डिवाइड-एंड-कॉनकॉर एल्गोरिदम जैसे डायनेमिक प्रोग्रामिंग की ओर जाता है।

यह भी देखें

 * एकरा–बाजी विधि
 * विघटित एकत्रीकरण समारोह
 * फोर्क-जॉइन मॉडल
 * मास्टर प्रमेय (एल्गोरिदम का विश्लेषण)
 * गणितीय प्रेरण
 * मानचित्र छोटा करना
 * अनुमानी (कंप्यूटर विज्ञान)