Minimale absolute Summe eines Subarrays finden

8

Es gibt ein Array A , das (positive und negative) Ganzzahlen enthält. Suchen Sie nach einem (zusammenhängenden) Subarray, dessen absolute Summe der Elemente minimal ist, z. B .:

%Vor%

Ich habe mit der Implementierung eines Brute-Force-Algorithmus begonnen, der O(N^2) oder O(N^3) enthielt, obwohl er korrekte Ergebnisse lieferte. Aber die Aufgabe spezifiziert:

%Vor%

Nach einigem Suchen dachte ich, dass vielleicht Kadanes Algorithmus für dieses Problem modifiziert werden könnte, aber ich habe es nicht geschafft.

Meine Frage ist - ist Kadanes Algorithmus der richtige Weg? Wenn nicht, könnten Sie mir in die richtige Richtung zeigen (oder einen Algorithmus benennen, der mir hier helfen könnte)? Ich möchte keinen vorgefertigten Code, ich brauche nur Hilfe beim Finden des richtigen Algorithmus.

    
NPS 22.09.2014, 02:31
quelle

8 Antworten

14

Wenn Sie die Partialsummen berechnen  wie

%Vor%

Dann ist die Summe jedes zusammenhängenden Subarrays die Differenz zweier Partialsummen. Um also das zusammenhängende Subarray zu finden, dessen absoluter Wert minimal ist, schlage ich vor, dass Sie die Partialsummen sortieren und dann die beiden am nächsten liegenden Werte finden und die Positionen dieser beiden Teilsummen in der ursprünglichen Sequenz verwenden, um den Anfang und das Ende zu finden des Unterarrays mit dem kleinsten absoluten Wert.

Das teure Bit hier ist die Art, also ich denke, das läuft in Zeit O(n * log(n)) .

    
mcdowella 22.09.2014, 04:30
quelle
6

Ich machte diesen Test auf Codility und ich fand mcdowella Antwort recht hilfreich, aber nicht genug, ich muss sagen: Also hier ist eine 2015 Antwort Jungs!

Wir müssen die Präfixsummen von Array A (hier P genannt) wie folgt aufbauen: P [0] = 0, P [1] = P [0] + A [0], P [2] = P [1 ] + A [1], ..., P [N] = P [N-1] + A [N-1]

Die "min abs sum" von A wird die minimale absolute Differenz zwischen 2 Elementen in P sein. Also müssen wir einfach .sort() P durchlaufen und durchlaufen, wobei wir jedes Mal 2 aufeinanderfolgende Elemente nehmen. Auf diese Weise haben wir O (N + N log (N) + N), was gleich O (N log (N)) ist.

Das ist es!

    
Saksow 05.03.2015 23:47
quelle
3

Dies ist C ++ Implementierung von Saksows Algorithmus.

%Vor%     
Louie Lu 17.02.2016 23:25
quelle
2

Die Antwort ist ja, Kadanes Algorithmus ist definitiv der Weg, um Ihr Problem zu lösen.

Ссылка

Quelle - Ich habe eng mit einem Doktoranden zusammengearbeitet, dessen gesamte Doktorarbeit dem maximalen Subarray-Problem gewidmet war.

    
wookie919 22.09.2014 02:50
quelle
0

Hier ist eine C-Lösung basierend auf Kadanes Algorithmus. Hoffentlich ist es hilfreich.

%Vor%     
Bibhu Mohapatra 18.07.2015 05:22
quelle
0
%Vor%     
Kovalan V 13.10.2015 02:50
quelle
0
%Vor%     
Oleg 17.08.2016 07:22
quelle
-1

Sie können Kadane's algorithm zweimal ausführen (oder es auf einmal tun), um die minimale und maximale Summe zu finden, in der das Suchminimum genauso funktioniert wie das Maximum mit umgekehrte Vorzeichen und berechnen Sie dann das neue Maximum, indem Sie ihren absoluten Wert vergleichen.

Quelle-Jemand (nicht erinnern, wer) Kommentar auf dieser Website.

    
monster 20.03.2017 14:02
quelle