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