Hvis du er her, så sjansene er at du prøver å løse «Maksimal Subarray Problem» og kom over Kadane Algoritme, men kunne ikke finne ut hvordan noe som virker. Eller kanskje du ble lei av å bruke Kadane Algoritme som en «svart boks». Eller kanskje du ønsket å forstå dynamisk programmering aspektet av det. Eller kanskje du bare ønsker å lære om et nytt konsept som kan gjøre deg bedre på programmering. Uansett årsak, har du kommet til rett sted.,
for Å forstå bedre Kadane Algoritme, for det første, vi vil gå gjennom en kort introduksjon av Dynamisk Programmering. Deretter vil vi se på en ganske populær programmering problem, Maksimal Subarray Problem. Vi ville se hvordan dette problemet kan løses ved hjelp av et «brute force» – tilnærming og så vil vi prøve å forbedre vår tilnærming og komme opp med en bedre algoritme, aka, Kadane Algoritme.
Så, la oss komme inn i det.,
Dynamisk Programmering
Dynamisk Programmering er en metode for å løse et komplekst problem ved å bryte det ned i en samling av enklere subproblems, løse hvert av de subproblems bare en gang, og lagrer sine løsninger ved hjelp av et minne-baserte data-struktur (matrise, kart, etc.). Så neste gang den samme sub-problemet oppstår, i stedet for recomputing sin løsning, en bare ser opp tidligere beregnet løsning, og dermed spare beregning tid.
De som ikke kan huske fortiden er dømt til å gjenta den., — Dynamisk Programmering
Her er en glimrende forklaring på begrepet Dynamisk Programmering på Quora — Jonathan Paulson svar på Hvordan skal jeg forklare dynamisk programmering til en 4-åring?
selv Om det er mer dynamisk programmering, ville vi gå videre til å forstå den Maksimale Subarray Problem.
Maksimalt Subarray Problem
Den maksimale subarray problemet er oppgaven med å finne den største mulige summen av en sammenhengende subarray, innen en gitt én-dimensjonal array-En av tall.,
For eksempel, for matrisen gitt ovenfor, sammenhengende subarray med den største summen er , med sum 6. Vi ville bruke denne tabellen vårt eksempel for resten av denne artikkelen. Også, vi vil anta denne tabellen til å være null-indeksert, dvs. -2 ville bli kalt ‘0th’ element i matrisen og så videre. Også, En ville representerer verdien på indeksen jeg.,
Nå, vi ville ha en titt på en svært opplagt løsning på et gitt problem.
«Brute Force» – Tilnærming
En svært opplagt, men ikke så god løsning er å beregne summen av alle mulige subarray og maksimum av dem ville være løsningen. Vi kan starte fra indeks 0, og beregne summen av alle mulige subarray starter med Et element, som vist i figuren nedenfor. Så, vi vil beregne summen av alle mulige subarray starter med A, A og så videre opp til Et, der n angir størrelse på utvalg (n = 9 i vårt tilfelle)., Vær oppmerksom på at hvert enkelt element er en subarray seg selv.
Vi vil kalle den maksimale summen av subarrays starter med element A local_maximum på indeks jeg. Dermed etter å ha gått gjennom alle indeksene, ville vi sitte igjen med local_maximum for alle indeksene. Til slutt, kan vi finne maksimum av disse local_maximums og vi ville få den endelige løsningen, dvs., den maksimale summen mulig. Vi kan kalle dette den global_maximum.
Men du vil kanskje legge merke til at dette ikke er en veldig god metode fordi størrelsen av tabellen øker, vil antall mulige subarrays øker raskt, og dermed øke computational kompleksitet. Eller for å være mer presis, hvis størrelsen på matrisen n, så tiden kompleksiteten med denne løsningen er O(n2) som ikke er veldig god.
Hvordan kan vi forbedre dette? Er det noen måte å bruke begrepet dynamisk programmering? La oss finne ut.,
Kadane Algoritme
I denne delen, ville vi bruke brute force tilnærming som er diskutert ovenfor igjen, men denne gangen ville vi starte bakover. Hvordan ville det hjelpe? La oss se.
Vi vil starte fra det siste elementet, og beregne summen av alle mulige subarray slutter med element A, som vist i figuren nedenfor. Så, vi vil beregne summen av alle mulige subarray slutter med En, En og så på opp til A.,
Nå la oss fokusere på den subarrays slutter med element A (=-1) og (=2) er vist i figuren nedenfor.,
Fra figuren ovenfor, vi ser at local_maximum er lik 3, som er summen av subarray . Nå har du en titt på subarrays slutter med A. Du vil legge merke til at disse subarrays kan deles inn i to deler, den subarrays slutter med En (markert med gult) og den eneste element subarray En (i grønt).
La oss si at det er noe jeg vet local_maximum., Da ser vi at for å beregne local_maximum, vi trenger ikke å beregne summen av alle subarrays slutter med En siden vi vet allerede resultatet fra matriser slutter med A. Merk at hvis array hadde den maksimale summen, så vi trenger bare å sjekke tilbudene markert med røde piler for å beregne local_maximum. Og dette fører oss til det prinsippet som Kadane er Algoritmen fungerer.
local_maximum på indeks jeg er maksimalt En, og summen av A og local_maximum på indeksen i-1.,
ved Hjelp av metoden over, må vi gå gjennom tabellen bare en gang, noe som er mye bedre enn våre tidligere «brute force» – tilnærming. Eller for å være mer presis, tid kompleksiteten av Kadane er Algoritmen er O(n).
til Slutt, la oss se hvordan dette ville fungere i koden.,
– Koden Gjennomgang
Nedenfor er en veldig mye selvforklarende gjennomføring (i C++) til en funksjon som tar en matrise som et argument, og returnerer summen av det maksimale subarray.
Merk at i stedet for å bruke en tabell for å lagre local_maximums, vi er rett og slett lagre den nyeste local_maximum i en int type variabel ‘local_max» fordi det er hva vi trenger for å beregne neste local_maximum., Også, som vi bruker en variabel ‘global_max» for å holde oversikt av den maksimale verdien av local_maximum, som til slutt kommer ut til å være ønsket utgang.
Konklusjon
på Grunn av måten denne algoritmen bruker optimalt underlag (maksimal subarray slutter på hver posisjon er beregnet på en enkel måte fra en relatert, men mindre og overlappende subproblem: maksimal subarray avslutningen på forrige posisjon) denne algoritmen kan ses på som et enkelt eksempel på dynamisk programmering., Kadane algoritme er i stand til å finne den maksimale summen av en sammenhengende subarray i en matrise med en kjøretid på O(n).