logo

Algoritmul lui Kadane

Algoritmul lui Kadane este o abordare de programare dinamică utilizată pentru a rezolva problema maximă subbary, care implică găsirea subbaryului contiguu cu suma maximă într-o matrice de numere. Algoritmul a fost propus de Jay Kadane în 1984 și are o complexitate în timp de O(n).

Istoria algoritmului lui Kadane:

Algoritmul lui Kadane poartă numele inventatorului său, Jay Kadane, profesor de informatică la Universitatea Carnegie Mellon. El a descris pentru prima dată algoritmul într-o lucrare intitulată „Problema sumei maxime” publicată în Journal of the Association for Computing Machinery (ACM) în 1984.

Problema găsirii subbarajului maxim a fost studiată de informaticieni încă din anii 1970. Este o problemă binecunoscută în domeniul proiectării și analizei algoritmilor și are aplicații într-o gamă largă de domenii, inclusiv procesarea semnalului, finanțe și bioinformatică.

Înainte de algoritmul lui Kadane, au fost propuși și alți algoritmi pentru rezolvarea problemei maxime subbary, cum ar fi abordarea brute-force care verifică toate subbary-urile posibile și algoritmul divide-and-cuquer. Cu toate acestea, acești algoritmi au complexități de timp mai mari și sunt mai puțin eficienți decât algoritmul lui Kadane.

Algoritmul lui Kadane este utilizat pe scară largă în informatică și a devenit un exemplu clasic de programare dinamică. Simplitatea, eficiența și eleganța sa au făcut din acesta o soluție populară la problema maximă sub-bary și un instrument valoros în proiectarea și analiza algoritmilor.

Funcționarea algoritmului lui Kadene:

Algoritmul funcționează prin iterarea matricei și ținând evidența sumei maxime a subbarajului care se termină la fiecare poziție. La fiecare poziție i, avem două opțiuni: fie adăugați elementul din poziția i la sub-taxa maximă curentă, fie porniți o nouă sub-tază la poziția i. Maximul dintre aceste două opțiuni este subbarra maximă care se termină la poziția i.

Menținem două variabile, max_so_far și max_ending_here, pentru a ține evidența sumei maxime văzute până acum și respectiv a sumei maxime care se termină la poziția curentă. Algoritmul începe prin setarea ambelor variabile la primul element al matricei. Apoi, iterăm peste matrice de la al doilea element până la sfârșit.

La fiecare poziție i, actualizăm max_ending_here luând maximul elementului curent și elementul curent adăugat la subbarajul maxim anterior. Apoi actualizăm max_so_far pentru a fi maximul de max_so_far și max_ending_here.

Algoritmul returnează max_so_far, care este suma maximă a oricărui subbary din matrice.

Iată procesul pas cu pas al algoritmului lui Kadane:

1. Inițializați două variabile, max_pâna_fara și max_se termina aici , la primul element al matricei.

max_to_far = arr[0]

max_ending_here = arr[0]

2. Iterați peste matrice de la al doilea element până la sfârșit:

pentru i de la 1 la n-1 fac:

3. Calculați suma maximă care se termină la poziția curentă:

max_ending_here = max(arr[i], max_ending_here + arr[i])

4. Actualizați max_so_far pentru a fi maximul de max_so_far și max_ending_here:

max_to_far = max(max_to_far, max_ending_here)

5. Întoarce max_to_far ca suma maximă a oricărui subbary din matrice.

Complexitatea temporală a algoritmului lui Kadane este O(n), unde n este lungimea matricei de intrare. Acest lucru îl face o soluție foarte eficientă la problema maximă subbarray.

Exemplu:

Să vedem un exemplu despre cum funcționează algoritmul lui Kadane:

Să presupunem că avem următoarea matrice de numere întregi:

 arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4] 

Vrem să găsim suma maximă sub-tabelă a acestui tablou. Putem aplica algoritmul lui Kadane pentru a rezolva această problemă.

Începem prin a inițializa două variabile:

    max_to_far:Această variabilă va ține evidența sumei maxime pe care am văzut-o până acum.max_ending_aici:Această variabilă va ține evidența sumei maxime care se termină la indexul curent.
 max_so_far = INT_MIN; max_ending_here = 0; 

Apoi, iterăm prin matrice, pornind de la al doilea element:

 for i in range(1, len(arr)): 

Actualizați suma curentă adăugând elementul curent la suma anterioară:

 max_ending_here = max(arr[i], max_ending_here + arr[i]) 

Actualizați suma maximă văzută până acum:

 max_so_far = max(max_so_far, max_ending_here) 

La fiecare iterație, actualizăm suma curentă fie adăugând elementul curent la suma anterioară, fie pornind un nou subbary la elementul curent. Apoi actualizăm suma maximă văzută până acum comparând-o cu suma actuală.

După iterarea întregii matrice, valoarea lui max_so_far va fi suma maximă a matricei date.

În acest exemplu, suma maximă a subgrupului este 6, ceea ce corespunde subgrupului [4, -1, 2, 1].

șir în char java

Implementarea codului în Java:

 import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print(&apos;Enter the size of the array : &apos;); int n=sc.nextInt(); int[] arr=new int[n]; System.out.println(&apos;Enter the elements of the array : &apos;); for(int i=0;i<n;i++){ arr[i]="sc.nextInt();" } int max_so_far="Integer.MIN_VALUE,max_ending_here=0;" for(int i="0;i&lt;n;i++)" { max_ending_here+="arr[i];" if(max_so_far<max_ending_here){ if(max_ending_here<0){ max_ending_here="0;" system.out.print('the maximum contiguous sum in the array is : '+max_so_far); < pre> <p> <strong>Output</strong> </p> <pre> Enter the size of the array : 9 Enter the elements of the array : -2 1 -3 4 -1 2 1 -5 4 The Maximum contiguous sum in the array is : 6 </pre> <h3>Code Implementation in C++:</h3> <pre> #include using namespace std; int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); // Kadane&apos;s algorithm int max_so_far = INT_MIN, max_ending_here = 0; for (int i = 0; i <n; i++) { max_ending_here="max_ending_here" + a[i]; if (max_so_far < max_ending_here) max_so_far="max_ending_here;" (max_ending_here 0) } cout << 'maximum contiguous sum in the array is : '<<max_so_far<<endl; return 0; pre> <p> <strong>Output</strong> </p> <pre> Maximum contiguous sum in the array is : 7 </pre> <h2>Advantages and Disadvantages of Kadane&apos;s algorithm:</h2> <h3>Advantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Efficiency:</td> Kadane&apos;s Algorithm has a time complexity of O(n), which makes it very efficient for solving the maximum subarray problem. This makes it a great solution for large datasets. </tr><tr><td>Simplicity:</td> Kadane&apos;s Algorithm is relatively easy to understand and implement compared to other algorithms for solving the maximum subarray problem, such as the divide-and-conquer algorithm. </tr><tr><td>Space Complexity:</td> Kadane&apos;s Algorithm has a space complexity of O(1), which means it uses a constant amount of memory irrespective of the size of the input array. </tr><tr><td>Dynamic Programming:</td> Kadane&apos;s Algorithm is a classic example of dynamic programming, a technique that breaks down a problem into smaller subproblems and stores the solutions to these subproblems to avoid redundant computation. </tr></ul> <h3>Disadvantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Only finds sum and not the subarray itself:</td> Kadane&apos;s Algorithm only finds the maximum sum of the subarray and not the actual subarray itself. If you need to find the subarray that has the maximum sum, you will need to modify the algorithm accordingly. </tr><tr><td>Does not handle negative numbers well:</td> If an input array has only negative numbers, the algorithm will return the maximum negative number instead of 0. This can be overcome by adding an additional step to the algorithm to check if the array has only negative numbers. </tr><tr><td>Not suitable for non-contiguous subarrays:</td> Kadane&apos;s Algorithm is specifically designed for contiguous subarrays and may not be suitable for solving problems that involve non-contiguous subarrays. </tr></ul> <h2>Applications of Kadane&apos;s algorithm:</h2> <p>There are some of its applications like the following:</p> <ul> <tr><td>Maximum subarray sum:</td> As we saw in the example above, Kadane&apos;s algorithm is used to find the maximum subarray sum of an array of integers. This is a common problem in computer science and has applications in data analysis, financial modeling, and other fields. </tr><tr><td>Stock trading:</td> Kadane&apos;s algorithm can be used to find the maximum profit that can be made by buying and selling a stock on a given day. The input to the algorithm is an array of stock prices, and the output is the maximum profit that can be made by buying and selling the stock at different times. </tr><tr><td>Image processing:</td> Kadane&apos;s algorithm can be used in image processing applications to find the largest contiguous area of pixels that meet a certain condition, such as having a certain color or brightness. This can be useful for tasks such as object recognition and segmentation. </tr><tr><td>DNA sequencing:</td> Kadane&apos;s algorithm can be used in bioinformatics to find the longest subsequence of DNA that meets certain conditions. For example, it can be used to find the longest common subsequence between two DNA sequences or to find the longest subsequence that does not contain certain patterns. </tr><tr><td>Machine learning:</td> Kadane&apos;s algorithm can be used in some machine learning applications, such as reinforcement learning and dynamic programming, to find the optimal policy or action sequence that maximizes a reward function. </tr></ul> <p>Therefore, we can say the advantages of Kadane&apos;s Algorithm make it a great solution for solving the maximum subarray problem, especially for large datasets. However, its limitations must be considered when using it for specific applications.</p> <hr></n;></pre></n;i++){>

Implementarea codului în C++:

 #include using namespace std; int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); // Kadane&apos;s algorithm int max_so_far = INT_MIN, max_ending_here = 0; for (int i = 0; i <n; i++) { max_ending_here="max_ending_here" + a[i]; if (max_so_far < max_ending_here) max_so_far="max_ending_here;" (max_ending_here 0) } cout << \'maximum contiguous sum in the array is : \'<<max_so_far<<endl; return 0; pre> <p> <strong>Output</strong> </p> <pre> Maximum contiguous sum in the array is : 7 </pre> <h2>Advantages and Disadvantages of Kadane&apos;s algorithm:</h2> <h3>Advantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Efficiency:</td> Kadane&apos;s Algorithm has a time complexity of O(n), which makes it very efficient for solving the maximum subarray problem. This makes it a great solution for large datasets. </tr><tr><td>Simplicity:</td> Kadane&apos;s Algorithm is relatively easy to understand and implement compared to other algorithms for solving the maximum subarray problem, such as the divide-and-conquer algorithm. </tr><tr><td>Space Complexity:</td> Kadane&apos;s Algorithm has a space complexity of O(1), which means it uses a constant amount of memory irrespective of the size of the input array. </tr><tr><td>Dynamic Programming:</td> Kadane&apos;s Algorithm is a classic example of dynamic programming, a technique that breaks down a problem into smaller subproblems and stores the solutions to these subproblems to avoid redundant computation. </tr></ul> <h3>Disadvantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Only finds sum and not the subarray itself:</td> Kadane&apos;s Algorithm only finds the maximum sum of the subarray and not the actual subarray itself. If you need to find the subarray that has the maximum sum, you will need to modify the algorithm accordingly. </tr><tr><td>Does not handle negative numbers well:</td> If an input array has only negative numbers, the algorithm will return the maximum negative number instead of 0. This can be overcome by adding an additional step to the algorithm to check if the array has only negative numbers. </tr><tr><td>Not suitable for non-contiguous subarrays:</td> Kadane&apos;s Algorithm is specifically designed for contiguous subarrays and may not be suitable for solving problems that involve non-contiguous subarrays. </tr></ul> <h2>Applications of Kadane&apos;s algorithm:</h2> <p>There are some of its applications like the following:</p> <ul> <tr><td>Maximum subarray sum:</td> As we saw in the example above, Kadane&apos;s algorithm is used to find the maximum subarray sum of an array of integers. This is a common problem in computer science and has applications in data analysis, financial modeling, and other fields. </tr><tr><td>Stock trading:</td> Kadane&apos;s algorithm can be used to find the maximum profit that can be made by buying and selling a stock on a given day. The input to the algorithm is an array of stock prices, and the output is the maximum profit that can be made by buying and selling the stock at different times. </tr><tr><td>Image processing:</td> Kadane&apos;s algorithm can be used in image processing applications to find the largest contiguous area of pixels that meet a certain condition, such as having a certain color or brightness. This can be useful for tasks such as object recognition and segmentation. </tr><tr><td>DNA sequencing:</td> Kadane&apos;s algorithm can be used in bioinformatics to find the longest subsequence of DNA that meets certain conditions. For example, it can be used to find the longest common subsequence between two DNA sequences or to find the longest subsequence that does not contain certain patterns. </tr><tr><td>Machine learning:</td> Kadane&apos;s algorithm can be used in some machine learning applications, such as reinforcement learning and dynamic programming, to find the optimal policy or action sequence that maximizes a reward function. </tr></ul> <p>Therefore, we can say the advantages of Kadane&apos;s Algorithm make it a great solution for solving the maximum subarray problem, especially for large datasets. However, its limitations must be considered when using it for specific applications.</p> <hr></n;>

Avantajele și dezavantajele algoritmului lui Kadane:

Avantajele algoritmului lui Kadane:

    Eficienţă:Algoritmul lui Kadane are o complexitate de timp de O(n), ceea ce îl face foarte eficient pentru rezolvarea problemei subbarajului maxim. Acest lucru îl face o soluție excelentă pentru seturi de date mari.Simplitate:Algoritmul lui Kadane este relativ ușor de înțeles și de implementat în comparație cu alți algoritmi pentru rezolvarea problemei maxime de subbary, cum ar fi algoritmul de împărțire și cucerire.Complexitatea spațiului:Algoritmul lui Kadane are o complexitate spațială de O(1), ceea ce înseamnă că folosește o cantitate constantă de memorie, indiferent de dimensiunea matricei de intrare.Programare dinamică:Algoritmul lui Kadane este un exemplu clasic de programare dinamică, o tehnică care descompune o problemă în subprobleme mai mici și stochează soluțiile la aceste subprobleme pentru a evita calculul redundant.

Dezavantajele algoritmului lui Kadane:

    Găsește doar suma și nu subgrupul în sine:Algoritmul lui Kadane găsește doar suma maximă a subgrupului și nu subbarray propriu-zis. Dacă trebuie să găsiți subbarra care are suma maximă, va trebui să modificați algoritmul în consecință.Nu tratează bine numerele negative:Dacă o matrice de intrare are doar numere negative, algoritmul va returna numărul maxim negativ în loc de 0. Acest lucru poate fi depășit prin adăugarea unui pas suplimentar la algoritm pentru a verifica dacă matricea are doar numere negative.Nu este potrivit pentru subbariere necontigue:Algoritmul lui Kadane este conceput special pentru subbaryuri contigue și poate să nu fie potrivit pentru rezolvarea problemelor care implică subbaryuri necontigue.

Aplicații ale algoritmului lui Kadane:

Există câteva dintre aplicațiile sale, cum ar fi următoarele:

    Suma maximă secundară:Așa cum am văzut în exemplul de mai sus, algoritmul lui Kadane este folosit pentru a găsi suma maximă sub-taxa a unei matrice de numere întregi. Aceasta este o problemă comună în informatică și are aplicații în analiza datelor, modelarea financiară și în alte domenii.Tranzacționare pe acțiuni:Algoritmul lui Kadane poate fi folosit pentru a găsi profitul maxim care poate fi obținut prin cumpărarea și vânzarea unui stoc într-o anumită zi. Intrarea în algoritm este o serie de prețuri acțiunilor, iar rezultatul este profitul maxim care poate fi obținut prin cumpărarea și vânzarea acțiunilor în momente diferite.Procesarea imaginii:Algoritmul lui Kadane poate fi folosit în aplicațiile de procesare a imaginilor pentru a găsi cea mai mare zonă adiacentă de pixeli care îndeplinesc o anumită condiție, cum ar fi să aibă o anumită culoare sau luminozitate. Acest lucru poate fi util pentru sarcini precum recunoașterea și segmentarea obiectelor.Secvențierea ADN:Algoritmul lui Kadane poate fi folosit în bioinformatică pentru a găsi cea mai lungă secvență de ADN care îndeplinește anumite condiții. De exemplu, poate fi folosit pentru a găsi cea mai lungă subsecvență comună între două secvențe ADN sau pentru a găsi cea mai lungă subsecvență care nu conține anumite modele.Învățare automată:Algoritmul lui Kadane poate fi utilizat în unele aplicații de învățare automată, cum ar fi învățarea prin consolidare și programarea dinamică, pentru a găsi politica optimă sau secvența de acțiuni care maximizează o funcție de recompensă.

Prin urmare, putem spune că avantajele algoritmului lui Kadane îl fac o soluție excelentă pentru rezolvarea problemei maxime subbary, în special pentru seturile de date mari. Cu toate acestea, limitările sale trebuie luate în considerare atunci când îl utilizați pentru aplicații specifice.