Kadence-Algorithmus: Größtes zusammenhängendes Subarray mit Summe

Was ist die größte Summe zusammenhängender Subarrays?

Ein Subarray ist ein kontinuierlicher Teil eines Arrays. Es kann ein einzelnes Element eines Arrays oder ein Teil des Arrays sein. Das zusammenhängende Subarray mit der größten Summe bedeutet ein Subarray mit dem maximalen Summenwert.

Ein Array ist beispielsweise {-10, 5, 1, 6, -9, 2, -7, 3, -5}. Seine Unterarrays können sein: {-10,5,1,6} oder {5,1,6} oder {2,7,3, -5} usw. Aber {5,1,6,3} kann kein a sein Subarray, weil sie die Sequenzen nicht beibehalten.

Größte Summe zusammenhängender Subarray

Wenn Sie bemerken, dass unter allen Teilarrays das folgende hervorgehobene Teilarray (5,1,6) den maximalen Summenwert hat:

Größte Summe zusammenhängender Subarray

Die Summe des Subarrays {5,1,6} = 11 ist die maximale Summe in allen möglichen Kombinationen von Subarrays des obigen Arrays. Für das obige Array beträgt das maximale Unterarray also {5,1,6}.

Kadence-Algorithmus: Größtes zusammenhängendes Subarray mit Summe

Einfacher Ansatz zur Lösung des zusammenhängenden Subarrays mit der größten Summe

Der einfache Weg, dieses Problem zu lösen, besteht darin, zwei Schleifen zu verwenden, um alle Unterarrays zu finden, die Summe zu berechnen und dann ihren Maximalwert zu ermitteln.

Hier ist das Flussdiagramm für den einfachen Ansatz zum Finden des größten zusammenhängenden Teilarrays. Dies ist ein Brute-Force-Ansatz, da wir alle möglichen Unterarrays durchgehen.

Einfacher Ansatz zur Lösung der größten Summe

Hier sind die einfachen Schritte, um dies zu tun.

Schritt 1) Initialisieren Sie max_sum mit dem minimalen ganzzahligen Wert und weisen Sie den Variablen „begin“ und „end“ den Wert Null zu.

Schritt 2) Seien i und j der Index des Arrays, wobei „j“ größer als gleich „i“ ist. Es stellt den Anfangsindex des Subarrays dar und „j“ stellt den Endindex des Subarrays dar.

Schritt 3) „Current_sum“ enthält die Summe des Subarrays. Überprüfen Sie nach der Berechnung der aktuellen Summe, ob current_sum größer als max_sum ist.

Schritt 4) Wenn current_sum größer ist, ersetzen Sie max_sum durch die aktuelle Summe.

Schritt 5) Überprüfen Sie, ob „j“ das Ende des Arrays erreicht oder nicht. Wenn „j“ das Ende des Arrays erreicht, erhöhen Sie „i“ und ändern Sie den Wert „current_sum“ auf 0.

Schritt 6) Führen Sie alle diese Schritte aus, bis „i“ das Ende des Arrays erreicht.

Schritt 7) Am Ende dieser beiden Schleifen enthält max_sum die größte Subarray-Summe.

Pseudocode für einfachen Ansatz

  function maximumSubarraySum():
    input: array
  for all possible subArray from array:
    calculate sum of each sub array
    store the maximum subArray
  return the maximum sum

C++ Implementierung des einfachen Ansatzes

#include <stdio.h>
#include <iostream>
using namespace std;
void maximumSubarraySum(int array[], int n) {
  int max_sum = -1e9;
  int begin = 0;
  int end = 0;
  for (int i = 0; i < n; i++) {
    int current_sum = 0;
    for (int j = i; j < n; j++) {
      current_sum += array[j];
      if (max_sum < current_sum) {
        max_sum = current_sum;
        begin = i;
        end = j;
      }
    }
  }
  cout << "largest sum is " << max_sum << endl;
  cout << "largest sum contiguous subarray: ";
  for (int i = begin; i <= end; i++) {
    cout << array[i] << "\t";
  }
}
int main() {
  int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
  maximumSubarraySum(array, sizeof(array) / sizeof(array[0]));
}

Ausgang:

largest sum is 12
largest sum contiguous subarray: 5      1       6

Python Implementierung eines einfachen Ansatzes

def maximumSubarraySum(numbers):
max_sum,begin,end = -1e9, 0 , 0
  for i in range(len(numbers)):
    current_sum=0
  for j in range(i,len(numbers)):
    current_sum+=numbers[j]
  if max_sum<current_sum:
    max_sum=current_sum
  begin,end=i,j
    print("largest sum is ",max_sum)
    print("largest sum contiguous subarray: ",end="")
  for i in range(begin,end+1):
    print(numbers[i],end='\t')
    numbers = [-10,5,1,6,-9,2,-7,3,-5]
    maximumSubarraySum(numbers)

Ausgang:

largest sum is 12
largest sum contiguous subarray: 5      1       6

Kadanes Algorithmus zum Finden des größten zusammenhängenden Subarrays

Kadanes Algorithmus ist eine Art Methode der „dynamischen Programmierung“. Hier verwenden wir eine Schleife anstelle von zwei Schleifen. Die allgemeine Implementierung des Kadane-Algorithmus funktioniert nur für Arrays positiver Zahlen.

Wir benötigen nur zwei Variablen, um das zusammenhängende Subarray mit der größten Summe zu finden. Hier ist das Flussdiagramm für Kadanes Algorithmus:

Kadanes Algorithmus zur Ermittlung der größten Summe

Hier sind die Schritte für Kadanes Algorithmus:

Schritt 1) Erstellen Sie zwei Variablen, current_sum und max_sum.

„Current_sum“ behält den Wert der maximalen Summe, die in einem bestimmten Array-Index endet, während „max_sum“ den bisherigen maximalen Summenwert speichert.

Schritt 2) Wir addieren den Wert mit der aktuellen_Summe für jedes Array-Element. Dann prüfen wir unten zwei Bedingungen:

  • Wenn current_sum kleiner als das aktuelle Element ist, ist der current_sum-Wert das aktuelle Element.
  • Wenn max_sum kleiner als current_sum ist, ist max_sum gleich current_sum.

Schritt 3) Wenn wir den vorherigen Schritt für das gesamte Array ausführen, erhalten wir die größte Summe zusammenhängender Unterarrays in der Variablen „max_sum“.

Beispiel für Kadanes Algorithmus

Wir demonstrieren den Kadanes-Algorithmus mit einem kleinen Array und diskutieren jeden Schritt zum Finden des größten zusammenhängenden Subarrays.

Nehmen wir an, das angegebene Array sieht wie folgt aus:

Beispiel für Kadanes Algorithmus

Hier sind die Schritte von Kadanes Algorithmus:

Schritt 1) Erstellen Sie zwei Variablen, current_sum und max_sum. Weisen Sie INT_MIN der max_sum und Null der current_sum zu. (Hier bedeutet INT_MIN die minimale Ganzzahl).

Schritt 2) Bei Index 0 ist der Wert 4. Also ist die aktuelle_Summe = 0 + 4 oder 4. Hier ist die aktuelle_Summe größer als die maximale_Summe, die maximale_Summe beträgt 4.

Beispiel für Kadanes Algorithmus

Schritt 3) Bei Index 1 beträgt der Wert -2. Also ist die aktuelle_Summe = 4 + (-2) oder 2.

Diesmal ist die aktuelle Summe kleiner als die maximale Summe. Infolgedessen wird der Wert von max_sum nicht aktualisiert.

Beispiel für Kadanes Algorithmus

Schritt 4) Der nächste Wert ist 1. Wenn wir dies mit der aktuellen_Summe addieren, beträgt die aktuelle_Summe 3. Dennoch ist die maximale_Summe größer als die aktuelle_Summe. Daher wird die max_sum nicht aktualisiert.

Beispiel für Kadanes Algorithmus

Schritt 5) Bei Index 3 beträgt der Wert drei. Wir aktualisieren den Wert, indem wir die aktuelle_Summe um 3 erhöhen. Die aktuelle_Summe beträgt also 6.

Beispiel für Kadanes Algorithmus

In diesem Fall ist die max_sum kleiner als die current_sum. Max_sum wird also mit dem Wert von current_sum aktualisiert.

Schritt 6) Für das letzte Element des Arrays haben wir -1. Wenn wir dies mit der aktuellen_Summe addieren, beträgt die aktuelle_Summe 5, was kleiner als die maximale_Summe ist. Die max_sum bleibt also 6.

Beispiel für Kadanes Algorithmus

Da wir das Ende des Arrays erreicht haben, endet der Algorithmus hier. Jetzt enthält „max_sum“ das Subarray mit der maximalen Summe. Das ist 5. Das Subarray ist {4,-2,1,3}.

Pseudocode für Kadanes Algorithmus

function KadaneAlgorithm():
    input: array
    maximum_sum, current_sum = 0
    for each elements in array:
        add the element with current_sum
        if current_sum is greater than the maximum_sum
            then maximum_sum = current_sum
        if current_sum is less than the element
            then current_sum = element
    return the value of maximum_sum

C++Implementierung des Kadane-Algorithmus

#include < iostream >
using namespace std;
void kadane(int array[], int n) {
  int current_sum = 0;
  int max_sum = -1e9;
  // -1e9 means -10000000
  for (int i = 0; i < n; i++) {
    current_sum += array[i];
    if (max_sum < current_sum) {
      max_sum = current_sum;
    }
    if (current_sum < array[i]) {
      current_sum = array[i];
    }
  }
  cout << "largest sum is " << max_sum << endl;
}
int main() {
  int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
  kadane(array, sizeof(array) / sizeof(array[0]));
}

Ausgang:

largest sum is 12

Python Implementierung des Kadane-Algorithmus

def kadane(numbers):
  current_sum = 0
  max_sum = -1e9
for i in range(len(numbers)):
  current_sum += numbers[i]
if max_sum < current_sum:
  max_sum = current_sum
if current_sum<numbers[i]:
  current_sum = numbers[i]
  print("largest sum is ",max_sum)
  kadane([-10,5,1,6,-9,2,-7,3,-5])

Ausgang:

largest sum is 12

Komplexitätsanalyse für das größte zusammenhängende Teilarray

Der einfache Ansatz verwendet zwei Schleifen. Diese Methode berechnet alle möglichen Subarray-Summen, um die größte zu finden. Es ist ein Brute-Force-Ansatz. Jede Schleife läuft bis zum Ende Array.

Wenn ein Array insgesamt hat N Elemente, dann werden wir mit zwei Schleifen durch N gehen2 Elemente. Als Ergebnis wird die Zeitkomplexität für einen einfachen Ansatz zum Finden des größten zusammenhängenden Teilarrays sein O(N2). Dabei steht „O“ für die Komplexitätsfunktion.

Andererseits ist der Kadane-Algorithmus die Methode der dynamischen Programmierung, um das maximale zusammenhängende Summen-Subarray zu finden. Wenn Sie dem Beispiel oder dem Code folgen, werden Sie feststellen, dass wir nur eine Schleife verwenden.

Dies führt dazu, dass das Eingabearray eine Größe von hat N, dann beträgt die Zeitkomplexität von Kadanes Algorithmus O(N). Dies ist schneller als der einfache Ansatz. Beispielsweise ein Array mit 100 Elementen. Der einfache Ansatz benötigt 100*100 oder 10,000 CPU-Zeit. Aber Kadanes Algorithmus benötigt nur 100 CPU-Zeit.