Algorytmy i struktury danych w kwalifikacji INF.04: najważniejsze zasady, przykłady i 51 powiązanych pytań w banku.
Analiza algorytmu odpowiada na dwa pytania: czy daje poprawny wynik i jak rośnie koszt wykonania wraz z rozmiarem danych. W INF.04 trzeba śledzić pseudokod, rozpoznawać algorytmy wyszukiwania i sortowania oraz świadomie odróżniać przypadek najlepszy, średni i najgorszy.
Co opisuje notacja złożoności
Dla wejścia o rozmiarze n liczy się dominującą liczbę operacji. Stałe i wolniej rosnące składniki pomija się przy opisie rzędu wzrostu: 3n + 7 zapisuje się jako O(n), a dwie zagnieżdżone pętle po n elementów zwykle prowadzą do O(n^2). Złożoność czasowa nie jest czasem w sekundach, tylko sposobem porównania wzrostu kosztu.
Uwzględniaj też pamięć: sortowanie przez scalanie działa w O(n log n), ale typowa implementacja potrzebuje dodatkowej tablicy O(n). Algorytm może być szybszy kosztem pamięci. O(1) pamięci dodatkowej oznacza stałą liczbę zmiennych niezależną od wielkości danych.
Wyszukiwanie liniowe i binarne
Algorytm
Warunek
Najlepszy
Średni i najgorszy
liniowe
żaden
O(1) (element pierwszy)
O(n)
binarne
dane posortowane
O(1) (trafienie w środek)
O(log n)
Koszt wcześniejszego sortowania może sprawić, że pojedyncze wyszukanie w nieposortowanej małej tablicy lepiej wykonać liniowo.
Sortowania różnią się nie tylko nazwą
Sortowanie
Najlepszy
Średni
Najgorszy
Uwagi
bąbelkowe z przerwaniem
O(n)
O(n^2)
O(n^2)
przerwanie przy braku zamian
przez wybór
O(n^2)
O(n^2)
O(n^2)
tyle samo porównań nawet dla uporządkowanych
przez wstawianie
O(n)
O(n^2)
O(n^2)
szybkie dla prawie posortowanych
przez scalanie
O(n log n)
O(n log n)
O(n log n)
pamięć pomocnicza O(n)
szybkie
O(n log n)
O(n log n)
O(n^2)
najgorszy przy skrajnie nierównych podziałach
Stabilność oznacza zachowanie kolejności elementów o równych kluczach: ma znaczenie przy kolejnym sortowaniu rekordów wcześniej uporządkowanych po nazwisku. Przebieg każdego z tych algorytmów obejrzysz krok po kroku w wizualizacji algorytmów sortowania. Dobór struktury danych do operacji
Struktura
Mocna strona
Słaba strona
tablica
dostęp po indeksie O(1)
wstawienie na początku przesuwa elementy
lista wiązana
wstawienie przy znanym węźle
dojście do elementu k jest sekwencyjne
stos
LIFO: ostatni wszedł, pierwszy wyszedł
tylko wierzchołek
kolejka
FIFO: pierwszy wszedł, pierwszy wyszedł
tylko początek i koniec
tablica mieszająca
oczekiwany dostęp O(1)
kolizje; w skrajnym przypadku O(n)
zrównoważone drzewo BST
odczyt, dodanie, usunięcie O(log n)
bardziej złożona implementacja
Wybór zależy od tego, czy ważniejsze są wyszukiwanie, kolejność, częste wstawienia czy zużycie pamięci.
Jak analizować pseudokod
1.
Utwórz tabelę wartości zmiennych i wykonuj instrukcje dokładnie w podanej kolejności.
2.
Przy pętli zapisz wartości graniczne i sprawdź, czy koniec przedziału należy do zakresu.
3.
Przy rekurencji najpierw znajdź warunek kończący, potem rozpisz kilka wywołań do momentu powrotu.
4.
Złożoność oceniaj po ustaleniu liczby powtórzeń: kolejne pętle sumują koszty, pętla w pętli zwykle je mnoży.
5.
Pętla zmniejszająca zakres o jeden daje zwykle O(n), a dzieląca go przez dwa O(log n); wyjątki wynikają z pracy wykonywanej wewnątrz.