Dział II

Analiza Algorytmów na Suchej Kartce (Dry Run)

Jak czytać pseudokod CKE? Tworzenie tabelek śledzenia zmiennych, rozrysowywanie drzew rekurencji oraz szacowanie złożoności obliczeniowej Big O.

Wstęp: Bądź jak kompilator

Część I matury z informatyki bezlitośnie weryfikuje, czy potrafisz "myśleć jak procesor". Zamiast pisać kod w wygodnym edytorze z kolorowaniem składni, dostajesz na kartce surowy pseudokod i pytanie: "Co wypisze ten algorytm dla n = 5?". Metoda "na oko" zazwyczaj kończy się błędem o jedną iterację (tzw. błąd off-by-one). W tym dziale nauczysz się niezawodnych technik śledzenia algorytmów: od tabelek zmiennych, przez drzewa wywołań, aż po błyskawiczne szacowanie złożoności.

1

Tabelka śledzenia zmiennych (Dry Run)

To najprostsza, a zarazem najbardziej skuteczna metoda ratująca punkty na maturze. Zamiast zgadywać wynik, rysujesz na brudnopisie tabelkę, gdzie każda kolumna to jedna zmienna z algorytmu, a każdy wiersz to jeden pełny obrót pętli.

Przykład: Pętla dopóki (while)
Przeanalizuj poniższy pseudokod:

a 2
b 5
dopóki b > 0 wykonuj:
    a a + 2
    b b - 2
wypisz a, b

Tworzymy tabelkę śledzenia:
IteracjaabWarunek b > 0
Start (0)255 > 0 (Prawda)
1433 > 0 (Prawda)
2611 > 0 (Prawda)
38-1-1 > 0 (Fałsz)

Wniosek: Pętla przerwie się, gdy b=1b = -1. Algorytm wypisze liczby: 8, -1.

2

Pętle zagnieżdżone (Pętla w pętli)

To najczęstsze źródło błędów w zadaniach CKE. Gdy mamy zewnętrzną pętlę ze zmienną ii i wewnętrzną ze zmienną jj, musisz pamiętać, że wewnętrzna pętla musi wykonać się w całości, zanim zewnętrzna pętla przejdzie do kolejnego kroku!

🧠
Złota Zasada Zagnieżdżeń

Jeśli zewnętrzna pętla kręci się NN razy, a wewnętrzna MM razy, to instrukcje ukryte w samym środku wykonają się dokładnie NMN \cdot M razy.

s 0
dla i = 1 do 3 wykonuj:
    dla j = 1 do 2 wykonuj:
        s s + i + j

Zewnętrzna robi 3 kroki (i=1, 2, 3). Wewnętrzna robi 2 kroki (j=1, 2). Zatem zmienna ss zostanie zwiększona 6 razy. Nie zgaduj wyników – rozpisuj krok po kroku!

3

Magia Rekurencji: Drzewa wywołań

Rekurencja (funkcja wywołująca samą siebie) potrafi przepalić zwoje mózgowe, jeśli próbujesz ją śledzić w pamięci. Zamiast tabelki, do rekurencji zawsze rysuj drzewo wywołań (call tree).

Przykład: Własna funkcja rekurencyjna
Zadanie: Co zwróci wywołanie F(3) dla poniższej funkcji?

funkcja F(n):
    jeśli n == 0 to:
        zwróć 1
    w przeciwnym razie:
        zwróć F(n - 1) + 2

Krok 1. Zejście w dół (Rozwijanie wywołań):
F(3) czeka na zwrot z → F(2) + 2
  F(2) czeka na zwrot z → F(1) + 2
    F(1) czeka na zwrot z → F(0) + 2
      F(0) uderza w warunek bazowy! Zwraca → 1
Krok 2. Powrót (Zwijanie wywołań - Backtracking):
Skoro F(0) = 1, to F(1) = 1 + 2 = 3
Skoro F(1) = 3, to F(2) = 3 + 2 = 5
Skoro F(2) = 5, to F(3) = 5 + 2 = 7

Zawsze najpierw zejdź na samo dno (do warunku stopu), a dopiero potem dodawaj/mnoż wartości, wracając do góry.

4

Złożoność obliczeniowa (Notacja Big O)

Złożoność odpowiada na pytanie: "Jeśli ilość danych wzrośnie dwukrotnie, o ile dłużej będzie działał ten algorytm?". CKE nie wymaga od Ciebie precyzyjnych dowodów matematycznych, musisz jednak umieć poprawnie sklasyfikować algorytm do odpowiedniego rzędu.

O(1)\mathcal{O}(1)
Stała

Czas wykonania jest zawsze taki sam, niezależnie od wielkości danych nn. Np. odczyt pierwszego elementu z tablicy lub proste równanie matematyczne.

O(logn)\mathcal{O}(\log n)
Logarytmiczna

Z każdym krokiem pętli zbiór danych zmniejsza się o połowę (lub inną stałą część). Klasyczny przykład to Wyszukiwanie Binarne. Bardzo szybka!

O(n)\mathcal{O}(n)
Liniowa

Czas rośnie proporcjonalnie do danych. Występuje, gdy używasz jednej standardowej pętli (np. wyszukiwanie liniowe min/max w nieposortowanej tablicy).

O(n2)\mathcal{O}(n^2)
Kwadratowa

Niebezpieczna przy dużych plikach. Oznacza zagnieżdżoną pętlę (pętla w pętli). Spotykana np. w standardowym Sortowaniu Bąbelkowym.

Trik CKE na szacowanie złożoności: Zignoruj operacje poza pętlami. Zlicz, ile razy wykona się "najgłębsza" pętla.

  • 1 pętla przechodząca po tablicy N-elementowej = O(n)\mathcal{O}(n)
  • 2 zagnieżdżone pętle (od 1 do N każda) = O(n2)\mathcal{O}(n^2)
  • Pętla while, która w każdym kroku dzieli n przez 2 = O(logn)\mathcal{O}(\log n)
Przetestuj swoje zwoje mózgowe!

Śledzenie kodu to czysta praktyka. Przejdź do naszej bazy quizów i spróbuj odgadnąć, jaki wynik zwrócą algorytmy przygotowane na wzór zeszłorocznych arkuszy maturalnych CKE.

Rozwiąż Quiz z Analizy Algorytmów 🚀