अधिकतम उपसरणी समस्या
कंप्यूटर विज्ञान में, अधिकतम योग उपसरणी समस्या, जिसे अधिकतम खंड योग समस्या के रूप में भी जाना जाता है, संख्याओं के दिए गए एक-आयामी सरणी A[1...n] के भीतर, सबसे बड़े योग के साथ एक सन्निहित उपसरणी खोजने का कार्य है। इसे समय तथा स्थान में हल किया जा सकता है।
औपचारिक रूप से, कार्य के साथ सूचकांक और को ढूंढना है, जैसे कि योग
यथासंभव बड़ा है. (समस्या के कुछ सूत्रीकरण खाली उपसरणी पर भी विचार करने की अनुमति देते हैं; परंपरा के अनुसार, रिक्त उपसरणी के सभी मानों का योग शून्य है।) इनपुट सरणी ए में प्रत्येक संख्या धनात्मक, ऋणात्मक या शून्य हो सकती है।[1]
उदाहरण के लिए, मानों की सारणी [−2, 1, −3, 4, −1, 2, 1, −5, 4] के लिए, सबसे बड़े योग के साथ सन्निहित उपसरणी [4, −1, 2, 1] है। , योग 6 के साथ
इस समस्या के कुछ गुण हैं:
- यदि सरणी में सभी ऋणेतर संख्याएँ हैं, तो समस्या साधरण है; एक अधिकतम उपसरणी संपूर्ण सरणी होती है।
- यदि सरणी में सभी गैर-धनात्मक संख्याएँ शामिल हैं, तो एक समाधान आकार 1 का कोई भी उपसरणी है जिसमें सरणी का अधिकतम मान होता है (या खाली उपसरणी, यदि इसकी अनुमति है)।
- कई भिन्न उप-सरणियों का अधिकतम योग समान हो सकता है।
यद्यपि इस समस्या को कई अलग-अलग एल्गोरिथम तकनीकों का उपयोग करके हल किया जा सकता है, जिनमें क्रूर बल,[2] विभाजित करें और जीतें,[3] गतिशील प्रोग्रामिंग,[4] और सबसे छोटे पथों में कमी शामिल है, एक सरल सिंगल-पास एल्गोरिदम जिसे कडेन एल्गोरिदम के नाम से जाना जाता है, इसे कुशलतापूर्वक हल करता है।
इतिहास
अधिकतम उपसरणी समस्या को 1977 में डिजीटल छवियों में पैटर्न की अधिकतम संभावना अनुमान के लिए एक सरलीकृत मॉडल के रूप में उल्फ ग्रेनेंडर द्वारा प्रस्तावित किया गया था।[5]
ग्रेनांडर वास्तविक संख्याओं की द्वि-आयामी सरणी में, अधिकतम योग के साथ एक आयताकार उपसरणी ढूंढना चाह रहा था। द्वि-आयामी समस्या के लिए एक क्रूर-बल एल्गोरिदम O(n) में चलता है6) समय; क्योंकि यह निषेधात्मक रूप से धीमा था, ग्रेनेंडर ने इसकी संरचना में अंतर्दृष्टि प्राप्त करने के लिए एक-आयामी समस्या का प्रस्ताव रखा। ग्रेनेंडर ने एक एल्गोरिदम निकाला जो O(n) में एक-आयामी समस्या को हल करता है2) समय,[note 1] O(n) के क्रूर बल संचालन समय में सुधार3). जब माइकल शामोस ने समस्या के बारे में सुना, तो उन्होंने रातों-रात इसके लिए एक O(n log n) फूट डालो और जीतो एल्गोरिथ्म तैयार किया। इसके तुरंत बाद, शेमोस ने कार्नेगी मेलन विश्वविद्यालय के सेमिनार में एक-आयामी समस्या और उसके इतिहास का वर्णन किया, जिसमें चल दर भी शामिल थे, जिन्होंने एक मिनट के भीतर एक ओ(एन)-टाइम एल्गोरिदम तैयार किया था,[5][6][7] जो यथासंभव तेज़ है।[note 2] 1982 में, डेविड ग्रिज़ ने एडस्गर डब्लू. डिज्क्स्ट्रा की मानक रणनीति को लागू करके वही O(n)-टाइम एल्गोरिदम प्राप्त किया;[8] 1989 में, रिचर्ड बर्ड (कंप्यूटर वैज्ञानिक) ने बर्ड-मीर्टेंस औपचारिकता का उपयोग करके जानवर-बल एल्गोरिथ्म के विशुद्ध रूप से बीजगणितीय हेरफेर द्वारा इसे प्राप्त किया।[9]
ग्रेनांडर के द्वि-आयामी सामान्यीकरण को O(n) में हल किया जा सकता है3) समय या तो कडेन के एल्गोरिदम को सबरूटीन के रूप में उपयोग करके, या फूट डालो और जीतो दृष्टिकोण के माध्यम से। मिन-प्लस मैट्रिक्स गुणन पर आधारित थोड़ा तेज़ एल्गोरिदम प्रस्तावित किया गया है Tamaki & Tokuyama (1998) और तक Takaoka (2002). इस बात के कुछ प्रमाण हैं कि कोई बहुत तेज़ एल्गोरिदम मौजूद नहीं है; एक एल्गोरिथ्म जो O(n) में द्वि-आयामी अधिकतम उपसरणी समस्या को हल करता है3−ε) समय, किसी भी ε>0 के लिए, सबसे छोटे पथ समस्या#सभी-जोड़े सबसे छोटे पथ|सभी-जोड़े सबसे छोटे पथ समस्या के लिए एक समान तेज़ एल्गोरिदम का संकेत देगा।[10]
अनुप्रयोग
This section needs attention from an expert in Computational biology. The specific problem is: fix inline tags.September 2019) ( |
अधिकतम उपसरणी समस्याएँ कई क्षेत्रों में उत्पन्न होती हैं, जैसे कि जीनोमिक अनुक्रम विश्लेषण और कंप्यूटर दृष्टि
जीनोमिक अनुक्रम विश्लेषण प्रोटीन अनुक्रमों के महत्वपूर्ण जैविक खंडों की पहचान करने के लिए अधिकतम उपसरणी एल्गोरिदम का उपयोग करता है।[citation needed] इन समस्याओं में संरक्षित खंड, जीसी-समृद्ध क्षेत्र, अग्रानुक्रम दोहराव, कम-जटिलता फ़िल्टर, डीएनए बाइंडिंग डोमेन और उच्च चार्ज वाले क्षेत्र शामिल हैं।[citation needed]
कंप्यूटर विज़न में, किसी छवि में सबसे चमकीले क्षेत्र का पता लगाने के लिए बिटमैप छवियों पर अधिकतम-सबरे एल्गोरिदम का उपयोग किया जाता है।
कडाने का एल्गोरिदम
रिक्त उपसरणी स्वीकृत
Example run |
---|
जोसेफ बोर्न कडाने|कडाने का मूल एल्गोरिदम खाली उपसरणी स्वीकार किए जाने पर समस्या संस्करण को हल करता है। यह दिए गए एरे को स्कैन करता है बाएं से दाएं।
में वें चरण में, यह सबसे बड़े योग पर समाप्त होने वाली उपसरणी की गणना करता है ; यह राशि परिवर्तनीय रूप में रखी जाती है current_sum
.[note 3]
इसके अलावा, यह कहीं भी सबसे बड़े योग के साथ उपसरणी की गणना करता है , परिवर्तनीय रूप से बनाए रखा गया best_sum
,[note 4]
और सभी मूल्यों में से अधिकतम के रूप में आसानी से प्राप्त किया जा सकता है current_sum
अब तक देखा, सी.एफ. एल्गोरिथम की पंक्ति 7.
एक लूप अपरिवर्तनीय के रूप में, में वां चरण, का पुराना मान current_sum
सब से अधिक सर्वोच्च रखता है राशि का .[note 5]
इसलिए, current_sum
[note 6]
सब से अधिक अधिकतम है राशि का . मामले को कवर करने के लिए उत्तरार्द्ध को अधिकतम तक विस्तारित करना , खाली उपसरणी पर भी विचार करना पर्याप्त है . यह पंक्ति 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]
<सिंटैक्सहाइलाइट लैंग = पायथन लाइन स्टार्ट = 3 >
सर्वोत्तम_योग = - अनन्तता;
</सिंटैक्सहाइलाइट>
और फॉर लूप में भी current_sum
के रूप में अद्यतन किया जाना चाहिए max(x, current_sum + x)
.[note 7]
<सिंटैक्सहाइलाइट लैंग = पायथन लाइन स्टार्ट = 6 >
current_sum = अधिकतम(x, current_sum + x)
</सिंटैक्सहाइलाइट> उस स्थिति में, यदि इनपुट में कोई धनात्मक तत्व नहीं है, तो लौटाया गया मान सबसे बड़े तत्व का होता है (यानी, 0 के निकटतम मान), या यदि इनपुट खाली था तो नकारात्मक अनंत होता है। शुद्धता के लिए, इनपुट सरणी खाली होने पर एक अपवाद उठाया जाना चाहिए, क्योंकि खाली सरणी में अधिकतम गैर-रिक्त उपसरणी नहीं होती है। यदि सरणी गैर-रिक्त है, तो संख्यात्मक और गैर-संख्यात्मक मानों के मिश्रण से बचने के लिए, यदि आवश्यक हो, तो इसके पहले तत्व का उपयोग नकारात्मक अनंत के स्थान पर किया जा सकता है।
सर्वोत्तम उपसरणी की स्थिति की गणना करना
अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों पर भी नज़र रखने के लिए एल्गोरिदम को संशोधित किया जा सकता है।
जिस तरह से यह एल्गोरिदम इष्टतम उप-संरचनाओं का उपयोग करता है (प्रत्येक स्थिति पर समाप्त होने वाली अधिकतम उप-सरणी की गणना संबंधित लेकिन छोटे और ओवरलैपिंग उप-समस्या से सरल तरीके से की जाती है: पिछली स्थिति पर समाप्त होने वाली अधिकतम उप-सरणी) इस एल्गोरिदम को गतिशील प्रोग्रामिंग के एक सरल/तुच्छ उदाहरण के रूप में देखा जा सकता है।
जटिलता
कडेन के एल्गोरिदम की रनटाइम जटिलता है और इसकी अंतरिक्ष जटिलता है .[4][7]
सामान्यीकरण
उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न हो सकती हैं, लेकिन उनके समाधान अधिक जटिल हैं; देखें, उदाहरणार्थ, Takaoka (2002). Brodal & Jørgensen (2007) ने दिखाया कि इष्टतम समय सीमा में एक-आयामी सरणी में k सबसे बड़े उपसरणी योगों को कैसे खोजा जाए .
अधिकतम योग k-डिसजॉइंट सबरेज़ की गणना इष्टतम समय सीमा में भी की जा सकती है .[12]
यह भी देखें
- सबसेट योग समस्या
टिप्पणियाँ
- ↑ By using a precomputed table of cumulative sums to compute the subarray sum in constant time
- ↑ since every algorithm must at least scan the array once which already takes O(n) time
- ↑ named
MaxEndingHere
in Bentley (1989), andc
in Gries (1982) - ↑ named
MaxSoFar
in Bentley (1989), ands
in Gries (1982) - ↑ This sum is when , corresponding to the empty subarray .
- ↑
In the Python code below, is expressed as
x
, with the index left implicit. - ↑ 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.
संदर्भ
- ↑ Bentley 1989, p. 69.
- ↑ Bentley 1989, p. 70.
- ↑ Bentley 1989, p. 73.
- ↑ 4.0 4.1 4.2 Bentley 1989, p. 74.
- ↑ 5.0 5.1 Bentley 1984, p. 868-869.
- ↑ Bentley 1989, p. 76-77.
- ↑ 7.0 7.1 7.2 Gries 1982, p. 211.
- ↑ Gries 1982, p. 209-211.
- ↑ Bird 1989, Sect.8, p.126.
- ↑ Backurs, Dikkala & Tzamos 2016.
- ↑ Bentley 1989, p. 78,171.
- ↑ 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
बाहरी संबंध
- TAN, Lirong. "Maximum Contiguous Subarray Sum Problems" (PDF). Archived from the original (PDF) on 2015-10-10. Retrieved 2017-10-26.
- Mu, Shin-Cheng (2010). "The Maximum Segment Sum Problem: Its Origin, and a Derivation".
- "Notes on Maximum Subarray Problem". 2012.
- www.algorithmist.com
- alexeigor.wikidot.com
- greatest subsequential sum problem on Rosetta Code
- geeksforgeeks page on Kadane's Algorithm