Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Jak znaleźć podtablicę o maksymalnej sumie (Maximum Subarray Sum) w Ruby

Okładka posta: Jak znaleźć podtablicę o maksymalnej sumie (Maximum Subarray Sum) w Ruby
Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Rozważmy klasyczny problem z algorytmów: znaleźć podtablicę o maksymalnej sumie.

Warunki zadania

Mamy tablicę liczb całkowitych (pozytywnych, negatywnych lub zerowych). Należy znaleźć taką ciągłą podsekwencję (subarray), której suma jest maksymalna możliwa.
max_sequence([-2, 1, -3, 4, -1, 2, 1, -5, 4])
# => 6, ponieważ największa suma to [4, -1, 2, 1]
Ważne punkty:
  • Jeśli wszystkie liczby są negatywne — zwracamy 0.
  • Pusta tablica również zwraca 0.
  • Podtablica musi być ciągła (to znaczy wszystkie elementy obok siebie).

Zasada rozwiązania (Algorytm Kadane’a)

Będziemy poruszać się po tablicy z lewej do prawej, a na każdym kroku:
  1. Dodajemy bieżącą liczbę do sumy pośredniej current_sum.
  2. Jeśli current_sum stała się mniejsza od 0 — zerujemy ją.
  3. Zapamiętujemy największą wartość current_sum, która się pojawiła — to jest nasza odpowiedź.
Jeśli suma stała się mniejsza od 0, pogarsza ona następne wartości, dlatego ją resetujemy.
Implementacja w Ruby
(jak zawsze, to jedna z możliwych wersji implementacji)
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 dla metody Ruby
RSpec.describe '#max_sequence' do
  it 'zwraca maksymalną sumę ciągłej podsekwencji' 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

Proste wyjaśnienie

Wyobraźmy sobie, że przechodzimy przez tablicę i gromadzimy sumę. Ale jeśli w pewnym momencie ta suma stała się ujemna — to wszystko, dalej tylko przeszkadza. Resetujemy ją i próbujemy ponownie.
Można wyobrazić sobie, że szukamy najkorzystniejszego odcinka drogi — gdzie zdobyliśmy najwięcej "punktów", nie pozwalając stracić wszystkiego przez jedną złą dziurę.
Ten algorytm nadaje się do problemów typu "znajdź największą podsekwencję". Działa w O(n) — czyli bardzo szybko. Prosty do zaimplementowania i przetestowania.

Ten post nie ma jeszcze żadnych dodatków od autora.

24 kwi 20:17

Naprawiamy minikube "Próbujesz uruchomić binarkę amd64 na systemie M1."

meme code
meme code@memecode
24 kwi 20:55

Instalujemy minikube na Macu z M1 (rezygnujemy z qemu, uruchamiamy na dockerze)

meme code
meme code@memecode
Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca
25 kwi 23:02

Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca

meme code
meme code@memecode
9 maj 19:27

[FIXED] nie można załadować takiego pliku -- html/pipeline (LoadError) występuje podczas rails generate thredded:install

meme code
meme code@memecode
Zadanie: Przekształcenie liczby rzymskiej na dziesiętną (Ruby)
20 maj 12:05

Zadanie: Przekształcenie liczby rzymskiej na dziesiętną (Ruby)

meme code
meme code@memecode
Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)
21 maj 10:27

Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)

meme code
meme code@memecode
Reklama w Google dla początkujących: Krok po kroku do udanego startu
28 maj 10:21

Reklama w Google dla początkujących: Krok po kroku do udanego startu

meme code
meme code@memecode
Czym jest jemalloc i jak ma się do Ruby / Ruby on Rails
30 maj 11:53

Czym jest jemalloc i jak ma się do Ruby / Ruby on Rails

meme code
meme code@memecode
5 cze 01:52

[Fixed] niezainicjowana stała ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

meme code
meme code@memecode
Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały
5 cze 18:23

Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały

meme code
meme code@memecode
Czym jest format HEIC i dlaczego proste zmienienie jego nazwy na .jpg to zły pomysł
15 cze 18:17

Czym jest format HEIC i dlaczego proste zmienienie jego nazwy na .jpg to zły pomysł

meme code
meme code@memecode
Dlaczego wybór CMS jest ważny podczas tworzenia strony internetowej?
29 cze 12:34

Dlaczego wybór CMS jest ważny podczas tworzenia strony internetowej?

meme code
meme code@memecode