R11XKE2RMGEGK
Zdjęcie przedstawia owoce sezonowe w małych pojemnikach, porzeczki, jagody, borówki, maliny i poziomki.

I_R_W14_M25_C++ Szukanie jednoczesne min‑max

Źródło: Alex Block, domena publiczna.

Algorytm jednoczesnego wyszukiwania minimum i maksimum

W wielu zadaniach algorytmicznych zachodzi potrzeba znalezienia najmniejszego (minimum) oraz największego (maksimum) elementu w zbiorze danych, na przykład w tablicy liczb. Najprostszym rozwiązaniem tego problemu jest wykonanie dwóch osobnych przeglądów danych – jednego w celu znalezienia minimum, a drugiego w celu znalezienia maksimum. Podejście to jest poprawne, lecz nieefektywne, ponieważ wymaga dużej liczby porównań.

Algorytm jednoczesnego wyszukiwania minimum i maksimum umożliwia znalezienie obu wartości w jednym przebiegu danych. Jego istotą jest odpowiednia organizacja porównań, najczęściej poprzez porównywanie elementów parami, co pozwala ograniczyć ich liczbę i zwiększyć efektywność obliczeń.

Warto zauważyć, że algorytm ten można zapisać zarówno w formie iteracyjnej, wykorzystującej pętle, jak i w formie rekurencyjnej, opartej na dzieleniu problemu na mniejsze podproblemy i łączeniu uzyskanych wyników. Dzięki temu algorytm stanowi dobry przykład ilustrujący różne podejścia do rozwiązywania tego samego problemu algorytmicznego.

Metoda „dziel i zwyciężaj”

Strategię „dziel i zwyciężaj” można podzielić na trzy etapy:

  • Podziel problem na podproblemy.

  • Znajdź rozwiązanie dla każdego podproblemu.

  • Połącz rozwiązania podproblemów w rozwiązanie problemu głównego.

Należy pamiętać, że problem musi zostać podzielony na takie same lub bardzo do siebie podobne podproblemy (przynajmniej dwa). Ponadto zbiory danych, dla których rozwiązywane są podproblemy, powinny być niemal jednakowe i stanowić stałą część całego zbioru danych.

Ważne!

Należy zadbać o poprawne zaprojektowanie trzeciego kroku, polegającego na scalaniu rozwiązań. Jeżeli będzie on nieoptymalny, niekorzystnie wpłynie na końcową złożoność czasową algorytmu.

Zastosowane techniki „dziel i zwyciężaj” do równoczesnego wyszukiwania w zbiorze największej i najmniejszej wartości.

Algorytm jednoczesnego wyszukiwania wartości minimalnej i maksymalnej, który wykorzystuje strategię dziel i zwyciężaj, składa się z następujących kroków:

  1. Sprawdź rozmiar tablicy. Jeśli rozmiar wynosi 1, zwróć element jako minimum i maksimum.

  2. Podziel tablicę na dwie równe części.

  3. Rekurencyjnie wywołaj algorytm dla dwóch połówek tablicy.

  4. W wyniku wywołania rekurencyjnego otrzymasz wartości minimalne i maksymalne dla każdej połówki.

  5. Porównaj wartości minimalne i maksymalne dla obu połówek i zwróć wyniki.

  6. Porównaj wartości minimalne i maksymalne z obu połówek i wybierz mniejszą wartość jako minimum całej tablicy oraz większą wartość jako maksimum całej tablicy.

  7. Zwróć minimum i maksimum jako wynik.

Kroki 2‑5 są wykonywane rekurencyjnie dla każdej połówki tablicy aż do momentu, gdy rozmiar tablicy wynosi 1. W tym przypadku algorytm zwraca jedyny element tablicy jako zarówno minimum, jak i maksimum.

Algorytm wykorzystuje strategię „dziel i zwyciężaj”, dzieląc problem na mniejsze części. Następnie łączy wyniki z mniejszych problemów, aby uzyskać wynik dla całego problemu. W tym przypadku dzieli tablicę na dwie równe części, znajduje wartości minimalne i maksymalne dla każdej połowy, a następnie porównuje je, aby znaleźć wartości minimalne i maksymalne dla całej tablicy.

Pseudokod algorytmu:

Linia 1. funkcja ZnajdzMinMax otwórz nawias okrągły tablica przecinek pocz przecinek kon zamknij nawias okrągły. Linia 2. jeżeli kon znak równości pocz. Linia 3. min ← tablica otwórz nawias kwadratowy pocz zamknij nawias kwadratowy. Linia 4. max ← tablica otwórz nawias kwadratowy pocz zamknij nawias kwadratowy. Linia 5. zwróć otwórz nawias okrągły min przecinek max zamknij nawias okrągły. Linia 6. jeżeli kon znak równości pocz plus 1. Linia 7. jeżeli tablica otwórz nawias kwadratowy pocz zamknij nawias kwadratowy otwórz nawias ostrokątny znak równości tablica otwórz nawias kwadratowy kon zamknij nawias kwadratowy. Linia 8. min ← tablica otwórz nawias kwadratowy pocz zamknij nawias kwadratowy. Linia 9. max ← tablica otwórz nawias kwadratowy kon zamknij nawias kwadratowy. Linia 10. w przeciwnym razie. Linia 11. min ← tablica otwórz nawias kwadratowy kon zamknij nawias kwadratowy. Linia 12. max ← tablica otwórz nawias kwadratowy pocz zamknij nawias kwadratowy. Linia 13. zwróć otwórz nawias okrągły min przecinek max zamknij nawias okrągły. Linia 15. polowa ← otwórz nawias okrągły pocz plus kon zamknij nawias okrągły prawy ukośnik prawy ukośnik 2. Linia 17. otwórz nawias okrągły minLewa przecinek maxLewa zamknij nawias okrągły ← ZnajdzMinMax otwórz nawias okrągły tablica przecinek pocz przecinek polowa zamknij nawias okrągły. Linia 18. otwórz nawias okrągły minPrawa przecinek maxPrawa zamknij nawias okrągły ← ZnajdzMinMax otwórz nawias okrągły tablica przecinek polowa plus 1 przecinek kon zamknij nawias okrągły. Linia 20. min ← min otwórz nawias okrągły minLewa przecinek minPrawa zamknij nawias okrągły. Linia 21. max ← max otwórz nawias okrągły maxLewa przecinek maxPrawa zamknij nawias okrągły. Linia 23. zwróć otwórz nawias okrągły min przecinek max zamknij nawias okrągły.

Słownik

iteracja
iteracja

(z łac. iteratio) powtarzanie w pętli tych samych instrukcji aż do spełnienia pewnego warunku

metoda „dziel i zwyciężaj”
metoda „dziel i zwyciężaj”

metoda polegająca na podzieleniu problemu na mniejsze, prostsze do rozwiązania podproblemy; po całkowitym rozbiciu problemu oraz rozwiązaniu podproblemów, łączymy je z powrotem w całość i rozwiązujemy cały problem

rekurencja
rekurencja

technika programowania polegająca na odwoływaniu się procedur lub funkcji do samych siebie, aż do momentu spełnienia warunku podstawowego

rozwiązanie naiwne
rozwiązanie naiwne

najprostsze, bezpośrednie rozwiązanie danego problemu, pozbawione jakichkolwiek usprawnień i optymalizacji, przez co zazwyczaj jest to rozwiązanie nieoptymalne; przykładami mogą być algorytmy, które sprawdzają wszystkie możliwe rozwiązania (podczas gdy wystarczyłoby sprawdzenie tylko części), przeszukują całe zbiory danych (podczas gdy wystarczyłoby tylko częściowe przeszukiwanie) itp.

złożoność czasowa
złożoność czasowa

czas niezbędny do rozwiązania określonego problemu, podawany zazwyczaj w liczbach operacji dominujących; złożoność czasowa zależy od ilości danych wejściowych