अधिकतम उपसरणी समस्या: Difference between revisions
No edit summary |
|||
(4 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|किसी नमूने की | [[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> | ||
यथासंभव बड़ा है. (समस्या के कुछ सूत्रीकरण रिक्त उपसरणी पर भी विचार करने की अनुमति देते हैं; परंपरा के अनुसार, रिक्त उपसरणी के सभी मानों का योग शून्य है।) इनपुट सरणी | यथासंभव बड़ा है. (समस्या के कुछ सूत्रीकरण रिक्त उपसरणी पर भी विचार करने की अनुमति देते हैं; परंपरा के अनुसार, रिक्त उपसरणी के सभी मानों का योग शून्य है।) इनपुट सरणी 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 का कोई भी उपसरणी है जिसमें सरणी का अधिकतम मान होता है (या रिक्त उपसरणी, यदि इसकी अनुमति है)। | ||
# कई भिन्न उप-सरणियों का अधिकतम योग समान हो सकता है। | # कई भिन्न उप-सरणियों का अधिकतम योग समान हो सकता है। | ||
यद्यपि इस समस्या को कई अलग-अलग एल्गोरिथम तकनीकों का उपयोग करके हल किया जा सकता है, जिनमें क्रूर बल,{{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>) समय में एक-आयामी समस्या को हल करता है, ''O''(''n''<sup>3</sup>) के क्रूर बल चलने के समय में सुधार करता है। जब [[माइकल शामोस]] ने समस्या के बारे में सुना, तो उन्होंने रातोंरात इसके लिए एक ''O''(''n'' log ''n'') डिवाइड-एंड-कॉनकर एल्गोरिदम तैयार किया। इसके तुरंत बाद, शेमोस ने कार्नेगी मेलन विश्वविद्यालय के सेमिनार में एक आयामी समस्या और उसके इतिहास का वर्णन किया, जिसमें जे कडाने भी | ग्रेनेंडर वास्तविक संख्याओं की द्वि-आयामी सरणी में अधिकतम योग के साथ एक आयताकार उपसरणी ढूंढना चाह रहा था। द्वि-आयामी समस्या के लिए एक पाशविक-बल एल्गोरिदम ''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}} | ||
ग्रेनेंडर के द्वि-आयामी सामान्यीकरण को O(''n''<sup>3</sup>) समय में या तो कडेन के एल्गोरिदम को सबरूटीन के रूप में उपयोग करके, या विभाजन-और-जीत दृष्टिकोण के माध्यम से हल किया जा सकता है। तमाकी और टोकुयामा (1998) और ताकाओका (2002) द्वारा दूरी मैट्रिक्स गुणन पर आधारित थोड़ा फास्ट एल्गोरिदम प्रस्तावित किया गया है। इस बात के कुछ सबूत हैं कि कोई भी फास्ट एल्गोरिदम | ग्रेनेंडर के द्वि-आयामी सामान्यीकरण को O(''n''<sup>3</sup>) समय में या तो कडेन के एल्गोरिदम को सबरूटीन के रूप में उपयोग करके, या विभाजन-और-जीत दृष्टिकोण के माध्यम से हल किया जा सकता है। तमाकी और टोकुयामा (1998) और ताकाओका (2002) द्वारा दूरी मैट्रिक्स गुणन पर आधारित थोड़ा फास्ट एल्गोरिदम प्रस्तावित किया गया है। इस बात के कुछ सबूत हैं कि कोई भी फास्ट एल्गोरिदम उपस्थित नहीं है; एक एल्गोरिथ्म जो किसी भी ε>0 के लिए O(''n''<sup>3−ε</sup>) समय में द्वि-आयामी अधिकतम उपसरणी समस्या को हल करता है, सभी-जोड़ियों के सबसे छोटे पथ समस्या के लिए एक समान फास्ट एल्गोरिदम का संकेत देगा।{{sfn|Backurs|Dikkala|Tzamos|2016}} | ||
== अनुप्रयोग == | == अनुप्रयोग == | ||
अधिकतम उपसरणी समस्याएं कई क्षेत्रों में उत्पन्न होती हैं, जैसे जीनोमिक अनुक्रम विश्लेषण और कंप्यूटर विज़न। | अधिकतम उपसरणी समस्याएं कई क्षेत्रों में उत्पन्न होती हैं, जैसे जीनोमिक अनुक्रम विश्लेषण और कंप्यूटर विज़न। | ||
जीनोमिक अनुक्रम विश्लेषण प्रोटीन अनुक्रमों के महत्वपूर्ण जैविक खंडों की पहचान करने के लिए अधिकतम उप-सरणी एल्गोरिदम का उपयोग करता है। [उद्धरण वांछित] इन समस्याओं में संरक्षित खंड, जीसी-समृद्ध क्षेत्र, अग्रानुक्रम दोहराव, कम- | जीनोमिक अनुक्रम विश्लेषण प्रोटीन अनुक्रमों के महत्वपूर्ण जैविक खंडों की पहचान करने के लिए अधिकतम उप-सरणी एल्गोरिदम का उपयोग करता है। [उद्धरण वांछित] इन समस्याओं में संरक्षित खंड, जीसी-समृद्ध क्षेत्र, अग्रानुक्रम दोहराव, कम-सम्मिश्रता फ़िल्टर, डीएनए बाइंडिंग डोमेन और उच्च चार्ज के क्षेत्र सम्मिलित हैं। प्रशस्ति - पत्र आवश्यक] | ||
कंप्यूटर विज़न में, छवि में सबसे प्रतिभाशाली क्षेत्र का पता लगाने के लिए बिटमैप छवियों पर अधिकतम-सबरे एल्गोरिदम का उपयोग किया जाता है। | कंप्यूटर विज़न में, छवि में सबसे प्रतिभाशाली क्षेत्र का पता लगाने के लिए बिटमैप छवियों पर अधिकतम-सबरे एल्गोरिदम का उपयोग किया जाता है। | ||
Line 48: | Line 48: | ||
}} इसलिए, <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>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>रखता है। | ||
इस प्रकार, समस्या को निम्नलिखित कोड से हल किया जा सकता है,{{sfn|Bentley|1989|p=74}}{{sfn|Gries|1982|p=211}} जिसे नीचे पायथन में व्यक्त किया गया है। यदि इनपुट में कोई धनात्मक | इस प्रकार, समस्या को निम्नलिखित कोड से हल किया जा सकता है,{{sfn|Bentley|1989|p=74}}{{sfn|Gries|1982|p=211}} जिसे नीचे पायथन में व्यक्त किया गया है। यदि इनपुट में कोई धनात्मक अवयव नहीं है (इनपुट रिक्त होने पर भी) तो एल्गोरिदम का यह संस्करण 0 लौटाएगा। | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
Line 62: | Line 62: | ||
return best_sum | return best_sum | ||
</syntaxhighlight> | </syntaxhighlight> | ||
एल्गोरिदम को उस | एल्गोरिदम को उस स्थिति में अनुकूलित किया जा सकता है जो रिक्त उपसरणी की अनुमति नहीं देता है या अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों का ट्रैक रखता है। | ||
यह एल्गोरिदम पिछली स्थिति पर समाप्त होने वाली अधिकतम उपसरणी से प्रत्येक स्थिति पर समाप्त होने वाली अधिकतम उपसरणी की गणना करता है, इसलिए इसे [[गतिशील प्रोग्रामिंग]] के एक तुच्छ | यह एल्गोरिदम पिछली स्थिति पर समाप्त होने वाली अधिकतम उपसरणी से प्रत्येक स्थिति पर समाप्त होने वाली अधिकतम उपसरणी की गणना करता है, इसलिए इसे [[गतिशील प्रोग्रामिंग]] के एक तुच्छ स्थिति के रूप में देखा जा सकता है। | ||
===कोई रिक्त उपसरणी स्वीकृत नहीं=== | ===कोई रिक्त उपसरणी स्वीकृत नहीं=== | ||
समस्या के उस संस्करण के लिए जो रिक्त उपसरणी की अनुमति नहीं देता है, <code>best_sum</code> को इसके | समस्या के उस संस्करण के लिए जो रिक्त उपसरणी की अनुमति नहीं देता है, <code>best_sum</code> को इसके स्थान पर ऋणत्मक अनन्तता से आरंभ किया जाना चाहिए{{sfn|Bentley|1989|p=78,171}} | ||
best_sum = - infinity; | 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 | ||
Line 73: | Line 73: | ||
}} | }} | ||
current_sum = max(x, current_sum + x) | current_sum = max(x, current_sum + x) | ||
उस स्थिति में, यदि इनपुट में कोई धनात्मक | उस स्थिति में, यदि इनपुट में कोई धनात्मक अवयव नहीं है, तो लौटाया गया मान सबसे बड़े अवयव का है (यानी, 0 के निकटतम मान), या यदि इनपुट रिक्त था तो ऋणात्मक अनंत है। शुद्धता के लिए, जब इनपुट सरणी रिक्त हो तो एक अपवाद उठाया जाना चाहिए, क्योंकि रिक्त सरणी में अधिकतम गैर-रिक्त उपसरणी नहीं होती है। यदि सरणी गैर-रिक्त है, तो संख्यात्मक और गैर-संख्यात्मक मानों के मिश्रण से बचने के लिए यदि आवश्यक हो तो इसके पहले अवयव का उपयोग ऋणात्मक अनंत के स्थान पर किया जा सकता है। | ||
=== | ===सर्वश्रेष्ठ उपसरणी की स्थिति की गणना करना=== | ||
अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों पर भी नज़र रखने के लिए एल्गोरिदम को संशोधित किया जा सकता है। | अधिकतम उपसरणी के आरंभ और समाप्ति सूचकांकों पर भी नज़र रखने के लिए एल्गोरिदम को संशोधित किया जा सकता है। | ||
जिस तरह से यह एल्गोरिदम इष्टतम | जिस तरह से यह एल्गोरिदम इष्टतम सबस्ट्रक्चर का उपयोग करता है (प्रत्येक स्थिति पर समाप्त होने वाली अधिकतम उपसरणी की गणना संबंधित लेकिन छोटे और अतिव्यापी उपसमस्या से सरल तरीके से की जाती है: पिछली स्थिति पर समाप्त होने वाली अधिकतम उपसरणी), इस एल्गोरिथ्म को गतिशील प्रोग्रामिंग के एक सरल/अप्रत्यक्ष उदाहरण के रूप में देखा जा सकता है। | ||
=== | ===सम्मिश्रता=== | ||
कडेन के | कडेन के एल्गोरिथ्म की रनटाइम सम्मिश्रता <math>O(n)</math> है और इसकी स्थानिक सम्मिश्रता <math>O(1)</math> है।{{sfn|Bentley|1989|p=74}}{{sfn|Gries|1982|p=211}} | ||
== सामान्यीकरण == | == सामान्यीकरण == | ||
उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न | उच्च-आयामी सरणियों के लिए समान समस्याएं उत्पन्न की जा सकती हैं, लेकिन उनके समाधान अधिक सम्मिश्र हैं। देखें, उदाहरण के लिए, ताकाओका (2002)। ब्रोडल और जोर्गेंसन (2007) ने दिखाया कि इष्टतम समय सीमा <math>O(n + k)</math>में एक-आयामी सरणी में ''k'' सबसे बड़े उपसरणी योगों को कैसे ढूंढें। | ||
अधिकतम योग k- | अधिकतम योग k-असंयुक्त उपसरणी की गणना इष्टतम समयबद्ध <math>O(n + k)</math>में भी की जा सकती है।{{sfn|Bengtsson|Chen|2007}} | ||
== यह भी देखें == | == यह भी देखें == | ||
* | * उपसमुच्चय योग समस्या | ||
==टिप्पणियाँ== | ==टिप्पणियाँ== | ||
{{NoteFoot|30em}} | {{NoteFoot|30em}} | ||
==संदर्भ== | ==संदर्भ== | ||
{{Reflist}} | {{Reflist}} | ||
Line 223: | 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 233: | 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: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
कंप्यूटर विज्ञान में, अधिकतम योग उपसरणी समस्या, जिसे अधिकतम खंड योग समस्या के रूप में भी जाना जाता है, संख्याओं के दिए गए एक-आयामी सरणी A[1...n] के भीतर, सबसे बड़े योग के साथ एक सन्निहित उपसरणी खोजने का कार्य है। इसे समय तथा स्थान में हल किया जा सकता है।
औपचारिक रूप से, कार्य के साथ सूचकांक और को ढूंढना है, जैसे कि योग
यथासंभव बड़ा है. (समस्या के कुछ सूत्रीकरण रिक्त उपसरणी पर भी विचार करने की अनुमति देते हैं; परंपरा के अनुसार, रिक्त उपसरणी के सभी मानों का योग शून्य है।) इनपुट सरणी A में प्रत्येक संख्या धनात्मक, ऋणात्मक या शून्य हो सकती है।[1]
उदाहरण के लिए, मानों की सारणी [−2, 1, −3, 4, −1, 2, 1, −5, 4] के लिए, सबसे बड़े योग के साथ सन्निहित उपसरणी [4, −1, 2, 1] है। , योग 6 के साथ
इस समस्या के कुछ गुण हैं:
- यदि सरणी में सभी ऋणेतर संख्याएँ हैं, तो समस्या साधरण है; एक अधिकतम उपसरणी संपूर्ण सरणी होती है।
- यदि सरणी में सभी गैर-धनात्मक संख्याएँ सम्मिलित हैं, तो एक समाधान आकार 1 का कोई भी उपसरणी है जिसमें सरणी का अधिकतम मान होता है (या रिक्त उपसरणी, यदि इसकी अनुमति है)।
- कई भिन्न उप-सरणियों का अधिकतम योग समान हो सकता है।
यद्यपि इस समस्या को कई अलग-अलग एल्गोरिथम तकनीकों का उपयोग करके हल किया जा सकता है, जिनमें क्रूर बल,[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]
अनुप्रयोग
अधिकतम उपसरणी समस्याएं कई क्षेत्रों में उत्पन्न होती हैं, जैसे जीनोमिक अनुक्रम विश्लेषण और कंप्यूटर विज़न।
जीनोमिक अनुक्रम विश्लेषण प्रोटीन अनुक्रमों के महत्वपूर्ण जैविक खंडों की पहचान करने के लिए अधिकतम उप-सरणी एल्गोरिदम का उपयोग करता है। [उद्धरण वांछित] इन समस्याओं में संरक्षित खंड, जीसी-समृद्ध क्षेत्र, अग्रानुक्रम दोहराव, कम-सम्मिश्रता फ़िल्टर, डीएनए बाइंडिंग डोमेन और उच्च चार्ज के क्षेत्र सम्मिलित हैं। प्रशस्ति - पत्र आवश्यक]
कंप्यूटर विज़न में, छवि में सबसे प्रतिभाशाली क्षेत्र का पता लगाने के लिए बिटमैप छवियों पर अधिकतम-सबरे एल्गोरिदम का उपयोग किया जाता है।
कडेन का एल्गोरिदम
रिक्त उपसरणी स्वीकृत
Example run |
---|
जब रिक्त उपसरणी स्वीकार की जाती है तो कडेन का मूल एल्गोरिदम समस्या संस्करण को हल करता है। यह दिए गए ऐरे को बाएं से दाएं स्कैन करता है। वें चरण में, यह जे जे पर समाप्त होने वाले सबसे बड़े योग के साथ उपसरणी की गणना करता है; यह योग वेरिएबल 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]
यह भी देखें
- उपसमुच्चय योग समस्या
टिप्पणियाँ
- ↑ 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