Pytania pomocnicze - INF.04

Projektowanie, programowanie i testowanie aplikacji

Pytania pomocnicze rozwijające tematy z pytań egzaminacyjnych. Każde pytanie ma krótką odpowiedź, która pomaga utrwalić wiedzę i przygotować się do egzaminu. Łącznie: 2975.
Strona 34 z 39.

Na czym polega zasada LIFO?

LIFO oznacza Last In, First Out, czyli ostatni dodany element jest usuwany lub przetwarzany jako pierwszy. Jest to podstawowa zasada działania stosu.

Czym stos różni się od listy?

Lista pozwala zwykle na dostęp do elementów według indeksu i operacje w różnych miejscach kolekcji. Stos ogranicza operacje głównie do szczytu, czyli ostatnio dodanego elementu.

Kiedy warto użyć stosu zamiast listy?

Stos warto użyć, gdy dane muszą być obsługiwane w odwrotnej kolejności niż zostały dodane. Przykładem jest cofanie operacji lub odwracanie kolejności elementów.

Jakie są podstawowe operacje na stosie?

Najważniejsze operacje to push, czyli dodanie elementu, pop, czyli zdjęcie elementu, oraz peek, czyli podejrzenie elementu ze szczytu bez jego usuwania.

Dlaczego szybkie wyszukiwanie elementów nie jest typowym zastosowaniem stosu?

Stos nie służy do wyszukiwania dowolnych elementów, ponieważ dostępny jest przede wszystkim element znajdujący się na szczycie. Do szybkiego wyszukiwania lepsze są inne struktury, np. mapa lub tablica z odpowiednim indeksem.

Czym różni się stos LIFO od kolejki FIFO?

Stos działa według zasady LIFO, czyli ostatni element wychodzi pierwszy. Kolejka działa według zasady FIFO, czyli pierwszy dodany element wychodzi pierwszy.

Dlaczego pseudokod jest zrozumiały dla osób nieznających konkretnego języka programowania?

Ponieważ używa prostych, opisowych instrukcji zamiast ścisłej składni języka programowania. Dzięki temu skupia się na logice algorytmu, a nie na technicznych szczegółach kodu.

Czym pseudokod różni się od kodu źródłowego programu?

Kod źródłowy musi być zapisany zgodnie ze składnią konkretnego języka i może zostać wykonany po kompilacji lub interpretacji. Pseudokod jest tylko opisem algorytmu przeznaczonym dla człowieka.

Na jakim etapie tworzenia programu warto używać pseudokodu?

Najczęściej używa się go przed rozpoczęciem właściwego programowania. Pomaga zaplanować rozwiązanie i uporządkować logikę działania programu.

Czy pseudokod można automatycznie wykonać na komputerze?

Nie. Pseudokod nie jest formalnym językiem programowania, więc komputer nie wykona go bez przepisania na konkretny język, np. Python, Java lub C++.

Jak pseudokod pomaga w wykrywaniu błędów logicznych?

Pozwala przeanalizować kolejne kroki algorytmu bez rozpraszania się składnią języka. Dzięki temu łatwiej zauważyć błędne warunki, brakujące kroki lub niepoprawną kolejność działań.

Czym pseudokod różni się od schematu blokowego?

Pseudokod zapisuje algorytm tekstowo, a schemat blokowy przedstawia go graficznie za pomocą bloków i strzałek. Oba sposoby służą do opisu logiki algorytmu.

Czym różni się algorytm iteracyjny od rekurencyjnego?

Algorytm iteracyjny używa pętli do powtarzania instrukcji. Algorytm rekurencyjny rozwiązuje problem przez wywoływanie samego siebie.

Dlaczego BubbleSort jest uznawany za algorytm iteracyjny?

BubbleSort wykonuje kolejne porównania i zamiany elementów w pętlach. Nie wymaga wywoływania samego siebie.

Dlaczego Fibonacci w wersji rekurencyjnej nie jest odpowiedzią poprawną?

Ponieważ w treści podano, że Fibonacci jest liczony rekurencyjnie. Oznacza to użycie funkcji wywołującej samą siebie, a nie pętli.

Czy QuickSort może być algorytmem rekurencyjnym?

Tak. QuickSort jest klasycznym przykładem algorytmu dziel i zwyciężaj, często implementowanym rekurencyjnie przez sortowanie podtablic.

Czy DFS zawsze musi być rekurencyjny?

Nie. DFS można zapisać rekurencyjnie albo iteracyjnie z użyciem stosu. W pytaniach egzaminacyjnych DFS często kojarzy się jednak z rekurencją.

Jak rozpoznać iterację w pseudokodzie?

Najczęściej po obecności pętli, takich jak `for`, `while` lub powtarzanych instrukcji wykonywanych do spełnienia warunku.

Jakie są przykłady prostych algorytmów iteracyjnych?

Przykładami są BubbleSort, liniowe wyszukiwanie elementu, sumowanie elementów tablicy oraz obliczanie silni za pomocą pętli.

Na czym polega szyfrowanie symetryczne?

Polega na użyciu tego samego tajnego klucza do zaszyfrowania i odszyfrowania danych. Klucz muszą znać obie strony komunikacji.

Dlaczego klucz w szyfrowaniu symetrycznym musi być chroniony?

Ponieważ każdy, kto pozna klucz, może odszyfrować zabezpieczone dane. Ujawnienie klucza oznacza utratę poufności informacji.

Czym szyfrowanie symetryczne różni się od asymetrycznego?

W szyfrowaniu symetrycznym używa się jednego wspólnego klucza. W asymetrycznym stosuje się parę kluczy: publiczny i prywatny.

Jakie są przykłady algorytmów szyfrowania symetrycznego?

Przykładami są AES, DES, 3DES i Blowfish. Obecnie najczęściej zalecany jest AES.

Jaka jest główna zaleta szyfrowania symetrycznego?

Jest szybkie i dobrze nadaje się do szyfrowania dużych ilości danych. Dlatego często stosuje się je w praktycznych systemach bezpieczeństwa.

Jaki jest główny problem szyfrowania symetrycznego?

Największym problemem jest bezpieczne przekazanie tajnego klucza drugiej stronie. Jeśli klucz zostanie przechwycony, dane mogą zostać odczytane.

Czym jest algorytm rekurencyjny?

To algorytm, w którym funkcja lub procedura wywołuje samą siebie. Każde wywołanie powinno przybliżać rozwiązanie do warunku zakończenia.

Po co w rekurencji potrzebny jest przypadek bazowy?

Przypadek bazowy zatrzymuje dalsze wywołania rekurencyjne. Bez niego program może doprowadzić do nieskończonej rekurencji i przepełnienia stosu.

Jaka jest różnica między rekurencją a iteracją?

Rekurencja polega na wywoływaniu funkcji przez samą siebie, a iteracja na wielokrotnym wykonywaniu instrukcji w pętli. Obie techniki często mogą rozwiązywać te same problemy.

Co oznacza wywołanie samego siebie w funkcji?

Oznacza to, że wewnątrz definicji funkcji znajduje się instrukcja uruchamiająca tę samą funkcję, zwykle z innymi argumentami.

Jakie problemy często rozwiązuje się rekurencyjnie?

Rekurencja jest często używana przy obliczaniu silni, ciągu Fibonacciego, przeszukiwaniu drzew, sortowaniu szybkim i algorytmach typu dziel i zwyciężaj.

Jakie jest główne zagrożenie przy źle napisanej rekurencji?

Największym problemem jest brak skutecznego warunku zakończenia. Może to spowodować zbyt wiele wywołań funkcji i błąd przepełnienia stosu.

Co oznacza złożoność liniowa algorytmu?

Złożoność liniowa oznacza, że liczba operacji rośnie proporcjonalnie do rozmiaru danych wejściowych. Jej oznaczenie to O(n).

Czym różni się O(1) od O(n)?

O(1) oznacza stałą liczbę operacji niezależną od liczby danych. O(n) oznacza, że liczba operacji rośnie wraz z liczbą elementów.

Jaki przykład kodu ma złożoność O(n)?

Pojedyncza pętla przechodząca przez wszystkie elementy tablicy lub listy ma zwykle złożoność O(n).

Dlaczego O(n²) nie jest złożonością liniową?

O(n²) oznacza złożoność kwadratową, w której liczba operacji rośnie znacznie szybciej niż liczba danych. Często występuje przy dwóch zagnieżdżonych pętlach.

Co oznacza litera n w notacji O(n)?

Litera n oznacza rozmiar danych wejściowych, np. liczbę elementów w tablicy, liście lub zbiorze.

Czy notacja Big O podaje dokładny czas działania programu?

Nie. Big O opisuje tempo wzrostu liczby operacji, a nie dokładny czas w sekundach, który zależy też od sprzętu i implementacji.

Co oznacza zapis O(n²)?

Oznacza złożoność kwadratową. Liczba operacji rośnie proporcjonalnie do kwadratu liczby danych wejściowych.

Dlaczego Bubble Sort ma zwykle złożoność O(n²)?

Ponieważ wykonuje wiele przejść po tablicy i porównuje sąsiednie elementy. Dla n elementów liczba porównań jest rzędu n razy n.

Jaką złożoność ma Binary Search?

Wyszukiwanie binarne ma złożoność O(log n), ponieważ w każdym kroku odrzuca połowę pozostałych danych.

Jaką złożoność ma Merge Sort?

Merge Sort ma złożoność O(n log n). Jest szybszy od Bubble Sort dla dużych zbiorów danych.

Czym różni się złożoność O(n) od O(n²)?

O(n) rośnie liniowo wraz z liczbą danych, a O(n²) rośnie kwadratowo. Algorytm O(n²) staje się dużo wolniejszy przy dużych danych.

Czy złożoność algorytmu Dijkstry zawsze wynosi O(n²)?

Nie zawsze. Złożoność algorytmu Dijkstry zależy od implementacji i użytych struktur danych, np. macierzy sąsiedztwa albo kolejki priorytetowej.

Co oznacza złożoność obliczeniowa O(n log n)?

Oznacza, że czas działania algorytmu rośnie trochę szybciej niż liniowo, ale znacznie wolniej niż kwadratowo. Jest to typowa złożoność efektywnych algorytmów sortowania porównawczego.

Dlaczego QuickSort ma średnią złożoność O(n log n)?

Średnio tablica jest dzielona na w miarę równe części, a każdy poziom podziału wymaga przejrzenia elementów. Daje to około log n poziomów i n operacji na poziom.

Kiedy QuickSort może mieć złożoność O(n²)?

Gdy pivot jest wybierany bardzo niekorzystnie, np. zawsze jako najmniejszy lub największy element. Wtedy podział tablicy jest skrajnie nierówny.

Czym jest pivot w algorytmie QuickSort?

Pivot to element wybrany jako punkt odniesienia podczas podziału tablicy. Elementy mniejsze i większe od niego są rozmieszczane po przeciwnych stronach.

Jaką średnią złożoność mają sortowanie bąbelkowe, przez wstawianie i przez wybór?

Te algorytmy mają średnią złożoność O(n²). Dlatego są zwykle wolniejsze od QuickSort dla dużych zbiorów danych.

Na czym polega metoda dziel i zwyciężaj w sortowaniu?

Polega na podzieleniu problemu na mniejsze podproblemy, rozwiązaniu ich osobno i połączeniu wyników. QuickSort dzieli tablicę względem pivota i sortuje części rekurencyjnie.

Dlaczego na egzaminie warto kojarzyć QuickSort z O(n log n)?

Ponieważ w pytaniach egzaminacyjnych QuickSort jest często zestawiany z prostymi algorytmami O(n²). Jego średnia złożoność O(n log n) jest najważniejszą cechą do zapamiętania.

Dlaczego QuickSort jest zwykle lepszy od sortowania bąbelkowego dla dużych zbiorów danych?

QuickSort ma średnią złożoność O(n log n), a sortowanie bąbelkowe O(n²). Przy dużej liczbie elementów różnica w czasie działania staje się bardzo duża.

Na czym polega strategia dziel i zwyciężaj w QuickSorcie?

Problem sortowania jest dzielony na mniejsze podproblemy przez wybór pivota i podział tablicy. Następnie każda część jest sortowana osobno.

Czym jest pivot w algorytmie QuickSort?

Pivot to element odniesienia, względem którego dzieli się dane na mniejsze i większe. Dobry wybór pivota wpływa na szybkość działania algorytmu.

Kiedy QuickSort może działać wolno?

W najgorszym przypadku QuickSort ma złożoność O(n²), np. gdy pivot jest wybierany bardzo niekorzystnie i podział danych jest skrajnie nierówny.

Dlaczego sortowanie przez zliczanie nie zawsze jest najlepszym wyborem?

Sortowanie przez zliczanie jest bardzo szybkie tylko dla liczb całkowitych z niewielkiego, znanego zakresu. Nie jest uniwersalne dla dowolnych danych.

Dlaczego sortowanie przez wstawianie nie jest najlepsze dla dużych zbiorów danych?

Sortowanie przez wstawianie ma zwykle złożoność O(n²), więc dla dużych danych wykonuje bardzo dużo porównań i przesunięć. Sprawdza się raczej przy małych lub prawie posortowanych zbiorach.

Co oznacza średnia złożoność O(n log n)?

Oznacza, że liczba operacji rośnie szybciej niż liniowo, ale znacznie wolniej niż kwadratowo. Jest to dobra złożoność dla algorytmów sortowania porównawczego.

Na czym polega metoda dziel i zwyciężaj?

Polega na podzieleniu problemu na mniejsze podproblemy, rozwiązaniu ich osobno i połączeniu wyników. QuickSort dzieli tablicę względem pivota i sortuje części rekurencyjnie.

Dlaczego QuickSort jest algorytmem rekurencyjnym?

Ponieważ wywołuje sam siebie dla mniejszych fragmentów tablicy. Rekurencja kończy się, gdy fragment ma zero lub jeden element.

Czym jest pivot w algorytmie QuickSort?

Pivot to element odniesienia, względem którego dzielona jest tablica. Elementy mniejsze trafiają na jedną stronę, a większe na drugą.

Jaka jest średnia złożoność czasowa QuickSort?

Średnia złożoność QuickSort wynosi O(n log n). Dlatego algorytm jest zwykle bardzo szybki w praktyce.

Kiedy QuickSort może działać wolno?

QuickSort może osiągnąć złożoność O(n²), gdy pivot jest wybierany niekorzystnie. Przykładem jest sytuacja, gdy za każdym razem dzieli tablicę bardzo nierówno.

Czy sortowanie bąbelkowe wykorzystuje metodę dziel i zwyciężaj?

Nie. Sortowanie bąbelkowe porównuje sąsiednie elementy i zamienia je miejscami, ale nie dzieli problemu na mniejsze części.

Czym QuickSort różni się od sortowania przez wybór?

Sortowanie przez wybór wielokrotnie wyszukuje najmniejszy element i przenosi go na właściwe miejsce. QuickSort dzieli tablicę względem pivota i sortuje powstałe części.