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 in, jm (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; nN}
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–