अधिकतम उपसरणी समस्या: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(6 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Short description|Problem in computer science}}
{{Short description|Problem in computer science}}
[[File:Maximum Subarray Visualization.svg|thumbnail|किसी नमूने की शुरुआत और अंत स्थिति के आधार पर उप-सरणी कैसे बदलती है, इसका विज़ुअलाइज़ेशन। प्रत्येक संभावित सन्निहित उप-सरणी को रंगीन रेखा पर एक बिंदु द्वारा दर्शाया जाता है। उस बिंदु का y-निर्देशांक नमूने के योग को दर्शाता है। इसका x-निर्देशांक नमूने के अंत का प्रतिनिधित्व करता है, और उस रंगीन रेखा पर सबसे बायां बिंदु नमूने की शुरुआत का प्रतिनिधित्व करता है। इस मामले में, वह सरणी जिससे नमूने लिए गए हैं [2, 3, -1, -20, 5, 10] है।]][[कंप्यूटर विज्ञान]]  में, '''अधिकतम योग उपसरणी समस्या''', जिसे '''अधिकतम खंड योग समस्या''' के रूप में भी जाना जाता है, संख्याओं के दिए गए एक-आयामी सरणी A[1...n] के भीतर, सबसे बड़े योग के साथ एक सन्निहित उपसरणी खोजने का कार्य है। इसे <math>O(n)</math> समय तथा <math>O(1)</math> स्थान में हल किया जा सकता है।
[[File:Maximum Subarray Visualization.svg|thumbnail|किसी नमूने की प्रारम्भ और अंत स्थिति के आधार पर उप-सरणी कैसे बदलती है, इसका विज़ुअलाइज़ेशन। प्रत्येक संभावित सन्निहित उप-सरणी को रंगीन रेखा पर एक बिंदु द्वारा दर्शाया जाता है। उस बिंदु का y-निर्देशांक नमूने के योग को दर्शाता है। इसका x-निर्देशांक नमूने के अंत का प्रतिनिधित्व करता है, और उस रंगीन रेखा पर सबसे बायां बिंदु नमूने की प्रारम्भ का प्रतिनिधित्व करता है। इस स्थिति में, वह सरणी जिससे नमूने लिए गए हैं [2, 3, -1, -20, 5, 10] है।|230x230px]][[कंप्यूटर विज्ञान]]  में, '''अधिकतम योग उपसरणी समस्या''', जिसे '''अधिकतम खंड योग समस्या''' के रूप में भी जाना जाता है, संख्याओं के दिए गए एक-आयामी सरणी A[1...n] के भीतर, सबसे बड़े योग के साथ एक सन्निहित उपसरणी खोजने का कार्य है। इसे <math>O(n)</math> समय तथा <math>O(1)</math> स्थान में हल किया जा सकता है।


औपचारिक रूप से, कार्य <math>1 \leq i \leq j \leq n </math> के साथ सूचकांक <math>i</math> और <math>j</math> को ढूंढना है, जैसे कि योग
औपचारिक रूप से, कार्य <math>1 \leq i \leq j \leq n </math> के साथ सूचकांक <math>i</math> और <math>j</math> को ढूंढना है, जैसे कि योग
: <math>\sum_{x=i}^j A[x] </math>
: <math>\sum_{x=i}^j A[x] </math>
यथासंभव बड़ा है. (समस्या के कुछ सूत्रीकरण खाली उपसरणी पर भी विचार करने की अनुमति देते हैं; परंपरा के अनुसार, रिक्त उपसरणी के सभी मानों का योग शून्य है।) इनपुट सरणी में प्रत्येक संख्या धनात्मक, ऋणात्मक या शून्य हो सकती है।{{sfn|Bentley|1989|p=69}}
यथासंभव बड़ा है. (समस्या के कुछ सूत्रीकरण रिक्त उपसरणी पर भी विचार करने की अनुमति देते हैं; परंपरा के अनुसार, रिक्त उपसरणी के सभी मानों का योग शून्य है।) इनपुट सरणी A में प्रत्येक संख्या धनात्मक, ऋणात्मक या शून्य हो सकती है।{{sfn|Bentley|1989|p=69}}


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


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


यद्यपि इस समस्या को कई अलग-अलग एल्गोरिथम तकनीकों का उपयोग करके हल किया जा सकता है, जिनमें क्रूर बल,{{sfn|Bentley|1989|p=70}} विभाजित करें और जीतें,{{sfn|Bentley|1989|p=73}} गतिशील प्रोग्रामिंग,{{sfn|Bentley|1989|p=74}} और सबसे छोटे पथों में कमी शामिल है, एक सरल सिंगल-पास एल्गोरिदम जिसे कडेन एल्गोरिदम के नाम से जाना जाता है, इसे कुशलतापूर्वक हल करता है।
यद्यपि इस समस्या को कई अलग-अलग एल्गोरिथम तकनीकों का उपयोग करके हल किया जा सकता है, जिनमें क्रूर बल,{{sfn|Bentley|1989|p=70}} विभाजित करें और जीतें,{{sfn|Bentley|1989|p=73}} गतिशील प्रोग्रामिंग,{{sfn|Bentley|1989|p=74}} और सबसे छोटे पथों में कमी सम्मिलित है, एक सरल सिंगल-पास एल्गोरिदम जिसे कडेन एल्गोरिदम के नाम से जाना जाता है, इसे कुशलतापूर्वक हल करता है।


== इतिहास ==
== इतिहास ==
अधिकतम उपसरणी समस्या को 1977 में डिजीटल छवियों में पैटर्न की [[अधिकतम संभावना अनुमान]] के लिए एक सरलीकृत मॉडल के रूप में [[उल्फ ग्रेनेंडर]] द्वारा प्रस्तावित किया गया था।{{sfn|Bentley|1984|p=868-869}}
अधिकतम उपसरणी समस्या को 1977 में डिजीटल छवियों में पैटर्न की [[अधिकतम संभावना अनुमान]] के लिए एक सरलीकृत मॉडल के रूप में [[उल्फ ग्रेनेंडर]] द्वारा प्रस्तावित किया गया था।{{sfn|Bentley|1984|p=868-869}}


ग्रेनांडर वास्तविक संख्याओं की द्वि-आयामी सरणी में, अधिकतम योग के साथ एक आयताकार उपसरणी ढूंढना चाह रहा था। द्वि-आयामी समस्या के लिए एक क्रूर-बल एल्गोरिदम O(n) में चलता है<sup>6</sup>) समय; क्योंकि यह निषेधात्मक रूप से धीमा था, ग्रेनेंडर ने इसकी संरचना में अंतर्दृष्टि प्राप्त करने के लिए एक-आयामी समस्या का प्रस्ताव रखा। ग्रेनेंडर ने एक एल्गोरिदम निकाला जो O(n) में एक-आयामी समस्या को हल करता है<sup>2</sup>) समय,{{NoteTag
ग्रेनेंडर वास्तविक संख्याओं की द्वि-आयामी सरणी में अधिकतम योग के साथ एक आयताकार उपसरणी ढूंढना चाह रहा था। द्वि-आयामी समस्या के लिए एक पाशविक-बल एल्गोरिदम ''O''(''n''<sup>6</sup>) समय में चलता है; क्योंकि यह अत्यधिक धीमा था, ग्रेनेंडर ने इसकी संरचना में अंतर्दृष्टि प्राप्त करने के लिए एक-आयामी समस्या का प्रस्ताव रखा। ग्रेनेंडर ने एक एल्गोरिथ्म निकाला जो ''O''(''n''<sup>2</sup>) समय में एक-आयामी समस्या को हल करता है, ''O''(''n''<sup>3</sup>) के क्रूर बल चलने के समय में सुधार करता है। जब [[माइकल शामोस]] ने समस्या के बारे में सुना, तो उन्होंने रातोंरात इसके लिए एक ''O''(''n'' log ''n'') डिवाइड-एंड-कॉनकर एल्गोरिदम तैयार किया। इसके तुरंत बाद, शेमोस ने कार्नेगी मेलन विश्वविद्यालय के सेमिनार में एक आयामी समस्या और उसके इतिहास का वर्णन किया, जिसमें जे कडाने भी सम्मिलित हुए, जिन्होंने एक मिनट के भीतर एक ''O''(''n'')-समय एल्गोरिदम तैयार किया,{{sfn|Bentley|1984|p=868-869}}{{sfn|Bentley|1989|p=76-77}}{{sfn|Gries|1982|p=211}} जो जितना संभव हो उतना फास्ट है। 982 में, [[डेविड ग्रिज़]] ने डिज्क्स्ट्रा की "मानक रणनीति" को लागू करके वही ''O''(''n'')-समय एल्गोरिथ्म प्राप्त किया;{{sfn|Gries|1982|p=209-211}} 1989 में, [[रिचर्ड बर्ड (कंप्यूटर वैज्ञानिक)|रिचर्ड बर्ड]] ने बर्ड-मीर्टेंस औपचारिकता का उपयोग करके जानवर-बल एल्गोरिदम के विशुद्ध रूप से बीजीय  प्रकलन (मैनीपुलेशन) द्वारा इसे प्राप्त किया है।{{sfn|Bird|1989|loc=Sect.8, p.126}}
|By using a precomputed table of cumulative sums <math>S[k] = \sum_{x=1}^k A[x]</math> to compute the subarray sum <math>\sum_{x=i}^j A[x] = S[j] - S[i-1]</math> in constant time<!--sentence fragment-->
}}
O(n) के क्रूर बल संचालन समय में सुधार<sup>3</sup>). जब [[माइकल शामोस]] ने समस्या के बारे में सुना, तो उन्होंने रातों-रात इसके लिए एक O(n log n) [[फूट डालो और जीतो एल्गोरिथ्म]] तैयार किया।
इसके तुरंत बाद, शेमोस ने कार्नेगी मेलन विश्वविद्यालय के सेमिनार में एक-आयामी समस्या और उसके इतिहास का वर्णन किया, जिसमें [[चल दर]] भी शामिल थे, जिन्होंने एक मिनट के भीतर एक (एन)-टाइम एल्गोरिदम तैयार किया था,{{sfn|Bentley|1984|p=868-869}}{{sfn|Bentley|1989|p=76-77}}{{sfn|Gries|1982|p=211}} जो यथासंभव तेज़ है।<ref group=note>since every algorithm must at least scan the array once which already takes ''O''(''n'') time</ref> 1982 में, [[डेविड ग्रिज़]] ने एडस्गर डब्लू. डिज्क्स्ट्रा की मानक रणनीति को लागू करके वही O(n)-टाइम एल्गोरिदम प्राप्त किया;{{sfn|Gries|1982|p=209-211}} 1989 में, [[रिचर्ड बर्ड (कंप्यूटर वैज्ञानिक)]] ने बर्ड-मीर्टेंस औपचारिकता का उपयोग करके जानवर-बल एल्गोरिथ्म के विशुद्ध रूप से बीजगणितीय हेरफेर द्वारा इसे प्राप्त किया।{{sfn|Bird|1989|loc=Sect.8, p.126}}


ग्रेनांडर के द्वि-आयामी सामान्यीकरण को O(n) में हल किया जा सकता है<sup>3</sup>) समय या तो कडेन के एल्गोरिदम को सबरूटीन के रूप में उपयोग करके, या फूट डालो और जीतो दृष्टिकोण के माध्यम से। मिन-प्लस मैट्रिक्स गुणन पर आधारित थोड़ा तेज़ एल्गोरिदम प्रस्तावित किया गया है {{harvtxt|Tamaki|Tokuyama|1998}} और तक {{harvtxt|Takaoka|2002}}. इस बात के कुछ प्रमाण हैं कि कोई बहुत तेज़ एल्गोरिदम मौजूद नहीं है; एक एल्गोरिथ्म जो O(n) में द्वि-आयामी अधिकतम उपसरणी समस्या को हल करता है<sup>3−ε</sup>) समय, किसी भी ε>0 के लिए, सबसे छोटे पथ समस्या#सभी-जोड़े सबसे छोटे पथ|सभी-जोड़े सबसे छोटे पथ समस्या के लिए एक समान तेज़ एल्गोरिदम का संकेत देगा।{{sfn|Backurs|Dikkala|Tzamos|2016}}
ग्रेनेंडर के द्वि-आयामी सामान्यीकरण को O(''n''<sup>3</sup>) समय में या तो कडेन के एल्गोरिदम को सबरूटीन के रूप में उपयोग करके, या विभाजन-और-जीत दृष्टिकोण के माध्यम से हल किया जा सकता है। तमाकी और टोकुयामा (1998) और ताकाओका (2002) द्वारा दूरी मैट्रिक्स गुणन पर आधारित थोड़ा फास्ट एल्गोरिदम प्रस्तावित किया गया है। इस बात के कुछ सबूत हैं कि कोई भी फास्ट एल्गोरिदम उपस्थित नहीं है; एक एल्गोरिथ्म जो किसी भी ε>0 के लिए O(''n''<sup>3−ε</sup>) समय में द्वि-आयामी अधिकतम उपसरणी समस्या को हल करता है, सभी-जोड़ियों के सबसे छोटे पथ समस्या के लिए एक समान फास्ट एल्गोरिदम का संकेत देगा।{{sfn|Backurs|Dikkala|Tzamos|2016}}


== अनुप्रयोग ==
== अनुप्रयोग ==
{{expert needed|Computational biology|section|reason=fix inline tags|date=September 2019}}
अधिकतम उपसरणी समस्याएं कई क्षेत्रों में उत्पन्न होती हैं, जैसे जीनोमिक अनुक्रम विश्लेषण और कंप्यूटर विज़न।
अधिकतम उपसरणी समस्याएँ कई क्षेत्रों में उत्पन्न होती हैं, जैसे कि जीनोमिक [[अनुक्रम विश्लेषण]] और [[कंप्यूटर दृष्टि]]


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


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


==कडाने का एल्गोरिदम==
==कडेन का एल्गोरिदम==


===रिक्त उपसरणी स्वीकृत===
===रिक्त उपसरणी स्वीकृत===
Line 43: Line 38:
| [[File:Kadane run −2,1,−3,4,−1,2,1,−5,4.gif|thumb|500px|Execution of Kadane's algorithm on the [[#top|above]] example array. ''{{color|#0000c0|Blue}}:'' subarray with largest sum ending at ''i''; ''{{color|#00c000|green}}:'' subarray with largest sum encountered so far; a lower case letter indicates an empty array; variable ''i'' is left implicit in Python code.]]
| [[File:Kadane run −2,1,−3,4,−1,2,1,−5,4.gif|thumb|500px|Execution of Kadane's algorithm on the [[#top|above]] example array. ''{{color|#0000c0|Blue}}:'' subarray with largest sum ending at ''i''; ''{{color|#00c000|green}}:'' subarray with largest sum encountered so far; a lower case letter indicates an empty array; variable ''i'' is left implicit in Python code.]]
|}
|}
जोसेफ बोर्न कडाने|कडाने का मूल एल्गोरिदम खाली उपसरणी स्वीकार किए जाने पर समस्या संस्करण को हल करता है। यह दिए गए एरे को स्कैन करता है <math>A[1\ldots n]</math> बाएं से दाएं।
जब रिक्त उपसरणी स्वीकार की जाती है तो कडेन का मूल एल्गोरिदम समस्या संस्करण को हल करता है। यह दिए गए ऐरे <math>A[1\ldots n]</math> को बाएं से दाएं स्कैन करता है। <math>j</math> <math>j</math>वें चरण में, यह जे जे पर समाप्त होने वाले सबसे बड़े योग के साथ उपसरणी की गणना करता है; यह योग वेरिएबल <code>current_sum</code> में बनाए रखा जाता है।{{NoteTag
में <math>j</math>वें चरण में, यह सबसे बड़े योग पर समाप्त होने वाली उपसरणी की गणना करता है <math>j</math>; यह राशि परिवर्तनीय रूप में रखी जाती है <code>current_sum</code>.{{NoteTag
|named <code>MaxEndingHere</code> in {{harvtxt|Bentley|1989}}, and <code>c</code> in {{harvtxt|Gries|1982}}
|named <code>MaxEndingHere</code> in {{harvtxt|Bentley|1989}}, and <code>c</code> in {{harvtxt|Gries|1982}}
}}
}} इसके अलावा, यह <math>A[1 \ldots j]</math> में कहीं भी सबसे बड़े योग के साथ उपसरणी की गणना करता है। वैरिएबल <code>best_sum</code> में बनाए रखा गया है,{{NoteTag
इसके अलावा, यह कहीं भी सबसे बड़े योग के साथ उपसरणी की गणना करता है <math>A[1 \ldots j]</math>, परिवर्तनीय रूप से बनाए रखा गया <code>best_sum</code>,{{NoteTag
|named <code>MaxSoFar</code> in {{harvtxt|Bentley|1989}}, and <code>s</code> in {{harvtxt|Gries|1982}}
|named <code>MaxSoFar</code> in {{harvtxt|Bentley|1989}}, and <code>s</code> in {{harvtxt|Gries|1982}}
}}
}} और एल्गोरिदम की cf. पंक्ति 7 में अब तक देखे गए <code>current_sum</code> के सभी मूल्यों में से अधिकतम के रूप में आसानी से प्राप्त किया जाता है।
और सभी मूल्यों में से अधिकतम के रूप में आसानी से प्राप्त किया जा सकता है <code>current_sum</code> अब तक देखा, सी.एफ. एल्गोरिथम की पंक्ति 7.


एक [[लूप अपरिवर्तनीय]] के रूप में, में <math>j</math>वां चरण, का पुराना मान <code>current_sum</code> सब से अधिक सर्वोच्च रखता है <math>i \in \{ 1,\ldots, j \}</math> राशि का <math>A[i]+\cdots+A[j-1]</math>.{{NoteTag
[[लूप अपरिवर्तनीय]] के रूप में, <math>j</math>वें चरण में, <code>current_sum</code> का पुराना मान योग <math>A[i]+\cdots+A[j-1]</math> के सभी <math>i \in \{ 1,\ldots, j \}</math>पर अधिकतम रखता है।{{NoteTag
|This sum is <math>0</math> when <math>i=j</math>, corresponding to the empty subarray <math>A[j\ldots j-1]</math>.
|This sum is <math>0</math> when <math>i=j</math>, corresponding to the empty subarray <math>A[j\ldots j-1]</math>.
}}
}} इसलिए, <code>current_sum</code><math>+A[j]</math>{{NoteTag|
इसलिए, <code>current_sum</code><math>+A[j]</math>{{NoteTag|
In the Python code below, <math>A[j]</math> is expressed as <code>x</code>, with the index <math>j</math> left implicit.
In the Python code below, <math>A[j]</math> is expressed as <code>x</code>, with the index <math>j</math> left implicit.
}}
}} योग <math>A[i]+\cdots+A[j]</math> के सभी <math>i \in \{ 1,\ldots, j \}</math>पर अधिकतम है। स्थिति को कवर करने के लिए बाद वाले अधिकतम का विस्तार करने के लिए <math>i=j+1</math>, रिक्त उपसरणी <math>A[j+1 \; \ldots \; j]</math> पर भी विचार करना पर्याप्त है। यह पंक्ति 6 में <math>\max(0,</math><code>current_sum</code><math>+A[j])</math> को <code>current_sum</code> के नए मान के रूप में निर्दिष्ट करके किया जाता है, जो उसके बाद योग <math>A[i]+\cdots+A[j]</math>का अधिकतम समग्र <math>i \in \{ 1, \ldots, j+1 \}</math>रखता है।
सब से अधिक अधिकतम है <math>i \in \{ 1,\ldots, j \}</math> राशि का <math>A[i]+\cdots+A[j]</math>. मामले को कवर करने के लिए उत्तरार्द्ध को अधिकतम तक विस्तारित करना <math>i=j+1</math>, खाली उपसरणी पर भी विचार करना पर्याप्त है <math>A[j+1 \; \ldots \; j]</math>. यह पंक्ति 6 ​​में असाइन करके किया जाता है <math>\max(0,</math><code>current_sum</code><math>+A[j])</math> के नये मान के रूप में <code>current_sum</code>, जो उसके बाद सभी से अधिकतम होता है <math>i \in \{ 1, \ldots, j+1 \}</math> राशि का <math>A[i]+\cdots+A[j]</math>.


इस प्रकार, समस्या को निम्नलिखित कोड से हल किया जा सकता है,{{sfn|Bentley|1989|p=74}}{{sfn|Gries|1982|p=211}} नीचे [[पायथन (प्रोग्रामिंग भाषा)]] में व्यक्त किया गया है। यदि इनपुट में कोई धनात्मक तत्व नहीं है (इनपुट खाली होने सहित) तो एल्गोरिदम का यह संस्करण 0 लौटाएगा।
इस प्रकार, समस्या को निम्नलिखित कोड से हल किया जा सकता है,{{sfn|Bentley|1989|p=74}}{{sfn|Gries|1982|p=211}} जिसे नीचे पायथन में व्यक्त किया गया है। यदि इनपुट में कोई धनात्मक अवयव नहीं है (इनपुट रिक्त होने पर भी) तो एल्गोरिदम का यह संस्करण 0 लौटाएगा।


<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
Line 72: Line 62:
     return best_sum
     return best_sum
</syntaxhighlight>
</syntaxhighlight>
एल्गोरिदम को उस मामले में अनुकूलित किया जा सकता है जो खाली उपसरणी की अनुमति नहीं देता है या अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों का ट्रैक रखता है।
एल्गोरिदम को उस स्थिति में अनुकूलित किया जा सकता है जो रिक्त उपसरणी की अनुमति नहीं देता है या अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों का ट्रैक रखता है।


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


===कोई खाली उपसरणी स्वीकृत नहीं===
===कोई रिक्त उपसरणी स्वीकृत नहीं===
समस्या के उस प्रकार के लिए जो खाली उपसरणी की अनुमति नहीं देता, <code>best_sum</code> इसके बजाय ऋणात्मक अनन्तता से प्रारंभ किया जाना चाहिए{{sfn|Bentley|1989|p=78,171}}
समस्या के उस संस्करण के लिए जो रिक्त उपसरणी की अनुमति नहीं देता है, <code>best_sum</code> को इसके स्थान पर ऋणत्मक अनन्तता से आरंभ किया जाना चाहिए{{sfn|Bentley|1989|p=78,171}}
<सिंटैक्सहाइलाइट लैंग = पायथन लाइन स्टार्ट = 3 >
best_sum = - infinity;
    सर्वोत्तम_योग = - अनन्तता;
और साथ ही लूप के लिए <code>current_sum</code> को <code>max(x, current_sum + x)</code> के रूप में अद्यतन किया जाना चाहिए।{{NoteTag
</सिंटैक्सहाइलाइट>
और फॉर लूप में भी <code>current_sum</code> के रूप में अद्यतन किया जाना चाहिए <code>max(x, current_sum + x)</code>.{{NoteTag
|While the latter modification is not mentioned by {{harvtxt|Bentley|1989}}, it achieves maintaining the modified loop invariant <code>current_sum</code><math>=\max_{i \in \{ 1, ..., j \}} A[i]+...+A[j]</math> at the beginning of the <math>j</math>th step.
|While the latter modification is not mentioned by {{harvtxt|Bentley|1989}}, it achieves maintaining the modified loop invariant <code>current_sum</code><math>=\max_{i \in \{ 1, ..., j \}} A[i]+...+A[j]</math> at the beginning of the <math>j</math>th step.
}}
}}
<सिंटैक्सहाइलाइट लैंग = पायथन लाइन स्टार्ट = 6 >
current_sum = max(x, current_sum + x)
        current_sum = अधिकतम(x, current_sum + x)
उस स्थिति में, यदि इनपुट में कोई धनात्मक अवयव नहीं है, तो लौटाया गया मान सबसे बड़े अवयव का है (यानी, 0 के निकटतम मान), या यदि इनपुट रिक्त था तो ऋणात्मक अनंत है। शुद्धता के लिए, जब इनपुट सरणी रिक्त हो तो एक अपवाद उठाया जाना चाहिए, क्योंकि रिक्त सरणी में अधिकतम गैर-रिक्त उपसरणी नहीं होती है। यदि सरणी गैर-रिक्त है, तो संख्यात्मक और गैर-संख्यात्मक मानों के मिश्रण से बचने के लिए यदि आवश्यक हो तो इसके पहले अवयव का उपयोग ऋणात्मक अनंत के स्थान पर किया जा सकता है।
</सिंटैक्सहाइलाइट>
उस स्थिति में, यदि इनपुट में कोई धनात्मक तत्व नहीं है, तो लौटाया गया मान सबसे बड़े तत्व का होता है (यानी, 0 के निकटतम मान), या यदि इनपुट खाली था तो नकारात्मक अनंत होता है। शुद्धता के लिए, इनपुट सरणी खाली होने पर एक अपवाद उठाया जाना चाहिए, क्योंकि खाली सरणी में अधिकतम गैर-रिक्त उपसरणी नहीं होती है। यदि सरणी गैर-रिक्त है, तो संख्यात्मक और गैर-संख्यात्मक मानों के मिश्रण से बचने के लिए, यदि आवश्यक हो, तो इसके पहले तत्व का उपयोग नकारात्मक अनंत के स्थान पर किया जा सकता है।


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


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


===जटिलता===
===सम्मिश्रता===
कडेन के एल्गोरिदम की रनटाइम जटिलता है <math>O(n)</math> और इसकी अंतरिक्ष जटिलता है <math>O(1)</math>.{{sfn|Bentley|1989|p=74}}{{sfn|Gries|1982|p=211}}
कडेन के एल्गोरिथ्म की रनटाइम सम्मिश्रता <math>O(n)</math> है और इसकी स्थानिक सम्मिश्रता <math>O(1)</math> है।{{sfn|Bentley|1989|p=74}}{{sfn|Gries|1982|p=211}}


== सामान्यीकरण ==
== सामान्यीकरण ==
उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न हो सकती हैं, लेकिन उनके समाधान अधिक जटिल हैं; देखें, उदाहरणार्थ, {{harvtxt|Takaoka|2002}}. {{harvtxt|Brodal|Jørgensen|2007}} ने दिखाया कि इष्टतम समय सीमा में एक-आयामी सरणी में k सबसे बड़े उपसरणी योगों को कैसे खोजा जाए <math>O(n + k)</math>.
उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न की जा सकती हैं, लेकिन उनके समाधान अधिक सम्मिश्र हैं। देखें, उदाहरण के लिए, ताकाओका (2002)। ब्रोडल और जोर्गेंसन (2007) ने दिखाया कि इष्टतम समय सीमा <math>O(n + k)</math>में एक-आयामी सरणी में ''k'' सबसे बड़े उपसरणी योगों को कैसे ढूंढें।


अधिकतम योग k-डिसजॉइंट सबरेज़ की गणना इष्टतम समय सीमा में भी की जा सकती है <math>O(n + k)</math> .{{sfn|Bengtsson|Chen|2007}}
अधिकतम योग k-असंयुक्त उपसरणी की गणना इष्टतम समयबद्ध <math>O(n + k)</math>में भी की जा सकती है।{{sfn|Bengtsson|Chen|2007}}


== यह भी देखें ==
== यह भी देखें ==
* सबसेट योग समस्या
* उपसमुच्चय योग समस्या


==टिप्पणियाँ==
==टिप्पणियाँ==
{{NoteFoot|30em}}
{{NoteFoot|30em}}
==संदर्भ==
==संदर्भ==
{{Reflist}}
{{Reflist}}
Line 237: Line 221:
| access-date = November 17, 2018
| access-date = November 17, 2018
}}
}}
== बाहरी संबंध ==
== बाहरी संबंध ==
* {{Cite web|url=http://www.picb.ac.cn/~xiaohang/vimwiki/study/tanlirong/Algorithm/project/Report.pdf|title=Maximum Contiguous Subarray Sum Problems|last=TAN|first=Lirong|access-date=2017-10-26|archive-url=https://web.archive.org/web/20151010072051/http://www.picb.ac.cn/~xiaohang/vimwiki/study/tanlirong/Algorithm/project/Report.pdf|archive-date=2015-10-10|url-status=dead}}
* {{Cite web|url=http://www.picb.ac.cn/~xiaohang/vimwiki/study/tanlirong/Algorithm/project/Report.pdf|title=Maximum Contiguous Subarray Sum Problems|last=TAN|first=Lirong|access-date=2017-10-26|archive-url=https://web.archive.org/web/20151010072051/http://www.picb.ac.cn/~xiaohang/vimwiki/study/tanlirong/Algorithm/project/Report.pdf|archive-date=2015-10-10|url-status=dead}}
Line 247: Line 229:
* [http://rosettacode.org/wiki/Greatest_subsequential_sum greatest subsequential sum problem on Rosetta Code]
* [http://rosettacode.org/wiki/Greatest_subsequential_sum greatest subsequential sum problem on Rosetta Code]
* [https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/ geeksforgeeks page on Kadane's Algorithm]
* [https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/ geeksforgeeks page on Kadane's Algorithm]
[[Category: अनुकूलन एल्गोरिदम और विधियाँ]] [[Category: गतिशील प्रोग्रामिंग]] [[Category: उदाहरण के लिए पायथन (प्रोग्रामिंग भाषा) कोड वाले लेख]]


[[Category: Machine Translated Page]]
[[Category:All articles with dead external links]]
[[Category:Articles with dead external links from May 2021]]
[[Category:Created On 25/07/2023]]
[[Category:Created On 25/07/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:अनुकूलन एल्गोरिदम और विधियाँ]]
[[Category:उदाहरण के लिए पायथन (प्रोग्रामिंग भाषा) कोड वाले लेख]]
[[Category:गतिशील प्रोग्रामिंग]]

Latest revision as of 17:21, 21 August 2023

किसी नमूने की प्रारम्भ और अंत स्थिति के आधार पर उप-सरणी कैसे बदलती है, इसका विज़ुअलाइज़ेशन। प्रत्येक संभावित सन्निहित उप-सरणी को रंगीन रेखा पर एक बिंदु द्वारा दर्शाया जाता है। उस बिंदु का y-निर्देशांक नमूने के योग को दर्शाता है। इसका x-निर्देशांक नमूने के अंत का प्रतिनिधित्व करता है, और उस रंगीन रेखा पर सबसे बायां बिंदु नमूने की प्रारम्भ का प्रतिनिधित्व करता है। इस स्थिति में, वह सरणी जिससे नमूने लिए गए हैं [2, 3, -1, -20, 5, 10] है।

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

औपचारिक रूप से, कार्य के साथ सूचकांक और को ढूंढना है, जैसे कि योग

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

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

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

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

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

इतिहास

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

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

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

अनुप्रयोग

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

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

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

कडेन का एल्गोरिदम

रिक्त उपसरणी स्वीकृत

जब रिक्त उपसरणी स्वीकार की जाती है तो कडेन का मूल एल्गोरिदम समस्या संस्करण को हल करता है। यह दिए गए ऐरे को बाएं से दाएं स्कैन करता है। वें चरण में, यह जे जे पर समाप्त होने वाले सबसे बड़े योग के साथ उपसरणी की गणना करता है; यह योग वेरिएबल current_sum में बनाए रखा जाता है।[note 1] इसके अलावा, यह में कहीं भी सबसे बड़े योग के साथ उपसरणी की गणना करता है। वैरिएबल best_sum में बनाए रखा गया है,[note 2] और एल्गोरिदम की cf. पंक्ति 7 में अब तक देखे गए current_sum के सभी मूल्यों में से अधिकतम के रूप में आसानी से प्राप्त किया जाता है।

लूप अपरिवर्तनीय के रूप में, वें चरण में, current_sum का पुराना मान योग के सभी पर अधिकतम रखता है।[note 3] इसलिए, current_sum[note 4] योग के सभी पर अधिकतम है। स्थिति को कवर करने के लिए बाद वाले अधिकतम का विस्तार करने के लिए , रिक्त उपसरणी पर भी विचार करना पर्याप्त है। यह पंक्ति 6 में current_sum को current_sum के नए मान के रूप में निर्दिष्ट करके किया जाता है, जो उसके बाद योग का अधिकतम समग्र रखता है।

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

def max_subarray(numbers):
    """Find the largest sum of any contiguous subarray."""
    best_sum = 0
    current_sum = 0
    for x in numbers:
        current_sum = max(0, current_sum + x)
        best_sum = max(best_sum, current_sum)
    return best_sum

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

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

कोई रिक्त उपसरणी स्वीकृत नहीं

समस्या के उस संस्करण के लिए जो रिक्त उपसरणी की अनुमति नहीं देता है, best_sum को इसके स्थान पर ऋणत्मक अनन्तता से आरंभ किया जाना चाहिए[11]

best_sum = - infinity;

और साथ ही लूप के लिए current_sum को max(x, current_sum + x) के रूप में अद्यतन किया जाना चाहिए।[note 5]

current_sum = max(x, current_sum + x)

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

सर्वश्रेष्ठ उपसरणी की स्थिति की गणना करना

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

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

सम्मिश्रता

कडेन के एल्गोरिथ्म की रनटाइम सम्मिश्रता है और इसकी स्थानिक सम्मिश्रता है।[4][7]

सामान्यीकरण

उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न की जा सकती हैं, लेकिन उनके समाधान अधिक सम्मिश्र हैं। देखें, उदाहरण के लिए, ताकाओका (2002)। ब्रोडल और जोर्गेंसन (2007) ने दिखाया कि इष्टतम समय सीमा में एक-आयामी सरणी में k सबसे बड़े उपसरणी योगों को कैसे ढूंढें।

अधिकतम योग k-असंयुक्त उपसरणी की गणना इष्टतम समयबद्ध में भी की जा सकती है।[12]

यह भी देखें

  • उपसमुच्चय योग समस्या

टिप्पणियाँ

  1. named MaxEndingHere in Bentley (1989), and c in Gries (1982)
  2. named MaxSoFar in Bentley (1989), and s in Gries (1982)
  3. This sum is when , corresponding to the empty subarray .
  4. In the Python code below, is expressed as x, with the index left implicit.
  5. While the latter modification is not mentioned by Bentley (1989), it achieves maintaining the modified loop invariant current_sum at the beginning of the th step.

संदर्भ

  1. Bentley 1989, p. 69.
  2. Bentley 1989, p. 70.
  3. Bentley 1989, p. 73.
  4. 4.0 4.1 4.2 Bentley 1989, p. 74.
  5. 5.0 5.1 Bentley 1984, p. 868-869.
  6. Bentley 1989, p. 76-77.
  7. 7.0 7.1 7.2 Gries 1982, p. 211.
  8. Gries 1982, p. 209-211.
  9. Bird 1989, Sect.8, p.126.
  10. Backurs, Dikkala & Tzamos 2016.
  11. Bentley 1989, p. 78,171.
  12. Bengtsson & Chen 2007.
  • Backurs, Arturs; Dikkala, Nishanth; Tzamos, Christos (2016), "Tight Hardness Results for Maximum Weight Rectangles", Proc. 43rd International Colloquium on Automata, Languages, and Programming: 81:1–81:13, doi:10.4230/LIPIcs.ICALP.2016.81, S2CID 12720136
  • Bae, Sung Eun (2007), Sequential and Parallel Algorithms for the Generalized Maximum Subarray Problem (PDF) (Ph.D. thesis), University of Canterbury, S2CID 2681670, archived from the original (PDF) on 2017-10-26.
  • Bengtsson, Fredrik; Chen, Jingsen (2007), Computing maximum-scoring segments optimally (PDF) (Research report), Luleå University of Technology
  • Bentley, Jon (1984), "Programming Pearls: Algorithm Design Techniques", Communications of the ACM, 27 (9): 865–873, doi:10.1145/358234.381162, S2CID 207565329
  • Bentley, Jon (May 1989), Programming Pearls (2nd? ed.), Reading, MA: Addison Wesley, ISBN 0-201-10331-1
  • Bird, Richard S. (1989), "Algebraic Identities for Program Calculation" (PDF), The Computer Journal, 32 (2): 122–126, doi:10.1093/comjnl/32.2.122[dead link]
  • Brodal, Gerth Stølting; Jørgensen, Allan Grønlund (2007), "A linear time algorithm for the k maximal sums problem", Mathematical Foundations of Computer Science, Lecture Notes in Computer Science, vol. 4708, Springer-Verlag, pp. 442–453, doi:10.1007/978-3-540-74456-6_40.
  • Gries, David (1982), "A Note on the Standard Strategy for Developing Loop Invariants and Loops" (PDF), Science of Computer Programming, 2 (3): 207–241, doi:10.1016/0167-6423(83)90015-1, hdl:1813/6370
  • Takaoka, Tadao (2002), "Efficient algorithms for the maximum subarray problem by distance matrix multiplication", Electronic Notes in Theoretical Computer Science, 61: 191–200, doi:10.1016/S1571-0661(04)00313-5.
  • Tamaki, Hisao; Tokuyama, Takeshi (1998), "Algorithms for the Maximum Subarray Problem Based on Matrix Multiplication", Proceedings of the 9th Symposium on Discrete Algorithms (SODA): 446–452, retrieved November 17, 2018

बाहरी संबंध