KWALIFIKACJA INF3 - STYCZEŃ 2023

PYTANIE NR 2.
Jaką złożoność obliczeniową mają problemy polegające na wykonaniu czynności na łańcuchu lub tabeli w dwóch zagnieżdżonych pętlach działających na wszystkich elementach?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Dwie zagnieżdżone pętle iterujące po wszystkich n elementach wykonują łącznie n·n operacji (zewnętrzna n razy, a w każdej iteracji wewnętrzna n razy). W notacji Big O pomija się stałe i wyrazy niższego rzędu, więc wzrost jest kwadratowy. Dlatego poprawna jest złożoność O(n2).

Pełne wyjaśnienie:

Notacja Big O opisuje, jak rośnie czas wykonania algorytmu wraz ze wzrostem rozmiaru danych wejściowych n. Interesuje nas tempo wzrostu (górne ograniczenie), a nie dokładny czas, dlatego w Big O pomija się stałe mnożniki oraz składniki niższego rzędu.

W pytaniu mowa o czynnościach wykonywanych na łańcuchu lub tablicy w dwóch zagnieżdżonych pętlach, przy czym obie pętle przechodzą przez wszystkie elementy. To oznacza typowy schemat:

  • pętla zewnętrzna: ~n iteracji,
  • dla każdej iteracji zewnętrznej pętla wewnętrzna: ~n iteracji.

Liczba powtórzeń operacji w środku wynosi więc około n · n = n². W konsekwencji złożoność czasowa rośnie kwadratowo, czyli O(n²).

Dlaczego pozostałe odpowiedzi są niepoprawne?

  • O(n) opisuje sytuację z jedną pętlą po wszystkich elementach lub gdy praca w środku jest stała i wykonywana raz na element. Przy dwóch pełnych pętlach zagnieżdżonych wzrost jest szybszy niż liniowy.
  • O(log n) jest typowe dla algorytmów dzielących problem na połowy (np. wyszukiwanie binarne). Dwie pętle po wszystkich elementach nie powodują logarytmicznego spadku liczby kroków.
  • O(n!) pojawia się np. przy generowaniu wszystkich permutacji (problemów kombinatorycznych). Zwykłe przejście dwoma pętlami po tablicy nie ma tak gwałtownego wzrostu.

Wskazówka egzaminacyjna: zawsze sprawdź, czy wewnętrzna pętla rzeczywiście wykonuje się n razy. Jeśli ma stały limit (np. do 10) albo jej zakres jest krótszy, wynik może być inny. W tym zadaniu warunek "na wszystkich elementach" jednoznacznie prowadzi do O(n²).

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Notacja Big O opisuje, jak rośnie czas (lub pamięć) algorytmu wraz ze wzrostem rozmiaru danych n. Pokazuje klasę wzrostu, pomijając stałe i mniej istotne składniki. Dzięki temu można porównywać algorytmy niezależnie od sprzętu i języka.
Najczęściej widać ją jako dwie pętle zagnieżdżone, które każda iteruje po ~n elementach. Wtedy liczba wykonań instrukcji w środku to około n · n. Typowy przykład: porównywanie każdej pary elementów w tablicy.
Bo pętla zewnętrzna wykonuje się n razy, a wewnętrzna uruchamia się w każdej iteracji zewnętrznej i też wykonuje się n razy. Łącznie powstaje n×n operacji. W Big O zapisuje się to jako O(n²), ignorując stałe czynniki.
Nie. Jeśli pętla wewnętrzna ma stały limit (np. zawsze 10 iteracji), całość jest O(n). Jeśli zakres wewnętrznej zależy od i (np. od 1 do i), nadal często wychodzi O(n²), ale trzeba to przeanalizować zamiast zgadywać.
W O(n) liczba operacji rośnie proporcjonalnie do n (np. jedno przejście po tablicy). W O(n²) przy podwojeniu n czas rośnie około czterokrotnie. W kodzie często oznacza to przejście po wszystkich elementach i w środku kolejne przejście po wszystkich elementach.
Oznacza to, że dla dużych n liczy się najszybciej rosnący składnik. Przykładowo 3n² + 10n + 5 ma złożoność O(n²). Stałe (3, 10, 5) i wolniej rosnące części (n) nie zmieniają klasy asymptotycznej.
Gdy n jest duże, np. tysiące lub dziesiątki tysięcy rekordów/elementów. Operacje typu "porównaj każdy z każdym" szybko robią się wolne. Wtedy szuka się optymalizacji: lepszych algorytmów (np. O(n log n)) albo struktur danych (np. haszowanie).
Klasyczne przykłady to proste sortowania w najgorszym przypadku (np. bąbelkowe, przez wybór) oraz algorytmy porównujące wszystkie pary elementów. W praktyce takie rozwiązania są OK dla małych danych, ale słabo skalują się na duże zbiory.
Złożoność O(n!) pojawia się, gdy rozważasz wszystkie permutacje lub bardzo kosztowne kombinacje (np. brutalna siła w problemach typu komiwojażer). Dwie zwykłe pętle po danych nie generują permutacji, więc nie prowadzą do wzrostu silniowego.
  1. Ustal, od czego zależy n (liczba elementów wejścia).
  2. Zlicz, ile razy wykona się kluczowa operacja.
  3. Dla pętli zagnieżdżonych zwykle mnożysz liczby iteracji.
  4. Na końcu zostaw dominujący składnik (Big O).
info

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

W praktyce zawodowej kluczowe jest to, że dwie zagnieżdżone pętle iterujące po wszystkich n elementach wykonują łącznie n·n operacji (zewnętrzna n razy, a w każdej iteracji wewnętrzna n razy).

Źródła:

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, "Introduction to Algorithms" (3rd edition), rozdział o analizie złożoności i notacji asymptotycznej (Big-O).
  • https://pl.wikipedia.org/wiki/Notacja_O_du%C5%BCe - dostęp 2026-02-28
  • https://en.wikipedia.org/wiki/Big_O_notation - dostęp 2026-02-28

Materiały:

  • Podręczniki i kursy z podstaw algorytmiki: notacja Big O i analiza pętli
  • Ćwiczenia: wyznaczanie złożoności dla kodu z 1–3 pętlami oraz dla pętli zależnych od i
  • Materiały o typowych klasach złożoności i przykładach algorytmów (sortowania, wyszukiwania, zliczania par)

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego