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
Zadania z analizy algorytmów bezlitośnie weryfikują, czy potrafisz "myśleć jak procesor". Komputer masz na sali przez cały egzamin, ale w tych zadaniach dostajesz 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.
📋 Spis treś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.
a ← 2
b ← 5
dopóki b > 0 wykonuj:
a ← a + 2
b ← b - 2
wypisz a, b
| Iteracja | a | b | Warunek b > 0 |
|---|---|---|---|
| Start (0) | 2 | 5 | 5 > 0 (Prawda) |
| 1 | 4 | 3 | 3 > 0 (Prawda) |
| 2 | 6 | 1 | 1 > 0 (Prawda) |
| 3 | 8 | -1 | -1 > 0 (Fałsz) |
Wniosek: Pętla przerwie się, gdy . 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ą i wewnętrzną ze zmienną , musisz pamiętać, że wewnętrzna pętla musi wykonać się w całości, zanim zewnętrzna pętla przejdzie do kolejnego kroku!
Jeśli zewnętrzna pętla kręci się razy, a wewnętrzna razy, to instrukcje ukryte w samym środku wykonają się dokładnie 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 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).
funkcja F(n):
jeśli n == 0 to:
zwróć 1
w przeciwnym razie:
zwróć F(n - 1) + 2
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.
Czas wykonania jest zawsze taki sam, niezależnie od wielkości danych . Np. odczyt pierwszego elementu z tablicy lub proste równanie matematyczne.
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!
Czas rośnie proporcjonalnie do danych. Występuje, gdy używasz jednej standardowej pętli (np. wyszukiwanie liniowe min/max w nieposortowanej tablicy).
Niebezpieczna przy dużych plikach. Oznacza zagnieżdżoną pętlę (pętla w pętli). Spotykana np. w standardowym Sortowaniu Bąbelkowym.
Rząd dobrych algorytmów sortowania: przez scalanie i szybkiego (średnio). W praktyce niewiele wolniejsza od liniowej, a nieporównywalnie szybsza od kwadratowej — to właśnie ta różnica decyduje przy pliku z milionem liczb.
Każdy krok podwaja pracę. Tak zachowuje się rekurencja z dwoma wywołaniami, na przykład naiwny ciąg Fibonacciego, oraz przeglądanie wszystkich podzbiorów. Przy nie doczekasz wyniku.
| n | log n | n | n log n | n² |
|---|---|---|---|---|
| 1 000 | 10 | 1 000 | 10 000 | 1 000 000 |
| 1 000 000 | 20 | 1 000 000 | 20 000 000 | 1012 |
Ta tabelka tłumaczy, dlaczego przy plikach z arkusza maturalnego (dziesiątki tysięcy wierszy) algorytm kwadratowy potrafi się nie doczekać końca, a liniowo-logarytmiczny kończy natychmiast. Jeśli w zadaniu programistycznym twój kod „wisi”, pierwsze pytanie brzmi: czy nie mam tu pętli w pętli.
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 =
- 2 zagnieżdżone pętle (od 1 do N każda) =
- Pętla
while, która w każdym kroku dzieli n przez 2 =
5
Rekurencja z dwoma wywołaniami
Funkcja z poprzedniej sekcji wywołuje samą siebie raz — jej śledzenie to prosty łańcuszek. Gdy w treści pojawiają się dwa wywołania, jak w ciągu Fibonacciego, łańcuszek zamienia się w drzewo i liczba wywołań wybucha. To ulubione zadanie CKE, bo sprawdza jednocześnie śledzenie i rozumienie złożoności.
funkcja Fib(n):
jeśli n < 2 to:
zwróć n
zwróć Fib(n-1) + Fib(n-2)
Warunek stopu obsługuje dwa przypadki naraz: i . Gdyby sprawdzał tylko , wywołanie zeszłoby do i algorytm nigdy by się nie zatrzymał. To najczęstszy błąd w zadaniach „popraw algorytm”.
Fib(4) ├── Fib(3) │ ├── Fib(2) │ │ ├── Fib(1) = 1 │ │ └── Fib(0) = 0 │ └── Fib(1) = 1 └── Fib(2) ├── Fib(1) = 1 └── Fib(0) = 0
Dziewięć wywołań na policzenie . Zwróć uwagę, że Fib(2) liczy się dwa razy, a Fib(1) aż trzy — to właśnie powtarzanie tej samej pracy daje złożoność .
6
Gdy CKE pyta o dokładną liczbę operacji
Notacja wystarcza do pytania „jak szybko rośnie”, ale arkusze potrafią zapytać wprost: „ile porównań wykona algorytm dla tablicy 10-elementowej”. Wtedy trzeba policzyć dokładnie, a nie z dokładnością do rzędu.
- Wyszukiwanie liniowe — najgorszy przypadek porównań, średnio około , najlepszy 1 (element na początku).
- Wyszukiwanie binarne — najwyżej porównań: dla 1000 elementów 10, dla miliona 20. Wymaga posortowanej tablicy i to trzeba w odpowiedzi napisać.
- Znalezienie maksimum — dokładnie porównań, bo pierwszy element przyjmujesz jako wzorzec.
- Znalezienie maksimum i minimum naraz — naiwnie , ale porównując elementy parami schodzisz do około . Typowe pytanie „czy da się szybciej”.
- Sortowanie bąbelkowe — pełna wersja robi porównań, czyli 45 dla dziesięciu elementów. Wersja z flagą kończy wcześniej, gdy tablica jest już posortowana.
Liczby pierwsze — pytanie, które wraca co roku. Sprawdzanie podzielności przez wszystkie liczby od 2 do to . Wystarczy jednak sprawdzić dzielniki do , bo gdyby istniał dzielnik większy, jego para byłaby mniejsza i już by się znalazła. To skraca pracę z tysiąca kroków do trzydziestu dwóch i jest jedną z najczęściej punktowanych obserwacji w części teoretycznej.
7
Pięć pułapek przy śledzeniu
- Zakres pętli. W pseudokodzie CKE zapis dla i = 1 do n obejmuje również wartość , czyli obrotów. W Pythonie
range(1, n)kończy się na . Przepisując algorytm z arkusza do kodu, to jest pierwsze miejsce, które się psuje. - Moment sprawdzania warunku. Pętla dopóki sprawdza warunek przed wykonaniem instrukcji, więc może nie wykonać się ani razu. Pętla powtarzaj … aż wykona się co najmniej raz.
- Wypisanie w pętli czy po pętli. Wcięcie decyduje o tym, czy zobaczysz jedną liczbę, czy całą serię. W pseudokodzie CKE wcięcie jest jedynym znacznikiem bloku — czytaj je tak uważnie jak treść.
- Dzielenie całkowite. Zapis albo div obcina część ułamkową: 7 div 2 to 3, nie 3,5. Przy wyszukiwaniu binarnym i konwersji na system dwójkowy pomyłka tutaj zmienia cały wynik.
- Kolejność podstawień przy zamianie. Zamiana wartości dwóch zmiennych wymaga trzeciej zmiennej pomocniczej. Zapis , a potem daje dwie takie same wartości — to klasyczne zadanie „wskaż błąd w algorytmie”.
Ś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 🚀
Porównanie obu egzaminów: forma, materiał, czas przygotowania i test decyzyjny na dziesięć pytań.
Korepetycje z informatyki
Zdajesz maturę rozszerzoną z informatyki?
Prowadzimy indywidualne przygotowanie do matury z informatyki — algorytmy, Python i C++, bazy danych i arkusz kalkulacyjny. Zajęcia online, na arkuszach CKE. Zobacz program i cennik.
Zobacz korepetycje z informatykiUczysz się w technikum informatycznym? Prowadzimy też przygotowanie do kwalifikacji INF.02, INF.03 i INF.04. Zobacz egzaminy zawodowe →