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

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

औपचारिक रूप से, कार्य सूचकांक ढूंढना है $$i$$ और $$j$$ साथ $$1 \leq i \leq j \leq n $$, जैसे कि योग
 * $$\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(n) में चलता है6) समय; क्योंकि यह निषेधात्मक रूप से धीमा था, ग्रेनेंडर ने इसकी संरचना में अंतर्दृष्टि प्राप्त करने के लिए एक-आयामी समस्या का प्रस्ताव रखा। ग्रेनेंडर ने एक एल्गोरिदम निकाला जो O(n) में एक-आयामी समस्या को हल करता है2) समय, O(n) के क्रूर बल संचालन समय में सुधार3). जब माइकल शामोस ने समस्या के बारे में सुना, तो उन्होंने रातों-रात इसके लिए एक O(n log n) फूट डालो और जीतो एल्गोरिथ्म तैयार किया। इसके तुरंत बाद, शेमोस ने कार्नेगी मेलन विश्वविद्यालय के सेमिनार में एक-आयामी समस्या और उसके इतिहास का वर्णन किया, जिसमें चल दर भी शामिल थे, जिन्होंने एक मिनट के भीतर एक ओ(एन)-टाइम एल्गोरिदम तैयार किया था, जो यथासंभव तेज़ है। 1982 में, डेविड ग्रिज़ ने एडस्गर डब्लू. डिज्क्स्ट्रा की मानक रणनीति को लागू करके वही O(n)-टाइम एल्गोरिदम प्राप्त किया; 1989 में, रिचर्ड बर्ड (कंप्यूटर वैज्ञानिक) ने बर्ड-मीर्टेंस औपचारिकता का उपयोग करके जानवर-बल एल्गोरिथ्म के विशुद्ध रूप से बीजगणितीय हेरफेर द्वारा इसे प्राप्त किया।

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

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

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

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

रिक्त उपसरणी स्वीकृत
जोसेफ बोर्न कडाने|कडाने का मूल एल्गोरिदम खाली उपसरणी स्वीकार किए जाने पर समस्या संस्करण को हल करता है। यह दिए गए एरे को स्कैन करता है $$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