KWALIFIKACJA INF3 - STYCZEŃ 2021

PYTANIE NR 2.
Wskaż złożoność obliczeniową algorytmu naiwnego (zwykłego) wyszukiwania minimum w zbiorze liczb?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Aby znaleźć minimum w zbiorze metodą naiwną, przechodzisz po wszystkich n elementach, trzymając aktualne minimum i wykonując stałą liczbę operacji (np. jedno porównanie) dla każdego elementu. Liczba kroków rośnie więc proporcjonalnie do n, co daje złożoność czasową O(n).

Pełne wyjaśnienie:

Algorytm "naiwnego" wyszukiwania minimum polega na wykonaniu jednego pełnego przejścia po danych. Typowy przebieg wygląda tak: ustawiasz pierwszy element jako aktualne minimum, a następnie dla każdego kolejnego elementu sprawdzasz (porównujesz), czy jest mniejszy i ewentualnie aktualizujesz zapamiętaną wartość.

Klucz do oceny złożoności to policzenie, ile razy wykonuje się operacja zależna od liczby elementów n. Dla wejścia o rozmiarze n wykonujesz około n−1 porównań (dla każdego elementu poza pierwszym). Aktualizacja minimum, przypisania i odczyty to operacje stałokosztowe, które nie zmieniają rzędu wzrostu.

Dlatego całkowity czas działania rośnie liniowo wraz z n i zapisuje się go jako O(n). Nie ma tu zagnieżdżonych pętli po n, nie porównujesz każdej pary elementów, tylko każdy element porównujesz z bieżącym minimum.

Dlaczego pozostałe odpowiedzi są błędne?

  • O(n^2) opisuje sytuacje, gdy wykonujesz zagnieżdżone iteracje po danych (np. porównujesz każdą parę elementów) albo wielokrotnie przeglądasz całą listę. W szukaniu minimum nie jest to potrzebne.
  • O(n^3) dotyczy jeszcze głębszych zagnieżdżeń (trzech pętli) i w praktyce pojawia się w wybranych algorytmach grafowych lub w naiwnych algorytmach na macierzach. Tu nie występuje.
  • O(n!) jest typowe dla problemów przeszukiwania permutacji i bruteforce (np. niektóre warianty problemu komiwojażera). Szukanie minimum nie wymaga rozważania permutacji elementów.

Wskazówka egzaminacyjna: jeśli w pseudokodzie widzisz jedną pętlę przechodzącą po n elementach i w środku tylko proste instrukcje (porównanie, przypisanie), najczęściej będzie to O(n).

Dodatkowe pytania

Dodatkowe pytania (FAQ):
O(n) znaczy, że czas rośnie liniowo wraz z liczbą elementów n. Dla podwojenia liczby danych wykonujesz w przybliżeniu dwa razy więcej porównań. W szukaniu minimum zwykle robisz jedno przejście po tablicy i jedno porównanie na element.
Ustawiasz pierwszy element jako aktualne minimum, a potem idziesz po kolejnych elementach. Każdy element porównujesz z bieżącym minimum i w razie potrzeby aktualizujesz wartość. To jeden przebieg bez zagnieżdżonych pętli.
O(n^2) pojawia się, gdy porównujesz elementy parami lub masz dwie pętle zależne od n. W szukaniu minimum nie musisz zestawiać wszystkich par; wystarczy porównywać każdy element z aktualnym minimum, więc liczba porównań to ok. n−1.
Dla nieuporządkowanych danych i bez dodatkowych założeń trzeba "zobaczyć" każdy element, bo dowolny z nich może być minimum. To daje dolne ograniczenie liniowe. Szybciej bywa tylko przy dodatkowej strukturze (np. kopiec) i wielu zapytaniach.
Jeśli masz n elementów, pierwszy przyjmujesz jako minimum bez porównania, a potem dla każdego z pozostałych n−1 elementów wykonujesz jedno porównanie z bieżącym minimum. Stąd liczba porównań to n−1, czyli rząd wzrostu O(n).
Najczęściej myli się "szukanie minimum" z "sortowaniem, żeby wziąć pierwszy element", co sztucznie podnosi złożoność. Inny błąd to automatyczne przypisywanie O(n^2) każdej operacji na tablicy bez sprawdzenia, czy występuje zagnieżdżona pętla.
Pseudokod: ustaw min = a[0]; dla i=1..n-1: jeśli a[i] < min to min=a[i]. Jest jedna pętla po n elementach i stała praca w środku, więc złożoność czasowa to O(n), a pamięciowa zwykle O(1).
Zwykle nie. Wbudowana funkcja min() dla listy/tablicy najczęściej i tak wykonuje przegląd liniowy elementów (wewnętrznie robi to, co algorytm naiwny). Implementacja jest szybsza stałymi, ale rząd wzrostu pozostaje O(n).
W praktyce przy analizie wyników z bazy danych lub tablic w aplikacji: najniższa cena, minimalny czas, najmniejsza wartość w logach. W INF.3 ważne jest też rozumienie, że proste przetwarzanie po kolei jest często lepsze niż zbędne sortowanie.
O(n) zwykle wynika z jednego przejścia po danych. O(n log n) często pojawia się przy sortowaniu lub rekurencji typu "dziel i zwyciężaj". Jeśli w opisie/pseudokodzie nie ma sortowania ani dzielenia problemu, a jest jedna pętla, to najczęściej będzie O(n).
info

Około 55% zdających odpowiada poprawnie na to pytanie. średnie

W praktyce zawodowej kluczowe jest to, że aby znaleźć minimum w zbiorze metodą naiwną, przechodzisz po wszystkich n elementach, trzymając aktualne minimum i wykonując stałą liczbę operacji (np. jedno porównanie) dla każdego elementu.

Źródła:

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, "Introduction to Algorithms", 3rd edition, rozdział 2 (analiza algorytmów i notacja asymptotyczna)
  • Wikipedia: "Big O notation" https://en.wikipedia.org/wiki/Big_O_notation (dostęp: 2026-03-01)
  • CP-Algorithms: "Complexity" / analiza pętli i rzędu wzrostu https://cp-algorithms.com/ (sekcja o złożoności, dostęp: 2026-03-01)

Materiały:

  • Podręcznik do algorytmów omawiający notację O(·) i analizę pętli
  • Materiały kursowe o analizie złożoności (pętle, zagnieżdżenia, przegląd liniowy)
  • Zadania treningowe: rozpoznawanie O(n), O(n^2), O(log n) na podstawie pseudokodu

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego