कैडेंस का एल्गोरिथ्म: सबसे बड़ा योग सन्निहित उपसरणी

⚡ स्मार्ट सारांश

कडेन का एल्गोरिदम रैखिक समय में सबसे बड़े योग वाले सन्निहित उप-सरण को ढूंढता है। tracप्रत्येक संभावित सबएरे को स्कैन करने के बजाय एक रनिंग मैक्सिमम प्राप्त करना। डायनेमिक प्रोग्रामिंग की यह क्लासिक ट्रिक स्टॉक, फाइनेंस और सिग्नल समस्याओं को हल करने में सहायक होती है।

  • 🎯 समस्या की परिभाषा: एक सन्निहित उप-सरण लगातार तत्वों का एक क्रम होता है; लक्ष्य एक मिश्रित धनात्मक और ऋणात्मक सरणी के भीतर उच्चतम अंकगणितीय योग वाली उप-सरण प्राप्त करना है।
  • 🐢 पाशविक बल: दो नेस्टेड लूप O(N²) समय में प्रत्येक प्रारंभ और अंत सूचकांक का मूल्यांकन करते हैं और प्रारंभ और अंत मार्करों का उपयोग करके विजेता विंडो को प्रिंट करते हैं।
  • कडेन की अंतर्दृष्टि: जब भी वर्तमान तत्व संचायक से अधिक हो जाए, तो चल रहे योग को रीसेट करें।ping केवल वही सर्वोत्तम उपसर्ग जो उत्तर में परिवर्तित हो सकता है।
  • 🧭 कार्य उदाहरण: ऋणात्मक संख्याओं वाले एक ऐरे का संक्षिप्त विश्लेषण दर्शाता है कि कैसे max_sum और current_sum चरण दर चरण विकसित होते हैं जब तक कि वास्तविक अधिकतम मान प्राप्त नहीं हो जाता।
  • 💻 भाषा कवरेज: दोनों C++ और Python सरल दृष्टिकोण और कडेन के एल्गोरिदम के कार्यान्वयन से O(N²) से O(N) समय में संक्रमण प्रदर्शित होता है।
  • 📊 जटिलता: कडेन का एल्गोरिदम O(N) समय में O(1) अतिरिक्त स्थान के साथ चलता है, जो बड़े इनपुट सरणियों पर ब्रूट-फोर्स बेसलाइन से कहीं बेहतर प्रदर्शन करता है।

कडेन का एल्गोरिदम: सबसे बड़ा योग सन्निहित उप-सरण

सबसे बड़ा योग वाला सन्निहित उप-सरण कौन सा है?

उपसरणी सरणी का एक सतत भाग है। यह सरणी का एक एकल तत्व या सरणी का कुछ अंश हो सकता है। सबसे बड़ा योग सन्निहित उपसरणी का अर्थ है वह उपसरणी जिसका योग मान अधिकतम है।

उदाहरण के लिए, {-10, 5, 1, 6, -9, 2, -7, 3, -5} नामक एरे को लें। इसके सबएरे {-10, 5, 1, 6}, {5, 1, 6} या {2, -7, 3, -5} आदि हो सकते हैं। हालांकि, {5, 1, 6, 3} एक सबएरे नहीं हो सकता क्योंकि इसके तत्व एक सन्निहित क्रम में नहीं हैं।

सबसे बड़ा योग सन्निहित उपसरणी

यदि आप ध्यान दें, तो सभी उप-सरणियों में से, हाइलाइट की गई उप-सरणी {5, 1, 6} का योग मान अधिकतम है:

सबसे बड़े योग वाले सन्निहित उप-सरण को हाइलाइट किया गया है

उप-सरण {5, 1, 6} का योग 12 है, जो उपरोक्त सारणी के सभी संभावित उप-सरणों का अधिकतम योग है। अतः, इस सारणी के लिए, अधिकतम योग वाला सन्निहित उप-सरण {5, 1, 6} है।

सबसे बड़े योग वाले सन्निहित उप-सरण को हल करने का सरल तरीका

इस समस्या को हल करने का सरल तरीका यह है कि दो लूपों का उपयोग करके सभी उप-सरणी ज्ञात करें, योग की गणना करें, और फिर उसका अधिकतम मान ज्ञात करें।

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

सबसे बड़ी राशि को हल करने का सरल तरीका

ऐसा करने के लिए सरल चरण यहां दिए गए हैं।

चरण 1) हस्ताक्षर करना अधिकतम योग न्यूनतम पूर्णांक मान के साथ और सेट करें शुरू करना और समाप्त शून्य करने के लिए।

चरण 2) चलो i और j वे सरणी सूचकांक हैं जहाँ j से अधिक या बराबर है i; i सबएरे की शुरुआत को चिह्नित करता है और j यह खत्म होता है।

चरण 3) वर्तमान_योग इसमें चालू योग रहता है। प्रत्येक अपडेट के बाद, जांचें कि क्या वर्तमान_योग से अधिक है अधिकतम योग.

चरण 4) If वर्तमान_योग अगर बड़ा है, तो बदलें अधिकतम योग इसके साथ.

चरण 5) . j ऐरे के अंत तक पहुँचने पर, वृद्धि करें i और रीसेट करें वर्तमान_योग 0 लिए.

चरण 6) दोहराओ जब तक i ऐरे के अंत तक पहुँच जाता है। अधिकतम योग फिर इसमें सबसे बड़ा सबएरे योग होता है।

उपनाम Code सरल दृष्टिकोण के लिए

function maximumSubarraySum():
    input: array
    for all possible subArray from array:
        calculate sum of each subarray
        store the maximum subArray
    return the maximum sum

C++ सरल दृष्टिकोण का कार्यान्वयन

#include <stdio.h>
#include <iostream>
using namespace std;
void maximumSubarraySum(int array[], int n) {
    int max_sum = -1e9;
    int begin = 0;
    int end = 0;
    for (int i = 0; i < n; i++) {
        int current_sum = 0;
        for (int j = i; j < n; j++) {
            current_sum += array[j];
            if (max_sum < current_sum) {
                max_sum = current_sum;
                begin = i;
                end = j;
            }
        }
    }
    cout << "largest sum is " << max_sum << endl;
    cout << "largest sum contiguous subarray: ";
    for (int i = begin; i <= end; i++) {
        cout << array[i] << "\t";
    }
}
int main() {
    int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
    maximumSubarraySum(array, sizeof(array) / sizeof(array[0]));
}

आउटपुट:

largest sum is 12
largest sum contiguous subarray: 5      1       6

Python सरल दृष्टिकोण का कार्यान्वयन

def maximumSubarraySum(numbers):
    max_sum, begin, end = -1e9, 0, 0
    for i in range(len(numbers)):
        current_sum = 0
        for j in range(i, len(numbers)):
            current_sum += numbers[j]
            if max_sum < current_sum:
                max_sum = current_sum
                begin, end = i, j
    print("largest sum is ", max_sum)
    print("largest sum contiguous subarray: ", end='')
    for i in range(begin, end + 1):
        print(numbers[i], end='\t')

numbers = [-10, 5, 1, 6, -9, 2, -7, 3, -5]
maximumSubarraySum(numbers)

आउटपुट:

largest sum is 12
largest sum contiguous subarray: 5      1       6

सबसे बड़े योग वाले सन्निहित उप-सरण को खोजने के लिए कडेन का एल्गोरिदम

कडेन का एल्गोरिदम एक डायनामिक प्रोग्रामिंग विधि है जो दो लूप के बजाय एक ही लूप का उपयोग करती है। यह मिश्रित धनात्मक और ऋणात्मक संख्याओं वाले सरणियों को संभालता है, बशर्ते कि कम से कम एक मान गैर-ऋणात्मक हो।

सबसे बड़े योग वाले सन्निहित उप-सरण को खोजने के लिए हमें केवल दो चरों की आवश्यकता होती है। यहाँ फ्लोचार्ट दिया गया है:

सबसे बड़ी राशि ज्ञात करने के लिए कडेन का एल्गोरिदम

कडाने के एल्गोरिथ्म के चरण इस प्रकार हैं:

चरण 1) दो वेरिएबल बनाएं, वर्तमान_योग और अधिकतम योग.

वर्तमान_योग यह किसी विशिष्ट ऐरे इंडेक्स पर समाप्त होने वाले अधिकतम योग को रखता है, जबकि अधिकतम योग इसमें अब तक देखे गए सबसे बड़े योग मान को संग्रहित किया गया है।

चरण 2) प्रत्येक ऐरे एलिमेंट को जोड़ें वर्तमान_योगफिर नीचे दी गई दो शर्तों की जांच करें:

  • If वर्तमान_योग यदि यह वर्तमान तत्व से कम है, तो वर्तमान_योग वर्तमान तत्व बन जाता है।
  • If अधिकतम योग से कम है वर्तमान_योग, तो अधिकतम योग हो जाता है वर्तमान_योग.

चरण 3) संपूर्ण ऐरे के लिए पिछले चरण को दोहराने के बाद, अधिकतम योग इसमें सबसे बड़ा योग वाला सन्निहित उप-सरण शामिल है।

कडाने के एल्गोरिथ्म का उदाहरण

हम एक छोटे से ऐरे पर कडेन के एल्गोरिदम का प्रदर्शन करते हैं और सबसे बड़े योग वाले सन्निहित सबऐरे को खोजने के प्रत्येक चरण को समझाते हैं।

मान लीजिए कि दिया गया ऐरे निम्नलिखित प्रकार का है:

कडाने के एल्गोरिथ्म का उदाहरण

कडेन के एल्गोरिदम के चरण इस प्रकार हैं:

चरण 1) दो वेरिएबल बनाएं, वर्तमान_योग और अधिकतम योगINT_MIN को असाइन करें अधिकतम योग और शून्य से वर्तमान_योगयहां, INT_MIN न्यूनतम पूर्णांक मान को दर्शाता है।

चरण 2) सूचकांक 0 पर मान 4 है। इसलिए, वर्तमान_योग = 0 + 4 = 4. चूंकि वर्तमान_योग से बड़ा है अधिकतम योग, अधिकतम योग 4 हो जाता है.

कडेन के एल्गोरिदम का उदाहरण, चरण 2

चरण 3) सूचकांक 1 पर मान -2 है। इसलिए, वर्तमान_योग = 4 + (-2) = 2.

इस समय वर्तमान_योग से कम है अधिकतम योगपरिणामस्वरूप, मूल्य अधिकतम योग अपडेट नहीं किया गया है।

कडेन के एल्गोरिदम का उदाहरण, चरण 3

चरण 4) अगला मान 1 है। इसे जोड़ने पर वर्तमान_योग 3 देता है। चूंकि अधिकतम योग (4) अभी भी इससे अधिक है वर्तमान_योग, अधिकतम योग अपडेट नहीं किया गया है।

कडेन के एल्गोरिदम का उदाहरण, चरण 4

चरण 5) इंडेक्स 3 पर मान 3 है। वृद्धि हो रही है। वर्तमान_योग 3 से भाग देने पर वर्तमान_योग = 6.

कडेन के एल्गोरिदम का उदाहरण, चरण 5

इस मामले में, अधिकतम योग की तुलना में छोटा है वर्तमान_योग, इतना अधिकतम योग को मान के साथ अपडेट किया जाता है वर्तमान_योग.

चरण 6) ऐरे के अंतिम तत्व के लिए, हमारे पास -1 है। इसे जोड़ने पर वर्तमान_योग 5 देता है, जो इससे छोटा है अधिकतम योग। इसलिए, अधिकतम योग 6 रहता है।

कडेन के एल्गोरिदम का उदाहरण, चरण 6

जैसे ही हम ऐरे के अंत तक पहुँचते हैं, एल्गोरिदम यहीं समाप्त हो जाता है। अब, अधिकतम योग इसमें अधिकतम योग है, जो कि 6 है। उप-सरण {4, -2, 1, 3} है।

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

function KadaneAlgorithm():
    input: array
    maximum_sum, current_sum = 0
    for each element in array:
        add the element with current_sum
        if current_sum is greater than the maximum_sum
            then maximum_sum = current_sum
        if current_sum is less than the element
            then current_sum = element
    return the value of maximum_sum

C++ कडाने के एल्गोरिदम का कार्यान्वयन

#include <iostream>
using namespace std;
void kadane(int array[], int n) {
    int current_sum = 0;
    int max_sum = -1e9;
    // -1e9 means -1,000,000,000
    for (int i = 0; i < n; i++) {
        current_sum += array[i];
        if (max_sum < current_sum) {
            max_sum = current_sum;
        }
        if (current_sum < array[i]) {
            current_sum = array[i];
        }
    }
    cout << "largest sum is " << max_sum << endl;
}
int main() {
    int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
    kadane(array, sizeof(array) / sizeof(array[0]));
}

आउटपुट:

largest sum is 12

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

def kadane(numbers):
    current_sum = 0
    max_sum = -1e9
    for i in range(len(numbers)):
        current_sum += numbers[i]
        if max_sum < current_sum:
            max_sum = current_sum
        if current_sum < numbers[i]:
            current_sum = numbers[i]
    print("largest sum is ", max_sum)

kadane([-10, 5, 1, 6, -9, 2, -7, 3, -5])

आउटपुट:

largest sum is 12

सबसे बड़े योग सन्निहित उपसरणी के लिए जटिलता विश्लेषण

सरल विधि में दो लूप का उपयोग करके सभी संभावित सबएरे के योग की गणना की जाती है और सबसे बड़े योग का पता लगाया जाता है। यह एक ब्रूट-फोर्स विधि है; प्रत्येक लूप अंत तक चलता है। सरणी, दे रहा है O(N²) समय है.

कडेन का एल्गोरिदम केवल एक लूप का उपयोग करता है, जिससे O(N) समय और O(1) अतिरिक्त स्थान प्राप्त होता है। 100 तत्वों वाले एक ऐरे पर, सरल विधि 100 × 100 = 10,000 ऑपरेशन करती है, जबकि कडेन का एल्गोरिदम केवल 100 ऑपरेशन करता है - बड़े इनपुट के लिए यह गति में एक उल्लेखनीय वृद्धि है।

अक्सर पूछे जाने वाले प्रश्न

कडेन का एल्गोरिदम टाइम-सीरीज़ डेटा, विसंगति विंडो डिटेक्शन और रिवार्ड-शेडिंग के लिए AI फीचर इंजीनियरिंग का आधार है।ping रीइन्फोर्समेंट लर्निंग में, हेलping मॉडल शोर वाले संकेतों में सबसे मजबूत धनात्मक-योग अंतराल का पता लगाते हैं।

हाँ। GitHub Copilot और GPT विश्वसनीय रूप से Kadane's Algorithm को आउटपुट करते हैं। Python, C++, तथा Javaइसमें वे वेरिएंट भी शामिल हैं जो जीतने वाले सबएरे के प्रारंभ और अंत सूचकांक लौटाते हैं।

कडेन का एल्गोरिदम O(N) समय और O(1) सहायक स्थान में चलता है क्योंकि यह केवल एक ही पास लेता है। tracकेवल चालू योग और अब तक का सर्वोत्तम मूल्य ही मान्य है।

max_sum को शून्य के बजाय पहले तत्व या ऋणात्मक अनंत से प्रारंभ करें। एल्गोरिदम तब सबसे कम ऋणात्मक तत्व लौटाता है, जो सही उत्तर है।

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

Tracजब भी current_sum वर्तमान तत्व पर रीसेट होता है, तो ka अस्थायी प्रारंभ सूचकांक का उपयोग करें। जब max_sum अपडेट होता है, तो प्रारंभ और अंत सूचकांकों को कैप्चर करें ताकि उत्तर उप-सरण को अंत में विभाजित किया जा सके।

डिवाइड एंड कॉंकर विधि बाएं, दाएं और क्रॉसिंग योगों को मिलाकर O(N log N) समय में अधिकतम सबएरे को हल करती है। कडेन का एल्गोरिदम O(N) समय में इससे तेज़ है और इसे कोड करना आसान है।

हाँ। कडेन का उदाहरण O(1) स्टेट वाला एक मानक डायनेमिक प्रोग्रामिंग उदाहरण है, जहाँ इंडेक्स i पर समाप्त होने वाला प्रत्येक नया अधिकतम मान इंडेक्स i पर समाप्त होने वाले अधिकतम मान से एक कम और वर्तमान तत्व के योग पर निर्भर करता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: