Zadania, zestaw 2
Transkrypt
Zadania, zestaw 2
Informatyka niestacjonarna, 2 st., semestr 3 rok akad. 2016/2017 Złożoność obliczeniowa – zadania, zestaw 2 Określanie złożoności obliczeniowej algorytmów, obliczanie pesymistycznej i oczekiwanej złożoności obliczeniowej 1. Dana jest tablica jednowymiarowa A o rozmiarze n elementów. Chcemy przesunąć jej zawartość o k pozycji w lewo (n/2<k<n). Elementy, które zostaną wysunięte z lewej, wsuwamy cyklicznie z prawej strony tablicy. Czy można dla tego programu opracować algorytm o złożoności O(n)? 2. Dla problemu wyznaczania n-tego wyrazu ciągu Fibonacciego można sformułować trzy algorytmy opisane następującymi oszacowaniami asymptotycznymi: (nc), (nc) i o(n). Sformułować te trzy algorytmy, podać dokładne klasy złożoności do jakich należą. Które z tych klas dotyczą wersji iteracyjnych, a która wersji rekurencyjnej algorytmu. Dla n=20 podać różnice w złożoności obliczeniowej poszczególnych wersji algorytmu. 3. Wyznaczyć złożoność obliczeniową rekurencyjnego algorytmu rozwiązującego problem wież Hanoi. 4. Podać pesymistyczną złożoność obliczeniową algorytmu Euklidesa obliczającego największy wspólny dzielnik dwu liczb a i b. Podaną 5. Klasyczny algorytm mnożenia bardzo dużych liczb ma kwadratową złożoność obliczeniową (n2). Zakładamy, że obie mnożone liczby zajmują w pamięci n bitów. Podać algorytm, dla którego prawdziwe jest oszacowanie asymptotyczne o(n2). Wyliczyć jego złożoność obliczeniową. 6. Obliczyć złożoność pesymistyczną i oczekiwaną algorytmu: a) wyszukiwania liniowego (sekwencyjnego) elementu w nieposortowanym ciągu liczb b) wyszukiwania binarnego w posortowanym ciągu liczb 7. Obliczyć złożoność pesymistyczną i oczekiwaną dla algorytmu sprawdzającego czy w ciągu n liczb całkowitych jakaś z liczb występuje więcej niż jeden raz. 8. Obliczyć złożoność pesymistyczną i oczekiwaną dla algorytmu sprawdzającego czy w ciągu n liczb całkowitych większość stanowią liczby parzyste. Kolejne liczby w ciągu należy sprawdzać aż do osiągnięcia pozycji w tablicy po odczytaniu której jesteśmy pewni, czy więcej jest liczb parzystych czy nie. Otrzymaną zależność zweryfikować eksperymentalnie. 9. Wyznaczyć złożoność pesymistyczną i oczekiwaną dla algorytmu sortowania przez proste wstawianie. Podać kod programu zrealizowany w języku C. Rozważyć dwa warianty zadania: w pierwszym jako instrukcję podstawową przyjąć instrukcję porównania, w drugim instrukcję podstawienia. 10. Wyznaczyć złożoność pesymistyczną i oczekiwaną dla algorytmu sortowania przez proste wybieranie. Podać kod programu zrealizowany w języku C. Jako instrukcję podstawową –1– Informatyka niestacjonarna, 2 st., semestr 3 rok akad. 2016/2017 przyjąć instrukcję porównania oraz w drugim wariancie zadania – instrukcję podstawienia. 11. Wyznaczyć złożoność pesymistyczną, oczekiwaną i optymistyczną dla algorytmu sortowania przez proste wybieranie. Podać kod programu zrealizowany w języku C. 12. Wyznaczyć złożoność obliczeniową algorytmu Kruskala wyznaczającego minimalne drzewo rozpinające. 13. Wyznaczyć złożoność obliczeniową algorytmu Prima wyznaczającego minimalne drzewo rozpinające. 14. Podać złożoność obliczeniową algorytmu CYK sprawdzającego przynależność słowa do podanej gramatyki bezkontekstowej. 15. Dana jest dwuwymiarowa tablica o n wierszach i n kolumnach zawierająca wartości binarne 1 lub 0. Wartość 0 interpretujemy jako czarny piksel, a wartość 1 jako biały. Należy podać ilość kwadratowych obszarów (o takiej samej ilości kolumn i wierszy), w których znajduje się tyle samo pikseli czarnych, co białych. Przykładowo, znaleziony obszar o rozmiarze 2x2 powinien mieć 2 komórki zawierające piksele białe i dwie zawierające piksele czarne. Natomiast poprawnie znaleziony obszar o rozmiarze 10x10 powinien mieć 50 pikseli białych i tyle samo czarnych. Program powinien podawać dla danej tablicy, ilość różnych kwadratowych obszarów o dowolnym rozmiarze, dla których stwierdzono taką samą ilość komórek zawierających liczbę 1, co komórek zawierających liczbę 0. Wyznaczyć złożoność obliczeniową dwóch wersji programu: nie korzystającej z tablicy sum częściowych korzystającej z utworzonej wcześniej tablicy sum częściowych Tablica sum częściowych przechowuje na pozycji (k,l) sumę elementów analizowanej tablicy zawartych w komórkach (i,j) dla których in, jm (w komórkach położonych na lewo i u góry komórki o adresie (k,l)). Dlatego aby wyznaczyć sumę S elementów w obszarze prostokątnym tablicy wystarczy odwołać się do czterech wartości z tablicy sum częściowych zgodnie ze wzorem: S=D+A-B-C. 16. Dana jest plansza o rozmiarze nxn składająca się z n2 kwadratowych pól. Chcemy dowiedzieć się ile istnieje różnych tras o zadanej długości zaczynających się na środkowym polu planszy i kończących na innym (być może tym samym). Długość trasy d oznacza iż, przechodząc od pola początkowego do pola końcowego wykonujemy d ruchów. Jeden ruch oznacza przesunięcie się do sąsiedniego pola w jednym z czterech kierunków: w prawo, w lewo, w górę lub dół. Rozmiar planszy musi spełniać zależność n>d/2. Wyznaczyć złożoność obliczeniową dwóch wersji programu: stosując rekurencyjne przeszukiwanie kolejnych tras wykorzystując metodę programowania dynamicznego określającą liczbę tras wiodących do danego pola –2– Informatyka niestacjonarna, 2 st., semestr 3 rok akad. 2016/2017 W rozwiązaniu rekurencyjnym, w kolejnych wywołaniach funkcji rekurencyjnej odwiedzamy po kolei sąsiednie pola. We wszystkich wywołaniach rekurencyjnych po osiągnięciu d kroków sprawdzamy, czy osiągnęliśmy pole końcowe. Jeżeli tak, to zwiększamy licznik tras. W metodzie programowania dynamicznego tworzymy tablicę przechowującą liczbę możliwych tras. W pierwszym kroku dla czterech pól sąsiadujących z polem początkowym ustawiamy wartości 1 oznaczające cztery możliwe trasy o długości 1. W kolejnych krokach do każdego pola na planszy wpisujemy wartość będącą sumą wartości pól sąsiadujących z nim w pionie i w poziomie, co oznacza zsumowanie wszystkich możliwych tras wiodących do tego pola z czterech możliwych kierunków. Na koniec po d krokach w polu końcowym znajdzie się liczba określająca ilość wszystkich tras o długości d zaczynających się w polu początkowym i kończących się w tym polu. 17. Przeprowadzić eksperymenty obliczeniowe dla sortowania metodą Shella z różnymi propozycjami ciągów odstępów. Dla różnych ciągów odstępów (m. in. Pratt, Knuth, Sedgewick) zweryfikować, poprzez eksperymenty numeryczne, rzędy złożoności obliczeniowej podane na stronie Wikipedii. –3– Informatyka niestacjonarna, 2 st., semestr 3 rok akad. 2016/2017 Maszyna Turinga – złożoność obliczeniowa W poniższych zadaniach podać realizacje algorytmów w postaci Maszyny Turinga oraz określić złożoności obliczeniowe dokładne i asymptotyczne. Instrukcją podstawową jest odczytanie przez głowicę symbolu z taśmy. 1. Dany jest język L={an bn; nN} a) Podać Maszynę Turinga rozstrzygającą przynależność słowa w do języka L. Określić złożoność obliczeniową realizowanego algorytmu. b) Podać ulepszoną wersję MT. Przeszukiwanie liniowe taśmy zastąpić przeszukiwaniem logarytmicznym; określić złożoność obliczeniową c) Podać dwutaśmową MT rozstrzygającą przynależność słowa w do języka L. Jak zmieniła się złożoność obliczeniowa. d) Podać algorytm sprawdzający przynależność w do L zrealizowany w języku C. Określić złożoność obliczeniową, obierając za instrukcję podstawową instrukcję podstawienia. Dla klasycznych Maszyn Turinga przetestować ich działanie oraz złożoność obliczeniową na symulatorze. 2. 3. Podać Maszynę Turinga przenoszącą łańcuch symboli wejściowych (={0,1}) w inne miejsce taśmy. Miejsce źródłowe i docelowe ograniczone są z lewej strony znakiem „*”. Maszyna rozpoczyna działanie z głowicą czytającą wskazując na „*” rozpoczynającą ciąg źródłowy. Ciąg kończy się znakiem pustym B lub „*” określającą miejsce docelowe przenoszonego ciągu. Wyznaczyć złożoność obliczeniową podanej MT. ... B * 0 1 1 0 1 1 1 0 B B B B * B B B B B B B B B ... ... B * B B B B B B B B B B B B * 0 1 1 0 1 1 1 0 B ... Zdefiniować Maszynę Turinga generującą na taśmie tyle symboli „1” ile wynosi a) suma b) iloczyn ilości wystąpień dwóch ciągów symboli „0”. Na początku na taśmie znajduje się ciąg n m n+m „*0 *0 *”, a po wykonaniu algorytmu ciąg „*1 *” w przypadku sumy, a w przypadku n m iloczynu ciąg „*1 *”. Określić złożoność obliczeniową algorytmu MT. Poniższy rysunek przedstawia przykładową taśmę MT przed i po wykonaniu algorytmu dla przypadku iloczynu. ... B * 0 0 0 * 0 0 0 0 0 * B B B B B B B B B B B B ... –4– Informatyka niestacjonarna, 2 st., semestr 3 ... B * rok akad. 2016/2017 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * B B B B B B ... 4. Zdefiniować Maszynę Turinga, która dla ciągu wejściowego składającego się z symboli „a”, „b” i „c” podaje, których symboli jest najwięcej. Jaka jest złożoność obliczeniowa realizacji tej MT? 5. Podać Maszynę Turinga, która dla ciągu wejściowego składającego się z symboli „a” i „b” przenosi te symbole tak, aby na taśmie najpierw umieszczone były wszystkie symbole „a”, a po nich wszystkie symbole „b”. Wyznaczyć złożoność obliczeniową tej MT. 6. Podać Maszynę Turinga umieszczającą na taśmie ciąg składający się z coraz większej ilości symboli „1” rozdzielanych symbolem „0”, czyli ciąg: „10110111011110111110111111…”. Maksymalna liczba symboli „1” określona jest przez liczbę znajdującą się na taśmie. Wyznaczyć złożoność obliczeniową podanej MT. ... B * 7 * B B B B B B B B B B B B B B B B B B B B ... ... B * 7 * 1 0 1 1 0 1 1 1 0 ... 0 1 1 1 1 1 1 1 * B ... –5–