Przejdź do treści
INF.04 · część pisemna

Algorytmika i złożoność

Przed Tobą 10 pytań w formule egzaminu CKE.

Pytanie 1 / 10Algorytmika i Logika
Jaka jest złożoność czasowa sortowania szybkiego (QuickSort) w przypadku pesymistycznym?
Wszystkie 10 pytań z wyjaśnieniamiRozwiń, jeśli wolisz przejrzeć zestaw bez rozwiązywania testu.

Złożoności algorytmów sortowania i wyszukiwania, śledzenie pseudokodu, schematy blokowe, stos kontra kolejka, algorytm Euklidesa i rekurencja.

1.Jaka jest złożoność czasowa sortowania szybkiego (QuickSort) w przypadku pesymistycznym?

  • A.O(n)
  • B.O(log n)
  • C.O(n log n)
  • D.O(n²)— poprawna
Dlaczego: Skrajnie źle dobrany element osiowy (na przykład zawsze pierwszy element w tablicy już posortowanej) dzieli zakres na część pustą i (n-1)-elementową, więc poziomów rekurencji jest n zamiast log n, a na każdym wykonuje się porównania liniowe. Odpowiedź O(n log n) kusi, bo to złożoność optymistyczna i średnia tego algorytmu, podawana zwykle jako jego wizytówka.

2.Który algorytm ma złożoność O(n log n) w przypadku optymistycznym, średnim ORAZ pesymistycznym, ale wymaga dodatkowej pamięci rzędu O(n)?

  • A.Sortowanie bąbelkowe w wersji z flagą
  • B.Sortowanie przez scalanie (MergeSort)— poprawna
  • C.Sortowanie przez wybór
  • D.Sortowanie szybkie (QuickSort)
Dlaczego: Podział jest tu zawsze na dwie równe połowy niezależnie od zawartości danych, więc poziomów zawsze jest log n, a scalanie każdego poziomu kosztuje n operacji — stąd gwarancja we wszystkich trzech przypadkach. Ceną jest tablica pomocnicza o rozmiarze n. QuickSort kusi jako druga metoda dziel i zwyciężaj, ale jego podział zależy od pivota i degeneruje się do kwadratowej.

3.Tablica [7, 3, 9, 1, 5] jest sortowana rosnąco metodą bąbelkową, z porównywaniem sąsiednich par od lewej strony. Jak wygląda tablica po pierwszym PEŁNYM przebiegu?

  • A.3, 7, 1, 5, 9— poprawna
  • B.3, 7, 9, 1, 5
  • C.3, 1, 5, 7, 9
  • D.1, 3, 5, 7, 9
Dlaczego: Przebieg to cztery porównania par: (7,3) zamiana, (7,9) bez zmian, (9,1) zamiana, (9,5) zamiana — największa wartość wypływa na koniec, reszta przesuwa się tylko o jedną pozycję. Najczęstszy błąd to zatrzymanie się po pierwszej zamianie albo podanie tablicy w pełni posortowanej: jeden przebieg ustawia na swoim miejscu wyłącznie jeden element.

4.Ile porównań wykona w najgorszym przypadku wyszukiwanie binarne w posortowanej tablicy liczącej 4096 elementów?

  • A.około 6
  • B.około 2048
  • C.około 12— poprawna
  • D.około 4096
Dlaczego: Każdy krok odrzuca połowę zakresu, więc liczba kroków to logarytm o podstawie 2 z liczby elementów: 2 do potęgi 12 daje 4096, czyli po dwunastu połowieniach zostaje jeden element. Wartość 2048 kusi, bo zakłada jednorazowe podzielenie zbioru na pół, a 4096 to liczba porównań wyszukiwania liniowego, nie binarnego.

5.Jaki warunek MUSI być spełniony, aby w zbiorze danych można było zastosować wyszukiwanie binarne?

  • A.Liczba elementów musi być potęgą liczby 2
  • B.Wszystkie elementy muszą być unikalne
  • C.Elementy muszą być liczbami całkowitymi
  • D.Elementy muszą być uporządkowane (posortowane)— poprawna
Dlaczego: Algorytm porównuje szukaną wartość z elementem środkowym i na tej podstawie odrzuca całą jedną połowę zakresu — taki wniosek jest prawdziwy tylko wtedy, gdy wartości rosną lub maleją monotonicznie. Na zbiorze nieuporządkowanym metoda nie działa wolniej, tylko błędnie: odrzuca połowę, w której leży szukany element, i zwraca informację o jego braku.

6.Programista tworzy bufor wydruku, w którym dokumenty mają być drukowane dokładnie w kolejności ich zgłoszenia. Którą strukturę danych powinien wybrać i dlaczego?

  • A.Stos, bo działa według zasady LIFO
  • B.Kolejkę, bo działa według zasady FIFO— poprawna
  • C.Stos, bo operacje push i pop mają koszt O(1)
  • D.Drzewo BST, bo automatycznie porządkuje elementy
Dlaczego: FIFO oznacza dodawanie na końcu (enqueue) i pobieranie z początku (dequeue), więc kolejność obsługi jest identyczna z kolejnością zgłoszeń. Stos kusi, bo również daje operacje w czasie stałym, ale odkłada i zdejmuje z tego samego końca, przez co wydrukowałby dokumenty w odwrotnej kolejności. Drzewo BST porządkuje po wartości klucza, a nie po czasie zgłoszenia.

7.Który blok schematu blokowego jako JEDYNY posiada dwa wyjścia?

  • A.Prostokąt — blok operacyjny
  • B.Owal — blok graniczny
  • C.Romb — blok warunkowy— poprawna
  • D.Równoległobok — blok wejścia/wyjścia
Dlaczego: Ten blok zawiera pytanie o wartość logiczną i rozgałęzia sterowanie na drogę TAK i drogę NIE — to jedyne miejsce, w którym przebieg algorytmu się rozdziela. Prostokąt (przypisanie, obliczenie) i równoległobok (czytaj, pisz) mają zawsze dokładnie jedno wyjście, owal START jedno, a owal STOP nie ma żadnego. Rysowanie dwóch strzałek z prostokąta to klasyczny błąd.

8.Prześledź pseudokod: x = 200; k = 0; dopóki x > 1 wykonuj: x = x div 2; k = k + 1; koniec dopóki; pisz k. Jaką wartość wypisze algorytm?

  • A.5
  • B.6
  • C.7— poprawna
  • D.8
Dlaczego: Kolejne wartości x przy dzieleniu całkowitym to 100, 50, 25, 12, 6, 3, 1 — siedem obiegów, po których warunek x > 1 przestaje być prawdziwy. Pułapką jest krok 25 div 2, gdzie wynikiem jest 12, a nie 12,5. Ta pętla to wzorzec złożoności logarytmicznej: dzielenie zmiennej przez 2 w każdym obiegu daje O(log n).

9.Ile wynosi NWD(84, 36) wyznaczone algorytmem Euklidesa w wersji z resztą z dzielenia?

  • A.6
  • B.12— poprawna
  • C.24
  • D.252
Dlaczego: W każdym obiegu liczy się r = a mod b, po czym a przyjmuje wartość b, a b wartość r: 84 mod 36 daje 12, potem 36 mod 12 daje 0. Pętla kończy się, gdy b osiągnie zero, a wynikiem jest ostatnia niezerowa wartość a. Odpowiedź 252 kusi, bo to NWW tej pary (iloczyn liczb podzielony przez NWD), a 6 to wspólny dzielnik, ale nie największy.

10.Co stanie się podczas uruchomienia funkcji rekurencyjnej, w której pominięto warunek zakończenia (przypadek bazowy)?

  • A.Wywołania będą się mnożyć aż do przepełnienia stosu i przerwania programu— poprawna
  • B.Kompilator zgłosi błąd składni i nie utworzy pliku wykonywalnego
  • C.Funkcja zwróci wartość zero zaraz po pierwszym wywołaniu
  • D.Funkcja zadziała poprawnie, tylko wolniej niż wersja iteracyjna
Dlaczego: Każde wejście do funkcji rezerwuje na stosie ramkę z parametrami i adresem powrotu, a bez przypadku bazowego nic nie przerywa łańcucha wywołań, więc pamięć stosu się wyczerpuje. Odpowiedź o błędzie kompilacji kusi, ale składnia takiego kodu jest poprawna — usterka ujawnia się dopiero w czasie wykonania. Brak warunku zakończenia łamie cechę skończoności, więc taki zapis nie jest algorytmem.

To nie koniec powtórki

Przećwicz kolejny zestaw i utrwal materiał przed egzaminem.

Dalej: Paradygmaty programowania