Jos olet täällä, niin mahdollisuudet ovat, että olet yrittää ratkaista ”Suurin Subarray Ongelma” ja törmäsin Kadane on Algoritmi, mutta ei voinut selvittää, miten jotain, joka toimii. Tai ehkä kyllästyit käyttämään Kadanen algoritmia ”mustana laatikkona”. Tai ehkä halusit ymmärtää sen dynaamisen ohjelmoinnin. Tai ehkä haluat vain oppia uudesta konseptista, joka voi tehdä sinut paremmaksi ohjelmoinnissa. Olipa syy mikä tahansa, olet tullut oikeaan paikkaan.,

jotta Kadanen algoritmi ymmärtäisi paremmin, kävisimme ensin läpi lyhyen dynaamisen ohjelmoinnin esittelyn. Sitten tarkastelisimme varsin suosittua ohjelmointiongelmaa, maksimaalista Subarray-ongelmaa. Haluamme nähdä, miten tämä ongelma voidaan ratkaista käyttämällä brute force lähestymistapa ja sitten yritämme parantaa meidän lähestymistapa ja keksiä parempi algoritmi, aka, Kadane Algoritmi.

So, let ’ s get into it.,

Dynaaminen Ohjelmointi

Dynaaminen Ohjelmointi on menetelmä, jolla voidaan ratkaista monimutkainen ongelma, rikkomalla se alas kokoelma yksinkertaisempi subproblems, ratkaista jokainen näistä subproblems vain kerran, ja tallentaa niiden ratkaisuja käyttämällä muistia perustuva tietorakenne (jono, kartta, jne.). Joten seuraavan kerran, kun sama osa-ongelma ilmenee, sen sijaan recomputing sen ratkaisu, yksi yksinkertaisesti näyttää jopa aiemmin laskettu ratkaisu, mikä säästää laskenta-aikaa.

ne, jotka eivät muista menneisyyttä, tuomitaan toistamaan sitä., — Dynaaminen Ohjelmointi,

Tässä on loistava selitys käsite Dynaaminen Ohjelmointi Quora — Jonathan Paulson on vastaus siihen, Miten minun pitäisi selittää, dynaaminen ohjelmointi 4-vuotias?

vaikka dynaamisessa ohjelmoinnissa on muutakin, siirtyisimme eteenpäin ymmärtääksemme suurimman Subarray-ongelman.

Suurin Subarray Ongelma

suurin subarray ongelma on tehtävänä on löytää suurin mahdollinen summa vierekkäisiä subarray, tietyn one-dimensional array numeroita.,

Suurin Summa Subarray (Keltainen)

esimerkiksi varten array edellä, vierekkäisiä subarray suurin summa on summa 6. Käyttäisimme tätä array esimerkkinä loput tämän artikkelin. Lisäksi oletamme, että tämä array on nolla-indeksoitu, eli -2 kutsutaan ” 0th ” elementti array ja niin edelleen. Myös A edustaisi indeksin I arvoa.,

nyt, meillä olisi tarkastella hyvin ilmeinen ratkaisu annettuun ongelmaan.

Brute Force Lähestymistapa

Yksi hyvin ilmeinen, mutta ei niin hyvä ratkaisu on laskea summa, joka on mahdollista subarray ja suurin niistä olisi ratkaisu. Voimme aloittaa indeksistä 0 ja laskea jokaisen mahdollisen subarrayn summan alkaen alkuaineesta A, kuten alla olevassa kuvassa näkyy. Sitten, me laskea summa, joka on mahdollista subarray alkaen, ja niin edelleen jopa, missä n tarkoittaa koko joukko (n = 9 tässä tapauksessa)., Huomaa, että jokainen elementti on itse subarray.

Brute Force Lähestymistapa: Iteraatio 0 (vasen) ja Iteraatio 1 (oikea)

kutsumme suurin summa subarrays alkaen elementti A local_maximum indeksissä i. Näin kun menee läpi kaikki indeksit, meillä olisi jäänyt local_maximum kaikki indeksit. Lopuksi voimme löytää maksimin näistä local_maximums ja saisimme lopullisen ratkaisun, ts., suurin mahdollinen summa. Kutsumme tätä global_maksimumiksi.

Mutta saatat huomata, että tämä ei ole kovin hyvä menetelmä, koska koko array kasvaa, useita mahdollisia subarrays kasvaa nopeasti, mikä lisää laskennallinen monimutkaisuus. Tai tarkemmin sanottuna, jos taulukon koko on n, niin aika monimutkainen tämä ratkaisu on O(n2), joka ei ole kovin hyvä.

miten voimme parantaa tätä? Voiko dynaamisen ohjelmoinnin käsitettä mitenkään hyödyntää? Otetaan selvää.,

Kadane Algoritmi

tässä osiossa haluamme käyttää brute force lähestymistapa edellä jälleen, mutta tällä kertaa haluamme aloittaa taaksepäin. Miten se auttaisi? Katsotaanpa.

– Meidän olisi aloitettava viimeinen elementti ja laskea summa, joka on mahdollista subarray päättyen elementti A, kuten kuvassa alla. Sitten laskemme jokaisen mahdollisen subarrayn summan, joka päättyy A: han ja niin edelleen A: han asti.,

Taaksepäin Brute Force Lähestymistapa: Iteraatio 0 (vasen) ja Iteraatio 1 (oikea)

Nyt keskitytään subarrays päättyen elementti A (=-1) ja A (=2) kuvassa alla.,

kuva yllä, näemme, että local_maximum on yhtä suuri kuin 3, joka on summa subarray . Nyt vilkaista subarrays päättyen A. huomaat, että nämä subarrays voidaan jakaa kahteen osaan, subarrays päättyy (korostettu keltaisella) ja yksittäinen elementti subarray A (vihreä).

Let ’ s say somewhere I know the local_maximum., Sitten me näemme, että laskea local_maximum, meidän ei tarvitse laskea summa kaikkien subarrays päättyy, koska me tiedämme jo tuloksen taulukot päättyen A. Huomaa, että jos joukko oli suurin summa, sitten me vain täytyy tarkistaa taulukot korostettu punaiset nuolet laskea local_maximum. Tämä johtaa Kadanen algoritmin toimintaperiaatteeseen.

local_maximum indeksi i on maksimi ja summa A ja local_maximum indeksi i-1.,

Käyttämällä edellä mainittua menetelmää, meidän täytyy kerrata läpi array vain kerran, mikä on paljon parempi kuin edellinen brute force lähestymistapaa. Tai tarkemmin sanottuna kadanen algoritmin ajallinen monimutkaisuus on O (n).

lopuksi katsotaan, miten tämä kaikki toimisi koodissa.,

– Koodin Läpikäynti

Alla on hyvin self-selittävä toteutus (C++) on toiminto, joka vie array argumenttina ja palauttaa summa enintään subarray.

Huomaa, että sen sijaan käyttää array tallentaa local_maximums, olemme yksinkertaisesti tallentaa uusimmat local_maximum int-tyypin muuttuja ’local_max’, koska se on mitä meidän täytyy laskea seuraavan local_maximum., Myös, kuten olemme käyttäen muuttuja ’global_max’ pitää kirjaa suurin arvo local_maximum, joka lopulta tulee ulos on tarvittavan tehon.

Johtopäätös

Koska tämä algoritmi käyttää optimaalinen päin (suurin subarray päättyy kussakin asemassa on laskettu yksinkertaisella tavalla, jotka liittyvät mutta pienempi ja päällekkäisiä subproblem: suurin subarray päättyy edellisessä asennossa) tämän algoritmin voidaan katsoa olevan yksinkertainen esimerkki dynaaminen ohjelmointi., Kadane algoritmi pystyy löytämään maksimi summa vierekkäisiä subarray array kanssa runtime O(n).

Articles

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *