अधिकतम उपसरणी समस्या

कंप्यूटर विज्ञान में, अधिकतम योग उपसरणी समस्या, जिसे अधिकतम खंड योग समस्या के रूप में भी जाना जाता है, संख्याओं के दिए गए एक-आयामी सरणी A[1...n] के भीतर, सबसे बड़े योग के साथ एक सन्निहित उपसरणी खोजने का कार्य है। इसे $$O(n)$$ समय तथा $$O(1)$$ स्थान में हल किया जा सकता है।

औपचारिक रूप से, कार्य $$1 \leq i \leq j \leq n $$ के साथ सूचकांक $$i$$ और $$j$$ को ढूंढना है, जैसे कि योग
 * $$\sum_{x=i}^j A[x] $$

यथासंभव बड़ा है. (समस्या के कुछ सूत्रीकरण खाली उपसरणी पर भी विचार करने की अनुमति देते हैं; परंपरा के अनुसार, रिक्त उपसरणी के सभी मानों का योग शून्य है।) इनपुट सरणी ए में प्रत्येक संख्या धनात्मक, ऋणात्मक या शून्य हो सकती है।

उदाहरण के लिए, मानों की सारणी [−2, 1, −3, 4, −1, 2, 1, −5, 4] के लिए, सबसे बड़े योग के साथ सन्निहित उपसरणी [4, −1, 2, 1] है।, योग 6 के साथ

इस समस्या के कुछ गुण हैं:


 * 1) यदि सरणी में सभी ऋणेतर संख्याएँ हैं, तो समस्या साधरण है; एक अधिकतम उपसरणी संपूर्ण सरणी होती है।
 * 2) यदि सरणी में सभी गैर-धनात्मक संख्याएँ शामिल हैं, तो एक समाधान आकार 1 का कोई भी उपसरणी है जिसमें सरणी का अधिकतम मान होता है (या खाली उपसरणी, यदि इसकी अनुमति है)।
 * 3) कई भिन्न उप-सरणियों का अधिकतम योग समान हो सकता है।

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

इतिहास
अधिकतम उपसरणी समस्या को 1977 में डिजीटल छवियों में पैटर्न की अधिकतम संभावना अनुमान के लिए एक सरलीकृत मॉडल के रूप में उल्फ ग्रेनेंडर द्वारा प्रस्तावित किया गया था।

ग्रेनेंडर वास्तविक संख्याओं की द्वि-आयामी सरणी में अधिकतम योग के साथ एक आयताकार उपसरणी ढूंढना चाह रहा था। द्वि-आयामी समस्या के लिए एक पाशविक-बल एल्गोरिदम O(n6) समय में चलता है; क्योंकि यह अत्यधिक धीमा था, ग्रेनेंडर ने इसकी संरचना में अंतर्दृष्टि प्राप्त करने के लिए एक-आयामी समस्या का प्रस्ताव रखा। ग्रेनेंडर ने एक एल्गोरिथ्म निकाला जो O(n2) समय में एक-आयामी समस्या को हल करता है, O(n3) के क्रूर बल चलने के समय में सुधार करता है। जब माइकल शामोस ने समस्या के बारे में सुना, तो उन्होंने रातोंरात इसके लिए एक O(n log n) डिवाइड-एंड-कॉनकर एल्गोरिदम तैयार किया। इसके तुरंत बाद, शेमोस ने कार्नेगी मेलन विश्वविद्यालय के सेमिनार में एक आयामी समस्या और उसके इतिहास का वर्णन किया, जिसमें जे कडाने भी शामिल हुए, जिन्होंने एक मिनट के भीतर एक O(n)-समय एल्गोरिदम तैयार किया, जो जितना संभव हो उतना फास्ट है। 982 में, डेविड ग्रिज़ ने डिज्क्स्ट्रा की "मानक रणनीति" को लागू करके वही O(n)-समय एल्गोरिथ्म प्राप्त किया; 1989 में, रिचर्ड बर्ड ने बर्ड-मीर्टेंस औपचारिकता का उपयोग करके जानवर-बल एल्गोरिदम के विशुद्ध रूप से बीजीय हेरफेर द्वारा इसे प्राप्त किया।

ग्रेनेंडर के द्वि-आयामी सामान्यीकरण को O(n3) समय में या तो कडेन के एल्गोरिदम को सबरूटीन के रूप में उपयोग करके, या विभाजन-और-जीत दृष्टिकोण के माध्यम से हल किया जा सकता है। तमाकी और टोकुयामा (1998) और ताकाओका (2002) द्वारा दूरी मैट्रिक्स गुणन पर आधारित थोड़ा फास्ट एल्गोरिदम प्रस्तावित किया गया है। इस बात के कुछ सबूत हैं कि कोई भी फास्ट एल्गोरिदम मौजूद नहीं है; एक एल्गोरिथ्म जो किसी भी ε>0 के लिए O(n3−ε) समय में द्वि-आयामी अधिकतम उपसरणी समस्या को हल करता है, सभी-जोड़ियों के सबसे छोटे पथ समस्या के लिए एक समान फास्ट एल्गोरिदम का संकेत देगा।

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

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

कंप्यूटर विज़न में, छवि में सबसे प्रतिभाशाली क्षेत्र का पता लगाने के लिए बिटमैप छवियों पर अधिकतम-सबरे एल्गोरिदम का उपयोग किया जाता है।

रिक्त उपसरणी स्वीकृत
जोसेफ बोर्न कडाने|कडाने का मूल एल्गोरिदम खाली उपसरणी स्वीकार किए जाने पर समस्या संस्करण को हल करता है। यह दिए गए एरे को स्कैन करता है $$A[1\ldots n]$$ बाएं से दाएं। में $$j$$वें चरण में, यह सबसे बड़े योग पर समाप्त होने वाली उपसरणी की गणना करता है $$j$$; यह राशि परिवर्तनीय रूप में रखी जाती है. इसके अलावा, यह कहीं भी सबसे बड़े योग के साथ उपसरणी की गणना करता है $$A[1 \ldots j]$$, परिवर्तनीय रूप से बनाए रखा गया , और सभी मूल्यों में से अधिकतम के रूप में आसानी से प्राप्त किया जा सकता है  अब तक देखा, सी.एफ. एल्गोरिथम की पंक्ति 7.

एक लूप अपरिवर्तनीय के रूप में, में $$j$$वां चरण, का पुराना मान  सब से अधिक सर्वोच्च रखता है $$i \in \{ 1,\ldots, j \}$$ राशि का $$A[i]+\cdots+A[j-1]$$. इसलिए, $$+A[j]$$ सब से अधिक अधिकतम है $$i \in \{ 1,\ldots, j \}$$ राशि का $$A[i]+\cdots+A[j]$$. मामले को कवर करने के लिए उत्तरार्द्ध को अधिकतम तक विस्तारित करना $$i=j+1$$, खाली उपसरणी पर भी विचार करना पर्याप्त है $$A[j+1 \; \ldots \; j]$$. यह पंक्ति 6 ​​में असाइन करके किया जाता है $$\max(0,$$ $$+A[j])$$ के नये मान के रूप में, जो उसके बाद सभी से अधिकतम होता है $$i \in \{ 1, \ldots, j+1 \}$$ राशि का $$A[i]+\cdots+A[j]$$.

इस प्रकार, समस्या को निम्नलिखित कोड से हल किया जा सकता है, नीचे पायथन (प्रोग्रामिंग भाषा) में व्यक्त किया गया है। यदि इनपुट में कोई धनात्मक तत्व नहीं है (इनपुट खाली होने सहित) तो एल्गोरिदम का यह संस्करण 0 लौटाएगा।

एल्गोरिदम को उस मामले में अनुकूलित किया जा सकता है जो खाली उपसरणी की अनुमति नहीं देता है या अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों का ट्रैक रखता है।

यह एल्गोरिदम पिछली स्थिति पर समाप्त होने वाली अधिकतम उपसरणी से प्रत्येक स्थिति पर समाप्त होने वाली अधिकतम उपसरणी की गणना करता है, इसलिए इसे गतिशील प्रोग्रामिंग के एक तुच्छ मामले के रूप में देखा जा सकता है।

कोई खाली उपसरणी स्वीकृत नहीं
समस्या के उस प्रकार के लिए जो खाली उपसरणी की अनुमति नहीं देता,  इसके बजाय ऋणात्मक अनन्तता से प्रारंभ किया जाना चाहिए  सर्वोत्तम_योग = - अनन्तता;  और फॉर लूप में भी  के रूप में अद्यतन किया जाना चाहिए.  current_sum = अधिकतम(x, current_sum + x)  उस स्थिति में, यदि इनपुट में कोई धनात्मक तत्व नहीं है, तो लौटाया गया मान सबसे बड़े तत्व का होता है (यानी, 0 के निकटतम मान), या यदि इनपुट खाली था तो नकारात्मक अनंत होता है। शुद्धता के लिए, इनपुट सरणी खाली होने पर एक अपवाद उठाया जाना चाहिए, क्योंकि खाली सरणी में अधिकतम गैर-रिक्त उपसरणी नहीं होती है। यदि सरणी गैर-रिक्त है, तो संख्यात्मक और गैर-संख्यात्मक मानों के मिश्रण से बचने के लिए, यदि आवश्यक हो, तो इसके पहले तत्व का उपयोग नकारात्मक अनंत के स्थान पर किया जा सकता है।

सर्वोत्तम उपसरणी की स्थिति की गणना करना
अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों पर भी नज़र रखने के लिए एल्गोरिदम को संशोधित किया जा सकता है।

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

जटिलता
कडेन के एल्गोरिदम की रनटाइम जटिलता है $$O(n)$$ और इसकी अंतरिक्ष जटिलता है $$O(1)$$.

सामान्यीकरण
उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न हो सकती हैं, लेकिन उनके समाधान अधिक जटिल हैं; देखें, उदाहरणार्थ,. ने दिखाया कि इष्टतम समय सीमा में एक-आयामी सरणी में k सबसे बड़े उपसरणी योगों को कैसे खोजा जाए $$O(n + k)$$.

अधिकतम योग k-डिसजॉइंट सबरेज़ की गणना इष्टतम समय सीमा में भी की जा सकती है $$O(n + k)$$.

यह भी देखें

 * सबसेट योग समस्या

बाहरी संबंध

 * www.algorithmist.com
 * alexeigor.wikidot.com
 * greatest subsequential sum problem on Rosetta Code
 * geeksforgeeks page on Kadane's Algorithm
 * alexeigor.wikidot.com
 * greatest subsequential sum problem on Rosetta Code
 * geeksforgeeks page on Kadane's Algorithm