Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Wie man das Teilarray mit der maximalen Summe (Maximum Subarray Sum) in Ruby findet

Beitrags-Cover: Wie man das Teilarray mit der maximalen Summe (Maximum Subarray Sum) in Ruby findet
InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Betrachten wir das klassische Problem aus der Algorithmik: das Teilarray mit der maximalen Summe finden.

Aufgabenstellung

Wir haben ein Array von ganzen Zahlen (positiv, negativ oder null). Wir müssen eine kontinuierliche Teilfolge (subarray) finden, deren Summe möglichst maximal ist.
max_sequence([-2, 1, -3, 4, -1, 2, 1, -5, 4])
# => 6, weil die größte Summe [4, -1, 2, 1] ist
Wichtige Punkte:
  • Wenn alle Zahlen negativ sind — geben wir 0 zurück.
  • Ein leeres Array gibt ebenfalls 0 zurück.
  • Das Teilarray muss kontinuierlich sein (d.h. alle Elemente hintereinander).

Lösungsprinzip (Kadane-Algorithmus)

Wir werden von links nach rechts durch das Array gehen und bei jedem Schritt:
  1. Die aktuelle Zahl zur Zwischensumme current_sum hinzufügen.
  2. Wenn current_sum kleiner als 0 wird — setzen wir sie auf 0.
  3. Wir merken uns den größten Wert von current_sum, der bisher aufgetreten ist — das ist unsere Antwort.
Wenn die Summe kleiner als 0 wird, verschlechtert sie die folgenden Werte, daher setzen wir sie zurück.
Implementierung in Ruby
(wie immer, dies ist eine der möglichen Implementierungen)
def max_sequence(arr)
  max_sum = 0
  current_sum = 0

  arr.each do |n|
    current_sum += n
    max_sum = [max_sum, current_sum].max
    current_sum = 0 if current_sum < 0
  end

  max_sum
end
Rspec für die Ruby-Methode
RSpec.describe '#max_sequence' do
  it 'gibt die maximale Summe einer zusammenhängenden Teilfolge zurück' do
    expect(max_sequence([])).to eq(0)
    expect(max_sequence([-1, -2, -3])).to eq(0)
    expect(max_sequence([1, 2, 3])).to eq(6)
    expect(max_sequence([-2, 1, -3, 4, -1, 2, 1, -5, 4])).to eq(6)
    expect(max_sequence([2, -1, 2, 3, 4, -5])).to eq(10)
    expect(max_sequence([-2, -3, 4, -1, -2, 1, 5, -3])).to eq(7)
  end
end

Einfache Erklärung

Stellen wir uns vor, wir gehen durch das Array und summieren die Werte. Aber wenn diese Summe irgendwann negativ wird — dann ist es vorbei, sie wird nur noch stören. Wir setzen sie zurück und versuchen es erneut.
Man kann sich vorstellen, dass wir den vorteilhaftesten Abschnitt der Straße suchen — wo wir die meisten "Punkte" gesammelt haben, ohne alles durch ein einziges schlechtes Loch zu verlieren.
Dieser Algorithmus eignet sich für Probleme vom Typ "finde die größte Teilfolge". Er arbeitet in O(n) — also sehr schnell. Einfach zu implementieren und zu testen.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

24. Apr, 20:17 Uhr

Wir fixieren minikube "Sie versuchen, die amd64-Binärdatei auf einem M1-System auszuführen."

meme code
meme code@memecode
24. Apr, 20:55 Uhr

Wir fixieren minikube auf dem Mac mit M1 (wir verzichten auf qemu, starten auf docker)

meme code
meme code@memecode
Wo findet man eine ältere Version von Google Chrome und lädt sie herunter? Am Beispiel eines alten Macs.
25. Apr, 23:02 Uhr

Wo findet man eine ältere Version von Google Chrome und lädt sie herunter? Am Beispiel eines alten Macs.

meme code
meme code@memecode
09. Mai, 19:27 Uhr

[FIXED] kann solche Datei nicht laden -- html/pipeline (LoadError) tritt auf während rails generate thredded:install

meme code
meme code@memecode
Aufgabe: Umwandlung einer römischen Zahl in eine Dezimalzahl (Ruby)
20. Mai, 12:05 Uhr

Aufgabe: Umwandlung einer römischen Zahl in eine Dezimalzahl (Ruby)

meme code
meme code@memecode
Aufgabe zur Überprüfung der richtigen Platzierung von Klammern (Ruby)
21. Mai, 10:27 Uhr

Aufgabe zur Überprüfung der richtigen Platzierung von Klammern (Ruby)

meme code
meme code@memecode
Google-Werbung für Anfänger: Schritt-für-Schritt-Anleitung für einen erfolgreichen Start
28. Mai, 10:21 Uhr

Google-Werbung für Anfänger: Schritt-für-Schritt-Anleitung für einen erfolgreichen Start

meme code
meme code@memecode
Was ist jemalloc und wie hängt es mit Ruby / Ruby on Rails zusammen
30. Mai, 11:53 Uhr

Was ist jemalloc und wie hängt es mit Ruby / Ruby on Rails zusammen

meme code
meme code@memecode
05. Jun, 01:52 Uhr

[Fixed] nicht initialisierte Konstante ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

meme code
meme code@memecode
Die Vorschau im Netzwerk-Tab ist nach dem Update von Chrome sehr klein geworden.
05. Jun, 18:23 Uhr

Die Vorschau im Netzwerk-Tab ist nach dem Update von Chrome sehr klein geworden.

meme code
meme code@memecode
Was ist das HEIC-Format und warum ist es eine schlechte Idee, es einfach in .jpg umzubenennen?
15. Jun, 18:17 Uhr

Was ist das HEIC-Format und warum ist es eine schlechte Idee, es einfach in .jpg umzubenennen?

meme code
meme code@memecode
Warum die Wahl des CMS bei der Website-Entwicklung wichtig ist?
29. Jun, 12:34 Uhr

Warum die Wahl des CMS bei der Website-Entwicklung wichtig ist?

meme code
meme code@memecode