MODUŁ 09
Złożoność i zadania integrujące
Testowanie poprawności i analiza złożoności to dwie różne rzeczy. Funkcja może zwracać dobry wynik dla małych przykładów, ale być zbyt wolna dla dużych danych.
W skrócie
Testowanie poprawności i analiza złożoności to dwie różne rzeczy. Funkcja może zwracać dobry wynik dla małych przykładów, ale być zbyt wolna dla dużych danych.
Typowe punkty odniesienia:
- jeden przebieg po
nelementach: zazwyczajO(n); - dwie zagnieżdżone pętle po
nelementach: częstoO(n²); - dzielenie problemu na połowę w każdym kroku: często
O(log n); - pełny przegląd każdej pary elementów: często
O(n²).
To tylko wskazówki: złożoność należy uzasadnić dla konkretnego algorytmu. W testach używaj danych większych od przykładów, a w kryterium punktowym podawaj oczekiwany rząd złożoności i ograniczenia wejścia.
Przykład
Największa suma spójnego fragmentu jednym przebiegiem.
long long najlepsza(const std::vector<long long>& v) {
long long best = v[0], cur = v[0];
for (int i = 1; i < (int)v.size(); ++i) {
if (cur < 0) cur = v[i];
else cur += v[i];
if (cur > best) best = cur;
}
return best;
}
- Bieżący fragment resetuje się, gdy zejdzie poniżej zera.
- Wynik może być ujemny — nie wolno startować od zera.
Mierz na dużych danychMałe przykłady przechodzi i kwadratowe rozwiązanie — limit kroków je rozróżnia.
Ćwiczenia
- 1Najdłuższy spójny fragment niemalejącyZwróć długość najdłuższego spójnego fragmentu, w którym elementy są niemalejące.Otwórz w Pracowni →
- 2Maksymalna suma niepustego fragmentuZwróć największą sumę dowolnegoOtwórz w Pracowni →
- 3Liczba elementów większych od średniejWektor jest niepusty.Otwórz w Pracowni →
Sprawdzian III — moduły 7–9 (9 nowych zadań)
- 1Policz liczby pierwsze w wektorzeilePierwszych ma zwrócić liczbę elementów wektora, które są liczbami pierwszymi.Otwórz w Pracowni →
- 2Zbiorcze podsumowanie danychZwróć parę {suma, liczbaUjemnych}, gdzie suma to suma wszystkich elementów, a liczbaUjemnych to liczba…Otwórz w Pracowni →
- 3Najdłuższy ciąg niemalejący jako fragmentZwróć długość najdłuższego spójnego fragmentu niemalejącego.Otwórz w Pracowni →
- 4Liczby z częstotliwością większą niż jedenZwróć liczby, które występują w dane co najmniej dwa razy, każdą dokładnie raz i w kolejności pierwszego…Otwórz w Pracowni →
- 5Największy wspólny dzielnik z normalizacją znakuZwróć nieujemny największy wspólny dzielnik a i b, stosując algorytm Euklidesa.Otwórz w Pracowni →
- 6Czy wektor jest palindromemZwróć true, gdy wektor czytany od początku i od końca ma tę samą sekwencję wartości.Otwórz w Pracowni →
- 7Rekurencyjny NWDZwróć nieujemny NWD przez rekurencyjną wersję algorytmu Euklidesa.Otwórz w Pracowni →
- 8Najlepszy wynik po odrzuceniu jednego pomiaruDla niepustego wektora zwróć sumę wszystkich elementów po odrzuceniu dokładnie jednego wystąpienia minimum.Otwórz w Pracowni →
- 9Dwa najbliższe elementyDla wektora zawierającego co najmniej dwa elementy zwróć najmniejszą wartość |dane[i] - dane[j]| dla różnych…Otwórz w Pracowni →