Zaawansowane algorytmy i struktury danych

Transkrypt

Zaawansowane algorytmy i struktury danych
{2015-02-26, 2015-03-03} by Admirał
Zaawansowane algorytmy i struktury danych
u dr Barbary Marszał-Paszek
Opracowanie pytań teoretycznych z egzaminów.
Strona 1 z 12
{2015-02-26, 2015-03-03} by Admirał
Pytania teoretyczne z egzaminu pisemnego z 25 czerwca 2014
(studia dzienne)
1. Wady i zalety programowania dynamicznego.
2. Podaj dwa przykłady algorytmów wyszukiwania wzorca w tekście
i podaj ich złożoność.
3. Przykład algorytmu działającego w czasie
.
4. Gdzie znajduje się granica między problemami łatwo rozwiązywalnymi i trudno
rozwiązywalnymi (chodzi o złożoności).
5. Podaj rząd wielkości złożoności obliczeniowej algorytmu mnożącego wielkie liczby w
oparciu o metodę dziel i zwyciężaj.
Pytania teoretyczne z egzaminu pisemnego z 15 oraz 27 lutego 2015
(studia zaoczne)
1. Wymień dwa algorytmy wyszukiwania wzorca w tekście i podaj ich złożoności
czasowe.
2. Podaj wzór na średnią złożoność obliczeniową algorytmu.
3. Podaj, gdzie znajduje się (w zakresie klas złożoności) granica pomiędzy problemami
łatwo rozwiązalnymi, a problemami trudno rozwiązywalnymi.
4. Podaj po jednym przykładzie algorytmu działającego w czasie
oraz
.
5. Podaj rząd wielkości złożoności obliczeniowej algorytmu mnożącego wielkie liczby w
oparciu o strategię "dziel i zwyciężaj".
Pytania teoretyczne z egzaminu ustnego z 27 stycznia 2015
(jest to "dopytka" osób, które powtarzają ten przedmiot)
1. Podać dwie metody rozwiązywania równań rekurencyjnych.
2. Której notacji używa się do opisywania złożoności pesymistycznych.
3. Zdefiniować notacje, powiedzieć dlaczego jest kilka, podać różnice pomiędzy nimi /
kiedy się je stosuje (pytanie to jest rozwinięciem pytania nr 2).
Pytania teoretyczne z egzaminu ustnego z 30 stycznia 2015
(jest to "dopytka" osób, które powtarzają ten przedmiot)
1.
2.
3.
4.
5.
6.
Podać twierdzenie o rekurencji uniwersalnej.
Do jakiego typu równań stosuje się twierdzenie o rekurencji uniwersalnej.
Rodzaje równań rekurencyjnych.
Jaka jest złożoność najlepszych algorytmów sortujących.
Co sprawia, że QuickSort jest taki szybki.
Inne pytania odnośnie algorytmów sortujących (niestety nie pamiętam ich już ).
Strona 2 z 12
{2015-02-26, 2015-03-03} by Admirał
Jak widać, niektóre pytania się powtarzają, także w opracowaniu będę podawał treść pytania
i odpowiedź na nie. Niektóre pytania połączyłem, a niektóre rozdzieliłem aby nie zaciemniać,
a także dostosowałem kolejność do tematyki. Gdzieniegdzie dodałem też więcej przykładów,
niż było to wymagane.
Pytania z 30 stycznia, poza jednym, nie są opracowane.
Strona 3 z 12
{2015-02-26, 2015-03-03} by Admirał
1. Wady i zalety programowania dynamicznego
Wady
 Istnieje potrzeba rekurencyjnego sformułowania problemu.
 Należy dowieść własności optymalnej podstruktury.
 Wymagana jest pamięć o wymiarach zależnych od danych wejściowych
(np. rozmiaru problemu).
 Istnieją ograniczenia zastosowań algorytmów programowania dynamicznego
związane z wielkością liczb występujących w przetwarzanych problemach.
Zalety
 Problemy o strukturze rekurencyjnej pod problemów są tą metodą
przetwarzane
w
czasie
wielomianowym
–
eliminacja
wielokrotnego
rozwiązywania tych samych pod problemów.
 Rozwiązywane są wszystkie różne pod problemy danego problemu, a wyniki
przechowywane w tablicy o rozmiarze wielomianowym (najczęściej
lub
 Po rozwiązaniu wszystkich pod problemów i zbudowaniu tablicy z ich
rozwiązaniami czas rozwiązywania problemu jest zwykle liniowy, np.
 Istnieje
możliwość
wyznaczenia
dokładnego
rozwiązania
.
problemu
optymalizacyjnego, który czasami nie posiada algorytmu wielomianowego
(np. problem plecakowy).
Strona 4 z 12
{2015-02-26, 2015-03-03} by Admirał
2. Podaj dwa przykłady algorytmów wyszukiwania wzorca w tekście
i podaj ich złożoność.
m - długość wzorca
n - długość tekstu
1. Algorytm Knutha-Morrisa-Pratta
Przetwarzanie wstępne:
Wyszukiwanie:
2. Algorytm Karpa-Rabina:
Wyszukiwanie:
3. Algorytm naiwny (brute force)
Wyszukiwanie:
3. Przykład algorytmu działającego w czasie:
a)





Wybór elementu z tablicy.
Wstawianie elementu do listy.
Odkładanie elementu na stos / pobieranie elementu ze stosu.
Dodawania/usuwanie elementu do/z kolejki.
Przejście do następnego elementu listy.






Przeszukiwanie liniowe.
Przeszukiwanie listy nieuporządkowanej.
Porównanie dwóch łańcuchów.
Sprawdzanie palindromu.
Przejście przez tablicę.
Przejście przez listę.
b)
Strona 5 z 12
{2015-02-26, 2015-03-03} by Admirał
c)
 Przeszukiwanie binarne.
 Znajdowanie największej/najmniejszej liczby w drzewie przeszukiwań
binarnych.
 Obliczanie liczb Fibonacciego.
d)




Sortowanie przez kopcowanie.
Sortowanie przez scalanie.
Sortowanie biblioteczne.
Quick Sort.




Sortowanie bąbelkowe.
Sortowanie przez wstawianie.
Sortowanie przez wybór.
Przejście przez tablicę dwuwymiarową.




Rekurencyjny algorytm dla wież Hanoi.
Generowanie wszystkich podzbiorów zbioru n-elementowego.
Klasyczne rekurencyjne obliczanie liczb Fibonacciego.
Znalezienie klucza symetrycznego algorytmu szyfrującego metodą brute force.
e)
f)
4. Podaj rząd wielkości złożoności obliczeniowej algorytmu mnożącego
wielkie liczby w oparciu o metodę dziel i zwyciężaj.
UWAGA: Theta, a nie O !
Algorytm Karacuby (Karatsuby):
Strona 6 z 12
{2015-02-26, 2015-03-03} by Admirał
5. Podaj, gdzie znajduje się (w zakresie klas złożoności) granica
pomiędzy problemami łatwo rozwiązalnymi, a problemami trudno
rozwiązywalnymi.
Granica znajduje się pomiędzy złożonościami:
wielomianową
, a wykładniczą
Złożoność wielomianowa jest największą złożonością dla problemów łatwo
rozwiązywanych.
Złożoność wykładnicza jest najmniejszą złożonością dla problemów trudno
rozwiązywalnych.
6. Podać dwie metody rozwiązywania równań rekurencyjnych.
1. Metoda podstawiania
Polega na odgadnięciu postaci rozwiązania, a następnie wykazaniu przez indukcję, że
jest ono poprawne. Trzeba też znaleźć odpowiednie stałe. Bardzo skuteczna, jednak
stosowana tylko w przypadkach, kiedy łatwo jest przewidzieć rozwiązania.
2. Metoda iteracyjna
Polega na rozwijaniu (iterowaniu) rekurencji i wyrażeniu jej jako sumy składników
zależnych tylko od n warunków brzegowych. Następnie mogą być użyte techniki
sumowania do oszacowania rozwiązania. Metoda ta jest zazwyczaj związana dużą
ilością przekształceń algebraicznych, przez co zachowanie prostoty nie jest łatwe.
3. Metoda uniwersalna
Strona 7 z 12
{2015-02-26, 2015-03-03} by Admirał
7. Której notacji używa się do opisywania złożoności pesymistycznych.
Zdefiniować notacje, powiedzieć dlaczego jest kilka, podać różnice
pomiędzy nimi / kiedy się je stosuje.
Rząd wielkości służy do opisu czasu działania algorytmu.
Istnieją trzy notacje służące do tego celu.
Niech
a) Notacja O (omikron)
Jest to ograniczenie funkcji od góry (asymptotyczna granica górna).
Służy do szacowania czasu działania algorytmu w przypadku pesymistycznym.
Gdy mówimy, że pewna funkcja
jest rzędu (
), to oznacza, że:
Istnieje taki argument
od którego począwszy:
dla każdego argumentu
wartości funkcji
są nie większe od wartości funkcji
z dokładnością do stałej
Formalnie:
(
)
Obrazowo:
Na prawo od argumentu
funkcja
znajduje się pod funkcją
czyli jest ograniczona przez nią z góry,
Notacja (
,
) pozwala nam oszacować zachowanie się złożoności obliczeniowej gdy
Strona 8 z 12
{2015-02-26, 2015-03-03} by Admirał
b) Notacja
(omega)
Jest to ograniczenie funkcji od dołu (asymptotyczna granica dolna).
Służy do szacowania czasu działania algorytmu w najlepszym przypadku.
Gdy mówimy, że pewna funkcja
jest rzędu (
), to oznacza, że:
Istnieje taki argument
od którego począwszy:
dla każdego argumentu
wartości funkcji
są nie mniejsze od wartości funkcji
z dokładnością do stałej
Formalnie:
(
)
Obrazowo:
Na prawo od argumentu
funkcja
znajduje się nad funkcją
czyli jest ograniczona przez nią z dołu.
,
Strona 9 z 12
{2015-02-26, 2015-03-03} by Admirał
c) Notacja
(theta)
Jest to ograniczenie funkcji zarówno od góry, jak i od dołu
(asymptotyczne oszacowanie dokładne).
Służy do szacowania czasu działania algorytmu w przypadku uśrednionym.
Gdy mówimy, że pewna funkcja
Istnieje taki argument
jest rzędu
, to oznacza, że:
od którego począwszy:
dla każdego argumentu
wartości funkcji
są nie większe od wartości funkcji
z dokładnością do stałej
wartości funkcji
są nie mniejsze od wartości funkcji
z dokładnością do stałej
Formalnie:
(
)
Obrazowo:
Na prawo od argumentu
funkcja
znajduje się:
pod funkcją
- czyli jest ograniczona przez nią z góry
nad funkcją
- czyli jest ograniczona przez nią z dołu
Można powiedzieć, że
(
)i (
)
, gdy
jest równocześnie rzędu
Strona 10 z 12
{2015-02-26, 2015-03-03} by Admirał
Przykład
Wyznaczyliśmy oczekiwaną złożoność obliczeniową pewnego algorytmu i otrzymaliśmy
następujący wzór:
Gdy
czynnik
staje się coraz mniej znaczący w stosunku do czynnika
.
Stąd wnioskujemy, że jest to algorytm o złożoności
Udowodnienie tego polega na znalezieniu:
argumentu
stałej
dla których zachodzi:
gdzie
W tym przypadku wystarczy przyjąć:
Mamy:
dla
Podany algorytm ma rząd złożoności obliczeniowej równy
1600
1400
1200
1000
f=n^2+3n
800
g=4*n^2
600
400
200
0
0
5
10
15
20
Strona 11 z 12
{2015-02-26, 2015-03-03} by Admirał
8. Podaj wzór na średnią złożoność obliczeniową algorytmu.
Niech:
- algorytm rozwiązujący problem .
- zbiór danych rozmiaru
- pewne dane
dla problemu .
.
- prawdopodobieństwo wystąpienia danych .
- funkcja określająca koszt (liczbę operacji dominujących) algorytmu
dla danych .
- funkcja (supremum) określająca najmniejsze z ograniczeń górnych
funkcji f
Wzór na średnią (oczekiwaną) złożoność obliczeniową:
∑
Wzór na pesymistyczną złożoność obliczeniową:
(
)
9. Jaka jest złożoność najlepszych algorytmów sortujących.
10. Co sprawia, że QuickSort jest taki szybki.
Nie pamiętam już, czy była mowa właśnie o QuickSort, w każdym razie chodziło o to,
że algorytm porównuje klucze, przez co jest taki szybki. W przypadku braku kluczy
byłby wolniejszy.
Strona 12 z 12