Kadence algoritmusa: Legnagyobb összegű összefüggő részegység

⚡ Okos összefoglaló

Kadane algoritmusa lineáris időben a legnagyobb összegű összefüggő résztömböt keresi meg a következőképpen: tracegy futó maximumot generál ahelyett, hogy minden lehetséges altömböt átvizsgálna. Ez a klasszikus dinamikus programozási trükk a részvény-, pénzügyi és jelproblémák megoldására szolgál.

  • 🎯 Probléma meghatározás: Egy összefüggő résztömb egymást követő elemek sorozata; a cél a legnagyobb számtani összeggel rendelkező résztömb megtalálása egy vegyes pozitív és negatív tömbön belül.
  • ???? Nyers erő: Két egymásba ágyazott ciklus O(N²) idő alatt kiértékeli az összes kezdő- és végindexet, és kinyomtatja a nyertes ablakot a kezdő- és végjelölők használatával.
  • Kadane meglátásai: Állítsd vissza a futó összeget, valahányszor az aktuális elem meghaladja az akkumulátor értékét, tartsd megping csak a legjobb előtag, amely még kinőhetné a választ.
  • 🧭 Működő példa: Egy negatívokat tartalmazó tömb rövid áttekintése azt mutatja, hogyan fejlődik lépésről lépésre a max_sum és a current_sum, amíg el nem éri a valódi maximumot.
  • ???? Nyelvi lefedettség: Mindkét C++ és a Python Az egyszerű megközelítés és Kadane algoritmusának implementációi bemutatják az O(N²) időről az O(N) időre való átmenetet.
  • 📊 Bonyolultság: Kadane algoritmusa O(N) idő alatt fut O(1) plusz tárhellyel, jelentősen felülmúlva a nyers erő alapverzióját nagy bemeneti tömbökön.

Kadane algoritmusa Legnagyobb összegű összefüggő altömb

Mi a legnagyobb összegű összefüggő résztömb?

Az altömb egy tömb folytonos része. Ez lehet egy tömb egyetlen eleme vagy a tömb egy része. A legnagyobb összegű összefüggő altömb olyan altömböt jelent, amelynek a maximális összegértéke van.

Vegyük például a {-10, 5, 1, 6, -9, 2, -7, 3, -5} tömböt. Az altömbjei lehetnek {-10, 5, 1, 6}, {5, 1, 6} vagy {2, -7, 3, -5}, és így tovább. Azonban az {5, 1, 6, 3} nem lehet altömb, mivel az elemek nem egymás után következnek.

Legnagyobb összegű összefüggő alrendszer

Ha észreveszed, az összes altömb közül a kiemelt {5, 1, 6} altömb rendelkezik a maximális összegzési értékkel:

Legnagyobb összegű összefüggő altömb kiemelve

Az {5, 1, 6} résztömb összege 12, ami a fenti tömb összes lehetséges résztömbjének maximális összege. Tehát ennél a tömbnél az összefüggő résztömbök maximális összege {5, 1, 6}.

Egyszerű megközelítés a legnagyobb összegű összefüggő résztömb megoldására

A probléma egyszerű megoldása az, ha két hurok segítségével megkeresi az összes altömböt, kiszámítja az összeget, majd megtalálja a maximális értékét.

Íme a folyamatábra az egyszerű megközelítéshez, amellyel a legnagyobb összegű összefüggő résztömböt keressük. Ez egy nyers erő módszer, mivel minden lehetséges résztömbön végigmegyünk.

Egyszerű megközelítés a legnagyobb összeg megoldásához

Íme az egyszerű lépések ehhez.

Step 1) inicializálása max_összeg a minimális egész értékkel és beállítva kezdődik és a végén nullára.

Step 2) Legyen i és a j legyenek tömbindexek, ahol j nagyobb vagy egyenlő i; i az altömb kezdetét jelöli, és j a vége.

Step 3) aktuális_összeg tartalmazza a futó összeget. Minden frissítés után ellenőrizze, hogy aktuális_összeg nagyobb, mint max_összeg.

Step 4) If aktuális_összeg nagyobb, cserélje ki max_összeg vele.

Step 5) Amikor j eléri a tömb végét, növelés i és nullázza aktuális_összeg A 0.

Step 6) Ismételje meg, amíg i eléri a tömb végét. max_összeg akkor a legnagyobb résztömbösszeget tartalmazza.

Pszeudo Code az egyszerű megközelítéshez

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

C++ Az egyszerű megközelítés megvalósítása

#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 Az egyszerű megközelítés megvalósítása

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

Kadane algoritmusa a legnagyobb összegű összefüggő résztömb megtalálására

Kadane algoritmusa egy dinamikus programozási módszer, amely egyetlen ciklust használ kettő helyett. Kezeli a vegyes pozitív és negatív számokat tartalmazó tömböket, amennyiben legalább egy érték nem negatív.

Csak két változóra van szükségünk a legnagyobb összegű összefüggő résztömb megtalálásához. Íme a folyamatábra:

Kadane algoritmusa a legnagyobb összeg megtalálására

Íme a Kadane-algoritmus lépései:

Step 1) Hozz létre két változót, aktuális_összeg és a max_összeg.

aktuális_összeg megtartja a maximális összeget, amely egy adott tömbindexnél végződik, míg max_összeg az eddig megfigyelt legnagyobb összegzett értéket tárolja.

Step 2) Adja hozzá az egyes tömbelemeket aktuális_összegEzután ellenőrizze az alábbi két feltételt:

  • If aktuális_összeg kisebb, mint az aktuális elem, akkor aktuális_összeg válik az aktuális elemmé.
  • If max_összeg kevesebb mint aktuális_összeg, Akkor max_összeg válik aktuális_összeg.

Step 3) Miután megismételtük az előző lépést a teljes tömbre, max_összeg a legnagyobb összegű összefüggő altömböt tartalmazza.

Példa a Kadane-algoritmusra

Egy kis tömbön bemutatjuk Kadane algoritmusát, és végigmegyünk a legnagyobb összegű összefüggő résztömb megtalálásának minden lépésén.

Tegyük fel, hogy a megadott tömb a következőhöz hasonló:

Példa a Kadane-algoritmusra

Kadane algoritmusának lépései a következők:

Step 1) Hozz létre két változót, aktuális_összeg és a max_összeg. Rendelje hozzá az INT_MIN értékét a következőhöz: max_összeg és nullától aktuális_összegItt az INT_MIN a minimális egész értéket jelöli.

Step 2) A 0. indexnél az érték 4. Tehát, aktuális_összeg = 0 + 4 = 4. Mivel aktuális_összeg nagyobb, mint max_összeg, max_összeg 4-es lesz.

Példa Kadane algoritmusának 2. lépésére

Step 3) Az 1-es indexnél az érték -2. Tehát, aktuális_összeg = 4 + (-2) = 2.

Ezúttal aktuális_összeg kevesebb mint max_összegEnnek eredményeként a következő értéke max_összeg nincs frissítve.

Példa Kadane algoritmusának 3. lépésére

Step 4) A következő érték 1. Hozzáadása aktuális_összeg 3-at ad. Mivel max_összeg (4) még mindig nagyobb, mint aktuális_összeg, max_összeg nincs frissítve.

Példa Kadane algoritmusának 4. lépésére

Step 5) A 3-as indexnél az érték 3. Növekvő aktuális_összeg 3-szor ad aktuális_összeg = 6.

Példa Kadane algoritmusának 5. lépésére

Ebben az esetben, max_összeg kisebb, mint aktuális_összeg, Így max_összeg értékével frissül. aktuális_összeg.

Step 6) A tömb utolsó eleméhez -1-et adunk. Hozzáadjuk aktuális_összeg 5-öt ad, ami kisebb, mint max_összeg. Így, max_összeg marad a 6.

Példa Kadane algoritmusának 6. lépésére

Ahogy elértük a tömb végét, az algoritmus itt véget ér. Most, max_összeg tartalmazza a maximális összeget, ami 6. Az altömb {4, -2, 1, 3}.

Pszeudo Code Kadane algoritmusához

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++ Kadane algoritmusának megvalósítása

#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 Kadane algoritmusának megvalósítása

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

Komplexitáselemzés a legnagyobb összegű összefüggő alrendszerhez

Az egyszerű megközelítés két ciklust használ az összes lehetséges résztömbösszeg kiszámítására és a legnagyobb megkeresésére. Ez egy nyers erő módszer; minden ciklus a tömb végéig fut. sor, adva O(N²) idő.

Kadane algoritmusa csak egyetlen ciklust használ, ami O(N) időt és O(1) plusz helyet biztosít. Egy 100 elemből álló tömbön az egyszerű megközelítés 100 × 100 = 10 000 műveletet hajt végre, míg Kadane algoritmusa csak 100-at – ami drámai gyorsulást jelent nagy bemenetek esetén.

GYIK

A Kadane algoritmusa az idősoros adatok, az anomáliaablak-észlelés és a jutalommegosztás mesterséges intelligencia alapú funkciótervezésének alapját képezi.ping a megerősítéses tanulásban, helping A modellek a zajos jelekben észlelik a legerősebb pozitív összegű intervallumot.

Igen. A GitHub Copilot és a GPT megbízhatóan kimenetileg adja ki Kadane algoritmusát. Python, C++és Java, beleértve azokat a változatokat is, amelyek a nyertes altömb kezdő és záró indexét adják vissza.

Kadane algoritmusa O(N) időben és O(1) segédtérben fut, mivel egyetlen menetet végez traca király csak egy futó összeget és egy eddigi legjobb értéket képvisel.

A max_sum értékét inicializálja az első elemre vagy negatív végtelenre nulla helyett. Az algoritmus ezután a legkisebb negatív elemet adja vissza, ami a helyes válasz.

Gyakori felhasználási területek a részvények vételi-eladási profitablakai, az image edge summák, a genomikai pontozási intervallumok és a pénzügyi kockázatelemzés, ahol a legjobb összefüggő hozamablak számít a legjobban.

Tracka ideiglenes kezdőindex, valahányszor a current_sum visszaáll az aktuális elemre. Amikor a max_sum frissül, rögzítse a kezdő és a záró indexeket, hogy a válasz altömb a végén felszeletelhető legyen.

Az oszd meg és uralkodj módszer a maximális résztömböt O(N log N) tömbben oldja meg a bal, jobb és keresztező összegek kombinálásával. Kadane algoritmusa gyorsabb O(N) tömbben és könnyebben kódolható.

Igen. Kadane egy kanonikus dinamikus programozási példa O(1) állapottal, ahol minden új, i-edik indexnél végződő maximum az i-edik indexnél végződő maximum mínusz egy plusz az aktuális elem összegétől függ.

Foglald össze ezt a bejegyzést a következőképpen: