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?
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.