Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie das maximale Subarray und den maximalen Algorithmus in C++

So verwenden Sie das maximale Subarray und den maximalen Algorithmus in C++

WBOY
WBOYOriginal
2023-09-19 11:09:111472Durchsuche

So verwenden Sie das maximale Subarray und den maximalen Algorithmus in C++

So verwenden Sie den Algorithmus für die maximale Subarray-Summe in C++

Das Problem der maximalen Subarray-Summe ist ein klassisches Algorithmusproblem, bei dem ein kontinuierliches Subarray in einem bestimmten ganzzahligen Array gefunden werden muss, sodass alle Subarrays die Summe der Elemente haben größte. Dieses Problem kann mit der Idee der dynamischen Programmierung gelöst werden.

Eine einfache, aber ineffiziente Lösung besteht darin, alle möglichen Unterarrays mit einer erschöpfenden Methode zu finden, ihre Summe zu berechnen und dann die größte Summe zu finden. Die zeitliche Komplexität dieser Methode beträgt O (n ^ 3) und ist sehr langsam, wenn die Array-Länge groß ist.

Eine effizientere Lösung basiert auf der Idee der dynamischen Programmierung. Wir können die maximale Subarray-Summe, die mit jedem Element endet, aufzeichnen, indem wir ein Hilfsarray dp definieren. dp[i] stellt die größte Subarray-Summe dar, die mit dem i-ten Element endet. Für dp[i] gibt es zwei Situationen:

  1. Wenn dp[i-1] größer als 0 ist, dann ist dp[i] = dp[i-1] + arr[i];
  2. Wenn dp[i -1 ] kleiner oder gleich 0 ist, dann ist dp[i] = arr[i].

Wir berechnen jedes Element des dp-Arrays, indem wir das gesamte Array durchlaufen und gleichzeitig das größte Subarray und max_sum sowie die entsprechenden Start- und Endindizes start und end aktualisieren. Wenn eine größere Subarray-Summe gefunden wird, aktualisieren wir den entsprechenden Wert. Schließlich ist die maximale Subarray-Summe max_sum, und der Startindex des Subarrays ist start und der Endindex ist end.

Das Folgende ist ein Codebeispiel zum Implementieren des maximalen Subarrays und Algorithmus in der C++-Sprache:

#include <iostream>
#include <vector>

using namespace std;

vector<int> maxSubarraySum(vector<int>& arr) {
    int n = arr.size();
    int dp[n];
    dp[0] = arr[0];
    int max_sum = dp[0];
    int start = 0, end = 0;

    for(int i = 1; i < n; i++) {
        if(dp[i-1] > 0)
            dp[i] = dp[i-1] + arr[i];
        else {
            dp[i] = arr[i];
            start = i;
        }
        
        if(dp[i] > max_sum) {
            max_sum = dp[i];
            end = i;
        }
    }
    
    vector<int> result;
    result.push_back(max_sum);
    result.push_back(start);
    result.push_back(end);

    return result;
}

int main() {
    vector<int> arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    vector<int> result = maxSubarraySum(arr);
    
    cout << "最大子数组和:" << result[0] << endl;
    cout << "子数组的起始下标:" << result[1] << endl;
    cout << "子数组的终止下标:" << result[2] << endl;

    return 0;
}

Führen Sie den obigen Code aus. Das Ausgabeergebnis lautet wie folgt:

Maximale Subarray-Summe: 6
Startindex des Subarrays: 3
von Subarray-Beendigungsindex: 6

Der obige Code löst das Problem der maximalen Subarray-Summe mit O(n)-Zeitkomplexität durch die Idee der dynamischen Programmierung. Dieser Algorithmus ist beim Umgang mit großen Arrays sehr effizient.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie das maximale Subarray und den maximalen Algorithmus in C++. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn