Dacă sunteți aici, atunci sunt șanse pe care le au încercat să rezolve „Maxim Subarray Problemă” și a venit peste Kadane Algoritmul lui, dar nu a putut da seama cum așa ceva este de lucru. Sau poate te-ai săturat să folosești Algoritmul lui Kadane ca „cutie neagră”. Sau poate ați vrut să înțelegeți aspectul programării dinamice a acestuia. Sau poate vrei doar să înveți despre un nou concept care te poate face mai bun la programare. Oricare ar fi motivul, ai venit la locul potrivit.,pentru a înțelege mai bine algoritmul lui Kadane, în primul rând, am trece printr-o scurtă introducere a programării dinamice. Apoi, ne-am uita la o problemă de programare destul de populară, problema maximă Subarray. Vom vedea cum această problemă poate fi rezolvată folosind o abordare a forței brute și apoi vom încerca să ne îmbunătățim abordarea și să venim cu un algoritm mai bun, aka, Algoritmul lui Kadane.deci, să intrăm în ea.,

Programare Dinamică

Programarea Dinamică este o metodă pentru rezolvarea unei probleme complexe, de rupere-l în jos într-o colecție de simplu subproblemelor, rezolvarea fiecare dintre aceste subproblemelor doar o dată, și stocarea soluțiilor acestora, utilizând o memorie pe bază de structură de date (matrice, harta, etc.). Deci, data viitoare când apare aceeași sub-problemă, în loc să recompună soluția sa, pur și simplu se uită la soluția calculată anterior, economisind astfel timpul de calcul.

cei care nu-și pot aminti trecutul sunt condamnați să-l repete., – Programare dinamică

Iată o explicație strălucitoare asupra conceptului de programare dinamică pe Quora — răspunsul lui Jonathan Paulson la cum ar trebui să explic programarea dinamică unui copil de 4 ani?deși există mai mult de programare dinamică, ne-ar merge mai departe pentru a înțelege problema maximă Subarray.

Maxim Subarray Problemă

maxim subarray problema este sarcina de a găsi cât mai mare suma de un învecinate subarray, într-un anumit one-dimensional matrice a de numere.,

Suma Maximă Subarray (În Galben)

De exemplu, pentru matrice de mai sus, contiguă subarray cu cea mai mare sumă este , cu suma de 6. Am folosi această matrice ca exemplu pentru restul acestui articol. De asemenea, am presupune că această matrice este indexată zero, adică -2 ar fi numit elementul ” 0th ” al matricei și așa mai departe. De asemenea, A ar reprezenta valoarea la indexul I.,

acum, ne-ar avea o privire la o soluție foarte evidentă la problema dată.o soluție foarte evidentă, dar nu atât de bună este de a calcula suma tuturor subarray-urilor posibile, iar maximul acestora ar fi soluția. Putem începe de la indicele 0 și se calculează suma fiecărui subarray posibil începând cu elementul A, așa cum se arată în figura de mai jos. Apoi, am calcula suma fiecărui subarray posibil începând cu A, A și așa mai departe până la A, unde n denotă dimensiunea matricei (n = 9 în cazul nostru)., Rețineți că fiecare element este un subarray în sine.

prin Forță Brută: Iterație 0 (stânga) și Iterația 1 (dreapta)

Vom numi suma maxima de subarrays începând cu element de O local_maximum la indicele i. Astfel, după ce trece prin toate indici, ne-ar fi lăsat cu local_maximum pentru toți indicii. În cele din urmă, putem găsi maximul acestor local_maximums și vom obține soluția finală, adică., suma maximă posibilă. Ne-ar numi acest global_maximum.dar s-ar putea să observați că aceasta nu este o metodă foarte bună, deoarece pe măsură ce mărimea matricei crește, numărul de subarrays posibile crește rapid, crescând astfel complexitatea computațională. Sau pentru a fi mai precis, dacă dimensiunea matricei este n, atunci complexitatea timpului acestei soluții este O(n2), ceea ce nu este foarte bun.

cum putem îmbunătăți acest lucru? Există vreo modalitate de a utiliza conceptul de programare dinamică? Să aflăm.,

Algoritmul lui Kadane

În această secțiune, vom folosi din nou abordarea forței brute discutată mai sus, dar de data aceasta vom începe înapoi. Cum ar ajuta asta? Să vedem.

am începe de la ultimul element și am calcula suma fiecărui subarray posibil care se termină cu elementul A, așa cum se arată în figura de mai jos. Apoi, am calcula suma fiecărui subarray posibil care se termină cu A, A și așa mai departe până la A.,

Înapoi prin Forță Brută: Iterație 0 (stânga) și Iterația 1 (dreapta)

Acum, haideți să se concentreze pe subarrays se termină cu Un element (=-1) și O (=2) prezentat în figura de mai jos.,

Din figura de mai sus, vom vedea că local_maximum este egal cu 3. care este suma subarray . Acum, au o privire la subarrays se încheie cu A. Veți observa că aceste subarrays poate fi împărțit în două părți, subarrays se încheie cu O (evidențiate cu galben) și singur element subarray O (în verde).

să spunem cumva că știu local_maximum., Atunci vom vedea că pentru a calcula local_maximum, nu avem nevoie pentru a calcula suma tuturor subarrays se încheie cu O din moment ce știm deja rezultatul din matrice care se încheie cu A. Rețineți că, dacă matrice a avut suma maxima, atunci avem nevoie doar pentru a verifica tablouri evidențiate cu roșu săgețile pentru a calcula local_maximum. Și acest lucru ne conduce la principiul pe care funcționează algoritmul lui Kadane.

local_maximum la indicele i este maximă și suma dintre a și local_maximum la indicele n-1.,

Folosind metoda de mai sus, avem nevoie pentru a itera prin matrice doar o dată, ceea ce este mult mai bine decât anterior prin forță brută. Sau pentru a fi mai precis, complexitatea timpului algoritmului lui Kadane este O(n).în cele din urmă, să vedem cum ar funcționa toate acestea în cod.,

Cod Walkthrough

mai jos este o implementare foarte mult auto-explicative (în C++) a unei funcții care ia o matrice ca argument și returnează suma subarray maximă.

Rețineți că în loc de a folosi o matrice pentru a stoca local_maximums, suntem pur și simplu stocarea cele mai recente local_maximum într-o variabilă de tip int ‘local_max’ pentru că asta e ceea ce avem nevoie pentru a calcula următorul local_maximum., De asemenea, ca suntem folosind o variabilă ‘global_max’ pentru a urmări valoarea maximă a local_maximum, care în final se dovedește a fi de ieșire necesare.

Concluzie

Pentru că de modul în care acest algoritm foloseste optimă substructuri (maxim subarray se încheie la fiecare poziție se calculează într-un mod simplu de un legat, dar mai mici și se suprapun subproblema: maxim subarray se încheie la poziția anterioară) acest algoritm poate fi privit ca un simplu exemplu de programare dinamică., Algoritmul lui Kadane este capabil să găsească suma maximă a unei subarray contigue într-o matrice cu un timp de rulare de O(n).

Articles

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *