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

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

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

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

उदाहरण के लिए, मानों की सारणी [−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]$$ में कहीं भी सबसे बड़े योग के साथ उपसरणी की गणना करता है। वैरिएबल   में बनाए रखा गया है, और एल्गोरिदम की cf. पंक्ति 7 में अब तक देखे गए  के सभी मूल्यों में से अधिकतम के रूप में आसानी से प्राप्त किया जाता है।

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

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

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

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

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

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

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

सम्मिश्रता
कडेन के एल्गोरिथ्म की रनटाइम सम्मिश्रता $$O(n)$$ है और इसकी स्थानिक सम्मिश्रता $$O(1)$$ है।

सामान्यीकरण
उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न की जा सकती हैं, लेकिन उनके समाधान अधिक सम्मिश्र हैं। देखें, उदाहरण के लिए, ताकाओका (2002)। ब्रोडल और जोर्गेंसन (2007) ने दिखाया कि इष्टतम समय सीमा $$O(n + k)$$में एक-आयामी सरणी में 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