Kadences algoritme: Største sum sammenhængende subarray

⚡ Smart opsummering

Kadanes algoritme finder det største sum af sammenhængende underarray i lineær tid ved trackonstruere et løbende maksimum i stedet for at scanne alle mulige underarrays. Dette klassiske dynamiske programmeringstrick styrer aktie-, finans- og signalproblemer.

  • 🎯 Problemdefinition: Et sammenhængende underarray er en sekvens af fortløbende elementer; målet er underarrayet med den højeste aritmetiske sum inden for et blandet positivt og negativt array.
  • ???? Råstyrke: To indbyggede løkker evaluerer hvert start- og slutindeks i O(N²) tid og udskriver det vindende vindue ved hjælp af start- og slutmarkører.
  • Kadanes indsigt: Nulstil den løbende sum, når det aktuelle element slår akkumulatoren, keepping kun det bedste præfiks, der stadig kunne vokse ind i svaret.
  • 🧭 Udarbejdet eksempel: En kort gennemgang af et array med negativer viser, hvordan max_sum og current_sum udvikler sig trin for trin, indtil det sande maksimum er registreret.
  • 💻 Sprogdækning: Både C++ og Python Implementeringer af den simple tilgang og Kadanes algoritme demonstrerer overgangen fra O(N²) til O(N) tid.
  • 📊 kompleksitet: Kadanes algoritme kører i O(N) tid med O(1) ekstra plads, hvilket dramatisk overgår brute-force-grundlinjen på store inputarrays.

Kadanes algoritme Største sum sammenhængende underarray

Hvad er den største sum sammenhængende undergruppe?

Et underarray er en kontinuerlig del af et array. Det kan være et enkelt element i et array eller en brøkdel af arrayet. Den største sum sammenhængende subarray betyder en subarray, der har den maksimale sumværdi.

Tag for eksempel arrayet {-10, 5, 1, 6, -9, 2, -7, 3, -5}. Dets underarrays kan være {-10, 5, 1, 6}, {5, 1, 6} eller {2, -7, 3, -5} osv. {5, 1, 6, 3} kan dog ikke være et underarray, fordi elementerne ikke er i en sammenhængende rækkefølge.

Største sum sammenhængende subarray

Hvis du bemærker, at blandt alle underarraysene har det fremhævede underarray {5, 1, 6} den maksimale summationsværdi:

Største sum sammenhængende underarray fremhævet

Summen af ​​underarrayet {5, 1, 6} er 12, den maksimale sum på tværs af alle mulige underarrayer i ovenstående array. Så for dette array er den maksimale sum af sammenhængende underarrayer {5, 1, 6}.

Simpel tilgang til løsning af den største sum af sammenhængende underarray

Den enkle måde at løse dette problem på er at bruge to sløjfer til at finde alle subarrays, beregne summen og derefter finde dens maksimale værdi.

Her er flowdiagrammet for den simple metode til at finde det største summen af ​​sammenhængende underarray. Dette er en brute-force-metode, da vi gennemgår alle mulige underarrayer.

Enkel tilgang til at løse den største sum

Her er de enkle trin til at gøre dette.

Trin 1) Initialiser maks_sum med den minimale heltalsværdi og sæt begynde og ende til nul.

Trin 2) Lade i og j være arrayindekser hvor j er større end eller lig med i; i markerer starten af ​​underarrayet og j dens ende.

Trin 3) nuværende_sum indeholder den løbende sum. Efter hver opdatering skal du kontrollere, om nuværende_sum er større end maks_sum.

Trin 4) If nuværende_sum er større, erstat maks_sum med det.

Trin 5) Når j når slutningen af ​​arrayet, forøg i og nulstil nuværende_sum til 0.

Trin 6) Gentag indtil i når slutningen af ​​arrayet. maks_sum indeholder så den største underarraysum.

Kaldenavn Code for simpel tilgang

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

C++ Implementering af Simple Approach

#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]));
}

Output:

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

Python Implementering af Simple Approach

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)

Output:

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

Kadanes algoritme til at finde den største sum af sammenhængende undergruppe

Kadanes algoritme er en dynamisk programmeringsmetode, der bruger et enkelt loop i stedet for to. Den håndterer arrays med blandede positive og negative tal, så længe mindst én værdi ikke er negativ.

Vi behøver kun to variabler for at finde den største sum af sammenhængende underarray. Her er flowdiagrammet:

Kadanes algoritme til at finde den største sum

Her er trinene til Kadanes algoritme:

Trin 1) Opret to variabler, nuværende_sum og maks_sum.

nuværende_sum bevarer den maksimale sum, der ender ved et specifikt arrayindeks, mens maks_sum gemmer den største summeringsværdi, der er observeret hidtil.

Trin 2) Tilføj hvert array-element til nuværende_sumTjek derefter de to betingelser nedenfor:

  • If nuværende_sum er mindre end det aktuelle element, så nuværende_sum bliver det aktuelle element.
  • If maks_sum er mindre end nuværende_sum, derefter maks_sum bliver nuværende_sum.

Trin 3) Efter at have gentaget det foregående trin for hele arrayet, maks_sum indeholder den største sum af sammenhængende underarray.

Eksempel på Kadanes algoritme

Vi demonstrerer Kadanes algoritme på et lille array og gennemgår hvert trin i at finde det største summen af ​​et sammenhængende underarray.

Lad os antage, at det givne array er som følger:

Eksempel på Kadanes algoritme

Her er trinnene i Kadanes algoritme:

Trin 1) Opret to variabler, nuværende_sum og maks_sumTildel INT_MIN til maks_sum og nul til nuværende_sumHer repræsenterer INT_MIN den minimale heltalsværdi.

Trin 2) Ved indeks 0 er værdien 4. Så, nuværende_sum = 0 + 4 = 4. Da nuværende_sum er større end maks_sum, maks_sum bliver 4.

Eksempel på Kadanes algoritme trin 2

Trin 3) Ved indeks 1 er værdien -2. Så, nuværende_sum = 4 + (-2) = 2.

Denne gang nuværende_sum er mindre end maks_sumSom følge heraf er værdien af maks_sum er ikke opdateret.

Eksempel på Kadanes algoritme trin 3

Trin 4) Den næste værdi er 1. Lægger man den til nuværende_sum giver 3. Siden maks_sum (4) er stadig større end nuværende_sum, maks_sum er ikke opdateret.

Eksempel på Kadanes algoritme trin 4

Trin 5) Ved indeks 3 er værdien 3. Inkrementering nuværende_sum med 3 giver nuværende_sum = 6.

Eksempel på Kadanes algoritme trin 5

I dette tilfælde, maks_sum er mindre end nuværende_sum, Så maks_sum opdateres med værdien af nuværende_sum.

Trin 6) For det sidste element i arrayet har vi -1. Lægger vi det til nuværende_sum giver 5, hvilket er mindre end maks_sum. Så, maks_sum forbliver 6.

Eksempel på Kadanes algoritme trin 6

Da vi nåede slutningen af ​​arrayet, slutter algoritmen her. Nu, maks_sum indeholder den maksimale sum, som er 6. Underarrayet er {4, -2, 1, 3}.

Kaldenavn Code for Kadanes algoritme

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++ Implementering af Kadanes Algoritme

#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]));
}

Output:

largest sum is 12

Python Implementering af Kadanes Algoritme

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])

Output:

largest sum is 12

Kompleksitetsanalyse for Største Sum Sammenhængende Subarray

Den simple tilgang bruger to løkker til at beregne alle mulige subarray-summer og finde den største. Det er en brute-force-tilgang; hver løkke løber til slutningen af matrix, giver O(N²) tid.

Kadanes algoritme bruger kun én løkke, hvilket giver O(N) tid og O(1) ekstra plads. På et array af 100 elementer udfører den simple tilgang 100 × 100 = 10,000 operationer, mens Kadanes kun udfører 100 - en dramatisk hastighedsforøgelse for store input.

Ofte Stillede Spørgsmål

Kadanes algoritme understøtter AI-funktionsudvikling til tidsseriedata, detektion af anomalivinduer og belønningsdelingping i forstærkningslæring, helping Modeller finder det stærkeste positive sum-interval i støjende signaler.

Ja. GitHub Copilot og GPT udsender pålideligt Kadanes algoritme i Python, C++og Java, inklusive varianter, der returnerer start- og slutindekserne for det vindende underarray.

Kadanes algoritme kører i O(N) tid og O(1) hjælperum, fordi den foretager en enkelt gennemgang trackun et løbende beløb og en hidtil bedste værdi.

Initialiser max_sum til det første element eller til negativ uendelighed i stedet for nul. Algoritmen returnerer derefter det mindst negative element, som er det korrekte svar.

Almindelige anvendelser er profitvinduer for køb og salg af aktier, billedkantsummer, genomiske scoringsintervaller og finansiel risikoanalyse, hvor det bedste sammenhængende afkastvindue er vigtigst.

Tracet midlertidigt startindeks, når current_sum nulstilles til det aktuelle element. Når max_sum opdateres, skal start- og slutindekserne registreres, så svar-underarrayet kan opdeles i slutningen.

Divide and hersk løser det maksimale underarray i O(N log N) ved at kombinere venstre-, højre- og krydssummer. Kadanes algoritme er hurtigere ved O(N) og lettere at kode.

Ja. Kadanes er et kanonisk dynamisk programmeringseksempel med O(1) tilstand, hvor hvert nyt maksimum, der slutter ved indeks i, afhænger af maksimum, der slutter ved indeks i minus én plus det aktuelle element.

Opsummer dette indlæg med: