logo

Najvyšší súčet súvislého podpolia (Kadaneov algoritmus)

Dané pole arr[] veľkosti N . Úlohou je nájsť súčet súvislého podpolia v rámci a arr[] s najväčšou sumou.

Príklad:



Vstup: arr = {-2,-3,4,-1,-2,1,5,-3}
Výkon: 7
Vysvetlenie: Podpole {4,-1, -2, 1, 5} má najväčší súčet 7.

Vstup: arr = {2}
Výkon: 2
Vysvetlenie: Podpole {2} má najväčší súčet 1.

Vstup: arr = {5,4,1,7,8}
Výkon: 25
Vysvetlenie: Podpole {5,4,1,7,8} má najväčší súčet 25.



kadane-algoritmus

Odporúčané riešenie problému Problém

Myšlienka na Kadaneov algoritmus je udržiavať premennú max_ending_tu ktorý ukladá maximálny súčet súvislého podpola končiaceho na aktuálnom indexe a premennej max_so_far ukladá maximálny súčet doteraz nájdených súvislých podpolí, vždy, keď je v ňom hodnota kladného súčtu max_ending_tu porovnaj to s max_so_far a aktualizovať max_so_far ak je väčšia ako max_so_far .

Takže hlavné Intuícia pozadu Kadaneov algoritmus je,



  • Podpole so záporným súčtom sa zahodí ( priradením max_ending_here = 0 v kóde ).
  • Nosíme podpole, kým nedáva kladný súčet.

Pseudokód Kadaneovho algoritmu:

Inicializovať:
max_so_far = INT_MIN
max_ending_here = 0

Slučka pre každý prvok poľa

(a) max_ending_here = max_ending_here + a[i]
(b) if(max_so_far
max_so_far = max_ending_here
(c) if(max_ending_here <0)
max_ending_here = 0
return max_so_far

Ilustrácia Kadaneovho algoritmu:

Vezmime si príklad: {-2, -3, 4, -1, -2, 1, 5, -3}

Poznámka : na obrázku je max_so_far reprezentovaný Max_Sum a max_ending_tu by Curr_Sum


Pre i=0, a[0] = -2

jquery toto kliknutie
  • max_ending_here = max_ending_here + (-2)
  • Nastavte max_ending_here = 0, pretože max_ending_here <0
  • a nastavte max_so_far = -2

Pre i=1, a[1] = -3

  • max_ending_here = max_ending_here + (-3)
  • Keďže max_ending_here = -3 a max_so_far = -2, max_so_far zostane -2
  • Nastavte max_ending_here = 0, pretože max_ending_here <0

Pre i=2 platí a[2] = 4

  • max_ending_here = max_ending_here + (4)
  • max_ending_here = 4
  • max_so_far sa aktualizuje na 4, pretože max_ending_here je väčšie ako max_so_far, ktoré bolo doteraz -2

Pre i=3, a[3] = -1

  • max_ending_here = max_ending_here + (-1)
  • max_ending_here = 3

Pre i=4, a[4] = -2

  • max_ending_here = max_ending_here + (-2)
  • max_ending_here = 1

Pre i=5 platí a[5] = 1

  • max_ending_here = max_ending_here + (1)
  • max_ending_here = 2

Pre i=6 platí a[6] = 5

  • max_ending_here = max_ending_here + (5)
  • max_ending_here =
  • max_so_far sa aktualizuje na 7, pretože max_ending_here je väčšie ako max_so_far

Pre i=7, a[7] = -3

  • max_ending_here = max_ending_here + (-3)
  • max_ending_here = 4

Pri implementácii nápadu postupujte podľa nasledujúcich krokov:

  • Inicializujte premenné max_so_far = INT_MIN a max_ending_tu = 0
  • Spustite cyklus for z 0 do N-1 a pre každý index i :
    • Pridajte arr[i] do max_ending_tu.
    • Ak je max_so_far menšie ako max_ending_here, aktualizujte max_so_far to max_ending_here .
    • Ak je max_ending_here <0, aktualizujte max_ending_here = 0
  • Návrat max_so_far

Nižšie je uvedená implementácia vyššie uvedeného prístupu.

C++
// C++ program to print largest contiguous array sum #include  using namespace std; int maxSubArraySum(int a[], int size) {  int max_so_far = INT_MIN, max_ending_here = 0;  for (int i = 0; i < size; i++) {  max_ending_here = max_ending_here + a[i];  if (max_so_far < max_ending_here)  max_so_far = max_ending_here;  if (max_ending_here < 0)  max_ending_here = 0;  }  return max_so_far; } // Driver Code int main() {  int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };  int n = sizeof(a) / sizeof(a[0]);  // Function Call  int max_sum = maxSubArraySum(a, n);  cout << 'Maximum contiguous sum is ' << max_sum;  return 0; }>
Java
// Java program to print largest contiguous array sum import java.io.*; import java.util.*; class Kadane {  // Driver Code  public static void main(String[] args)  {  int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 };  System.out.println('Maximum contiguous sum is '  + maxSubArraySum(a));  }  // Function Call  static int maxSubArraySum(int a[])  {  int size = a.length;  int max_so_far = Integer.MIN_VALUE, max_ending_here  = 0;  for (int i = 0; i < size; i++) {  max_ending_here = max_ending_here + a[i];  if (max_so_far < max_ending_here)  max_so_far = max_ending_here;  if (max_ending_here < 0)  max_ending_here = 0;  }  return max_so_far;  } }>
Python
def GFG(a, size): max_so_far = float('-inf') # Use float('-inf') instead of maxint max_ending_here = 0 for i in range(0, size): max_ending_here = max_ending_here + a[i] if max_so_far < max_ending_here: max_so_far = max_ending_here if max_ending_here < 0: max_ending_here = 0 return max_so_far # Driver function to check the above function a = [-2, -3, 4, -1, -2, 1, 5, -3] print('Maximum contiguous sum is', GFG(a, len(a)))>
C#
// C# program to print largest // contiguous array sum using System; class GFG {  static int maxSubArraySum(int[] a)  {  int size = a.Length;  int max_so_far = int.MinValue, max_ending_here = 0;  for (int i = 0; i < size; i++) {  max_ending_here = max_ending_here + a[i];  if (max_so_far < max_ending_here)  max_so_far = max_ending_here;  if (max_ending_here < 0)  max_ending_here = 0;  }  return max_so_far;  }  // Driver code  public static void Main()  {  int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 };  Console.Write('Maximum contiguous sum is '  + maxSubArraySum(a));  } } // This code is contributed by Sam007_>
Javascript
>
PHP
 // PHP program to print largest // contiguous array sum function maxSubArraySum($a, $size) { $max_so_far = PHP_INT_MIN; $max_ending_here = 0; for ($i = 0; $i < $size; $i++) { $max_ending_here = $max_ending_here + $a[$i]; if ($max_so_far < $max_ending_here) $max_so_far = $max_ending_here; if ($max_ending_here < 0) $max_ending_here = 0; } return $max_so_far; } // Driver code $a = array(-2, -3, 4, -1, -2, 1, 5, -3); $n = count($a); $max_sum = maxSubArraySum($a, $n); echo 'Maximum contiguous sum is ' , $max_sum; // This code is contributed by anuj_67. ?>>

Výkon
Maximum contiguous sum is 7>

Časová zložitosť: O(N)
Pomocný priestor: O(1)

Vytlačte súvislú podpolu s najväčším súčtom:

Vytlačiť podpole s maximálnou sumou, ktorú je potrebné zachovať začať index maximálny_sum_ending_tu pri aktuálnom indexe, takže kedykoľvek maximálny_sum_sum_far je aktualizovaný pomocou maximálny_sum_ending_tu potom je možné aktualizovať počiatočný index a koncový index podpolia začať a aktuálny index .

Pri implementácii myšlienky postupujte podľa nasledujúcich krokov:

  • Inicializujte premenné s , začať, a koniec s 0 a max_so_far = INT_MIN a max_ending_tu = 0
  • Spustite cyklus for z 0 do N-1 a pre každý index i :
    • Pridajte arr[i] do max_ending_tu.
    • Ak je max_so_far menšie ako max_ending_here, aktualizujte max_so_far to max_ending_here a aktualizujte začať do s a koniec do i .
    • Ak je max_ending_here <0, aktualizujte max_ending_here = 0 a s s i+1 .
  • Vytlačte hodnoty z indexu začať do koniec .

Nižšie je uvedená implementácia vyššie uvedeného prístupu:

C++
// C++ program to print largest contiguous array sum #include  #include  using namespace std; void maxSubArraySum(int a[], int size) {  int max_so_far = INT_MIN, max_ending_here = 0,  start = 0, end = 0, s = 0;  for (int i = 0; i < size; i++) {  max_ending_here += a[i];  if (max_so_far < max_ending_here) {  max_so_far = max_ending_here;  start = s;  end = i;  }  if (max_ending_here < 0) {  max_ending_here = 0;  s = i + 1;  }  }  cout << 'Maximum contiguous sum is ' << max_so_far  << endl;  cout << 'Starting index ' << start << endl  << 'Ending index ' << end << endl; } /*Driver program to test maxSubArraySum*/ int main() {  int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };  int n = sizeof(a) / sizeof(a[0]);  maxSubArraySum(a, n);  return 0; }>
Java
// Java program to print largest // contiguous array sum import java.io.*; import java.util.*; class GFG {  static void maxSubArraySum(int a[], int size)  {  int max_so_far = Integer.MIN_VALUE,  max_ending_here = 0, start = 0, end = 0, s = 0;  for (int i = 0; i < size; i++) {  max_ending_here += a[i];  if (max_so_far < max_ending_here) {  max_so_far = max_ending_here;  start = s;  end = i;  }  if (max_ending_here < 0) {  max_ending_here = 0;  s = i + 1;  }  }  System.out.println('Maximum contiguous sum is '  + max_so_far);  System.out.println('Starting index ' + start);  System.out.println('Ending index ' + end);  }  // Driver code  public static void main(String[] args)  {  int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };  int n = a.length;  maxSubArraySum(a, n);  } } // This code is contributed by prerna saini>
Python
# Python program to print largest contiguous array sum from sys import maxsize # Function to find the maximum contiguous subarray # and print its starting and end index def maxSubArraySum(a, size): max_so_far = -maxsize - 1 max_ending_here = 0 start = 0 end = 0 s = 0 for i in range(0, size): max_ending_here += a[i] if max_so_far < max_ending_here: max_so_far = max_ending_here start = s end = i if max_ending_here < 0: max_ending_here = 0 s = i+1 print('Maximum contiguous sum is %d' % (max_so_far)) print('Starting Index %d' % (start)) print('Ending Index %d' % (end)) # Driver program to test maxSubArraySum a = [-2, -3, 4, -1, -2, 1, 5, -3] maxSubArraySum(a, len(a))>
C#
// C# program to print largest // contiguous array sum using System; class GFG {  static void maxSubArraySum(int[] a, int size)  {  int max_so_far = int.MinValue, max_ending_here = 0,  start = 0, end = 0, s = 0;  for (int i = 0; i < size; i++) {  max_ending_here += a[i];  if (max_so_far < max_ending_here) {  max_so_far = max_ending_here;  start = s;  end = i;  }  if (max_ending_here < 0) {  max_ending_here = 0;  s = i + 1;  }  }  Console.WriteLine('Maximum contiguous '  + 'sum is ' + max_so_far);  Console.WriteLine('Starting index ' + start);  Console.WriteLine('Ending index ' + end);  }  // Driver code  public static void Main()  {  int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 };  int n = a.Length;  maxSubArraySum(a, n);  } } // This code is contributed // by anuj_67.>
Javascript
>
PHP
 // PHP program to print largest  // contiguous array sum function maxSubArraySum($a, $size) { $max_so_far = PHP_INT_MIN; $max_ending_here = 0; $start = 0; $end = 0; $s = 0; for ($i = 0; $i < $size; $i++) { $max_ending_here += $a[$i]; if ($max_so_far < $max_ending_here) { $max_so_far = $max_ending_here; $start = $s; $end = $i; } if ($max_ending_here < 0) { $max_ending_here = 0; $s = $i + 1; } } echo 'Maximum contiguous sum is '. $max_so_far.'
'; echo 'Starting index '. $start . '
'. 'Ending index ' . $end . '
'; } // Driver Code $a = array(-2, -3, 4, -1, -2, 1, 5, -3); $n = sizeof($a); maxSubArraySum($a, $n); // This code is contributed // by ChitraNayal ?>>

Výkon
Maximum contiguous sum is 7 Starting index 2 Ending index 6>

Časová zložitosť: O(n)
Pomocný priestor: O(1)

Použitie súvislého podpolia s najväčšou sumou Dynamické programovanie :

Pre každý index i, DP[i] ukladá maximálny možný najväčší súčet Contiguous Subarray končiaci na indexe i, a preto môžeme vypočítať DP[i] pomocou spomínaného prechodu stavu:

  • DP[i] = max(DP[i-1] + arr[i] , arr[i] )

Nižšie je uvedená implementácia:

C++
// C++ program to print largest contiguous array sum #include  using namespace std; void maxSubArraySum(int a[], int size) {  vector dp(veľkosť, 0);  dp[0] = a[0];  int ans = dp[0];  pre (int i = 1; i< size; i++) {  dp[i] = max(a[i], a[i] + dp[i - 1]);  ans = max(ans, dp[i]);  }  cout << ans; } /*Driver program to test maxSubArraySum*/ int main() {  int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };  int n = sizeof(a) / sizeof(a[0]);  maxSubArraySum(a, n);  return 0; }>
Java
import java.util.Arrays; public class Main {  // Function to find the largest contiguous array sum  public static void maxSubArraySum(int[] a) {  int size = a.length;  int[] dp = new int[size]; // Create an array to store intermediate results  dp[0] = a[0]; // Initialize the first element of the intermediate array with the first element of the input array  int ans = dp[0]; // Initialize the answer with the first element of the intermediate array  for (int i = 1; i < size; i++) {  // Calculate the maximum of the current element and the sum of the current element and the previous result  dp[i] = Math.max(a[i], a[i] + dp[i - 1]);  // Update the answer with the maximum value encountered so far  ans = Math.max(ans, dp[i]);  }  // Print the maximum contiguous array sum  System.out.println(ans);  }  public static void main(String[] args) {  int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 };  maxSubArraySum(a); // Call the function to find and print the maximum contiguous array sum  } } // This code is contributed by shivamgupta310570>
Python
# Python program for the above approach def max_sub_array_sum(a, size): # Create a list to store intermediate results dp = [0] * size # Initialize the first element of the list with the first element of the array dp[0] = a[0] # Initialize the answer with the first element of the array ans = dp[0] # Loop through the array starting from the second element for i in range(1, size): # Choose the maximum value between the current element and the sum of the current element # and the previous maximum sum (stored in dp[i - 1]) dp[i] = max(a[i], a[i] + dp[i - 1]) # Update the overall maximum sum ans = max(ans, dp[i]) # Print the maximum contiguous subarray sum print(ans) # Driver program to test max_sub_array_sum if __name__ == '__main__': # Sample array a = [-2, -3, 4, -1, -2, 1, 5, -3] # Get the length of the array n = len(a) # Call the function to find the maximum contiguous subarray sum max_sub_array_sum(a, n) # This code is contributed by Susobhan Akhuli>
C#
using System; class MaxSubArraySum {  // Function to find and print the maximum sum of a  // subarray  static void FindMaxSubArraySum(int[] arr, int size)  {  // Create an array to store the maximum sum of  // subarrays  int[] dp = new int[size];  // Initialize the first element of dp with the first  // element of arr  dp[0] = arr[0];  // Initialize a variable to store the final result  int ans = dp[0];  // Iterate through the array to find the maximum sum  for (int i = 1; i < size; i++) {  // Calculate the maximum sum ending at the  // current position  dp[i] = Math.Max(arr[i], arr[i] + dp[i - 1]);  // Update the final result with the maximum sum  // found so far  ans = Math.Max(ans, dp[i]);  }  // Print the maximum sum of the subarray  Console.WriteLine(ans);  }  // Driver program to test FindMaxSubArraySum  static void Main()  {  // Example array  int[] arr = { -2, -3, 4, -1, -2, 1, 5, -3 };  // Calculate and print the maximum subarray sum  FindMaxSubArraySum(arr, arr.Length);  } }>
Javascript
// Javascript program to print largest contiguous array sum // Function to find the largest contiguous array sum function maxSubArraySum(a) {  let size = a.length;  // Create an array to store intermediate results  let dp = new Array(size);  // Initialize the first element of the intermediate array with the first element of the input array  dp[0] = a[0];  // Initialize the answer with the first element of the intermediate array  let ans = dp[0];    for (let i = 1; i < size; i++) {  // Calculate the maximum of the current element and the sum of the current element and the previous result  dp[i] = Math.max(a[i], a[i] + dp[i - 1]);  // Update the answer with the maximum value encountered so far  ans = Math.max(ans, dp[i]);  }  // Print the maximum contiguous array sum  console.log(ans); } let a = [-2, -3, 4, -1, -2, 1, 5, -3]; // Call the function to find and print the maximum contiguous array sum maxSubArraySum(a);>

Výkon
7>


Cvičný problém:

ako získať aktuálny dátum v jave

Vzhľadom na pole celých čísel (možno niektoré prvky sú záporné) napíšte program v jazyku C, aby ste zistili *maximálny možný súčin* vynásobením „n“ po sebe idúcich celých čísel v poli, kde n ? ARRAY_SIZE. Vytlačte aj začiatočný bod maximálneho podpola produktov.