Analiza algorytmów zadania podstawowe 15 stycznia 2019 Zadanie 1 Zliczanie Zliczaj(n) 1 r 0 2 for i 1 to n 1 3 do for j i + 1 to n 4 do for k 1 to j 5 do r r + 1 6 return r P Jaka wartość zostanie zwrócona przez powyższą funkcję? Wyraź odpowiedź jako funkcję zmiennej n. Zadanie 2 Poniższy algorytm wyznacza yz, gdzie y, z N. Mnożenie Mnóż(y, z) 1 x 0 2 while z > 0 3 do if z mod 2 = 1 4 then x x + y 5 y 2 y 6 z z/2 7 return x P Określ ile razy zostanie wykonane dodawanie (instrukcja w wierszu 4) w przypadku pesymistycznym. Zadanie 3 Poniższy algorytm wyznacza y z, gdzie y R, z N. Potęgowanie powolne Potęga(y, z) 1 x 1 2 while z > 0 3 do x x y 4 z z 1 5 return x P Określ ile razy zostanie wykonane mnożenie (instrukcja w wierszu 3) w przypadku pesymistycznym. 1
Zadanie 4 Poniższy algorytm wyznacza y z, gdzie y R, z N. Potęgowanie szybkie Potęga(y, z) 1 x 1 2 while z > 0 3 do if odd(z) 4 then x x y 5 z z/2 6 y y 2 7 return x P Określ ile razy zostanie wykonane mnożenie (instrukcja w wierszu 4) w przypadku pesymistycznym. Zadanie 5 Dzielenie Poniższy algorytm wyznacza q, r N takie, że y = qz + r oraz r < z, gdzie y, z N. Dziel(y, z) 1 r y 2 q 0 3 w z 4 while w y 5 do w 2w 6 while w > z 7 do q 2q 8 w w/2 9 if w r 10 then r r w 11 q q + 1 12 return (q, r) P Określ ile razy zostanie wykonane odejmowanie (instrukcja w wierszu 10) w przypadku pesymistycznym. Zadanie 6 Schemat Hornera Poniższy algorytm wyznacza wartość wielomianu a n x n +a n 1 x n 1 + +a 1 x+a 0 w punkcie x. Znaczy to, że zwracana jest wartość n i=1 A[i] x i, zakładając, że w tablicy A[0..n] przechowywane są współczynniki a i = A[i] dla wszystkich 0 i n. Nazwa algorytmu pochodzi od nazwiska jego autora Williama G. Hornera. Horner(A, n, x) 1 v 0 2 for i n downto 0 3 do v A[i] + v x 4 return v P Jaka jest jego złożoność obliczeniowa? 2
Zadanie 7 Poniższy algorytm wyznacza n!, gdzie n N. Silnia Silnia(n) 1 x 1 2 while n > 1 3 do x x n 4 n n 1 5 return x P Określ ile razy zostanie wykonane mnożenie (instrukcja w wierszu 3). Zadanie 8 Maksimum Załóżmy, że w tablicy A[1..n] rozmieszczono n różnych liczb w sposób losowy. Poniższy algorytm znajduje największą z nich. Max(A, n) 1 m A[1] 2 for i 2 to n 3 do if A[i] > m 4 then m A[i] 5 return m P Określ ile razy zostaną wykonane instrukcje przypisania (instrukcja w wierszu 1 i instrukcja w wierszu 4) w przypadku optymistycznym, pesymistycznym i średnim. P Dana jest tablica A[1..n] zawierająca n liczb. Zaprojektuj algorytm sprawdzający, czy w tablicy A są dwie liczby dające w sumie wartość x, a następnie określ jego złożoność obliczeniową. Zadanie 9 Para elementów Zadanie 10 Poniższy algorytm sortuje elementy tablicy A[1..n]. Sortowanie bąbelkowe Bubble-Sort(A, n) 1 for i 1 to n 1 2 do for j 1 to n i 3 do if A[j] > A[j + 1] 4 then zamień A[j] z A[j + 1] P Określ ile razy zostaną porównane elementy tablicy (instrukcja warunkowa w wierszu 3). 3
Zadanie 11 Dopasowanie wzorca Dane są łańcuch S[1..n] i wzorzec P [0.. m 1], gdzie 1 m n. Poniższy algorytm wyznacza pozycję l występowania wzorca P w łańcuchu S, tzn. l = p jeśli S[p.. p+m 1] = P, a l = n m + 1 jeśli wzorzec P nie jest podciągiem S. Dopasuj(P, S, m, n) 1 l 0 2 dopasowano false 3 while l n m dopasowano 4 do l l + 1 5 r 0 6 dopasowano true 7 while r < m dopasowano 8 do dopasowano (P [r] = S[l + r]) 9 r r + 1 10 return l P Ile porównań symboli łańcucha i wzorca (instrukcji w wierszu 8) wykonuje powyższy algorytm w przypadku pesymistycznym? Zadanie 12 Rekurencja G(n) 1 if n 1 2 then return n 3 else return 5 G(n 1) 6 G(n 2) P Wykaż, że powyższy algorytm zwraca wartość 3 n 2 n dla wszystkich n 0 (n N). P Pokaż, że algorytm ten działa w czasie O(2 n ). Zadanie 13 Poniższy algorytm wyznacza yz, gdzie y, z N. Mnóż(y, z) 1 if z = 0 2 then return 0 3 else if odd(z) 4 then return Mnóż(2 y, z/2 ) + y 5 else return Mnóż(2 y, z/2 ) P Jaka jest jego złożoność obliczeniowa? Mnożenie rekurencyjne 4
Zadanie 14 G(n) 1 if n = 0 n = 1 2 then return 3 n 3 else return G(n 1) + 2 G(n 2) Jeszcze raz rekurencja P Wykaż, że powyższy algorytm zwraca wartość 2 n ( 1) n dla wszystkich n 0 (n N). P Jaka jest jego złożoność obliczeniowa? Zadanie 15 Sortowanie przez proste wybieranie Sortowanie przez proste wybieranie odbywa się w następujący sposób: trzeba wyznaczyć najmniejszy element w tablicy, zamienić go miejscami z pierwszym elementem, wyznaczyć najmniejszy element w A[2..n] i zamienić go z drugim elementem itd., aż cała tablica zostanie posortowana. Selection-Sort(A, n) 1 for i 1 to n 1 2 do m i 3 for j i + 1 to n 4 do if A[j] < A[m] 5 then m j 6 zamień A[m] z A[i] P Określ złożoność obliczeniową tej metody sortowania. Zadanie 16 Optymalny podział Załóżmy, że pewien algorytm wykonuje m 2 kroków dla m-elementowej tablicy (dla dowolnego m 1). Algorytm ten ma być użyty do tablic A 1 i A 2. Tablice zawierają łączną liczbę n elementów. A 1 ma k elementów, a A 2 ma n k elementów (0 k n). P Dla jakiej wartości k obliczenia będą trwały najkrócej? Uzasadnij swoją odpowiedź. Zadanie 17 Sortowanie przez proste wstawianie Sortowanie tablicy A[1..n] przez proste wstawianie odbywa się w następujący sposób: niech x będzie elementem drugim, potem trzecim itd., aż do ostatniego (n). Elementy stojące po lewej stronie x są już uporządkowane i należy x wstawić w odpowiednie miejsce w ciągu A[1..j], gdzie x = A[j]. Insertion-Sort(A, n) 1 for j 2 to n 2 do x A[j] 3 i j 1 4 while i > 0 A[i] > x 5 do A[i + 1] A[i] 6 i i 1 7 A[i + 1] x P Określ złożoność obliczeniową tej metody sortowania. 5
Zadanie 18 Wyszukiwanie binarne Dana jest posortowana, n-elementowa tablica A oraz wartość v. Poniższy algorytm jako wynik działania podaje indeks p taki, że v = A[p] lub nil jeśli v A. Zakładamy, że wywołano go z parametrami Szukaj(A, 1, n, v). Szukaj(A, p, r, v) 1 if p < r 2 then q (p + r 1)/2 3 if v A[q] 4 then return Szukaj(A, p, q, v) 5 else return Szukaj(A, q + 1, r, v) 6 else if v = A[p] 7 then return p 8 else return nil P Wykaż, że algorytm ten dokonuje logarytmicznej liczby porównań. P Skonstruuj algorytm sprawdzania, czy dany tekst zaczyna się słowem postaci ww. Następnie określ optymistyczną i pesymistyczną złożoność obliczeniową tego algorytmu. Zadanie 19 Powtórzenie słowa P Niech A[1..n] będzie posortowaną tablicą parami różnych liczb całkowitych. Zaprojektuj algorytm działający na zasadzie dziel i zwyciężaj, który znajduje indeks i taki, że A[i] = i (jeśli takowy istnieje) i działa w czasie O(log n). Zadanie 20 Indeks równy elementowi Zadanie 21 Rozważmy następujący algorytm sortowania. Nieefektywne sortowanie Stooge-Sort(A, i, j) 1 if A[i] > A[j] 2 then zamień A[i] z A[j] 3 if i + 1 j 4 then return 5 k (j i + 1)/3 6 Stooge-Sort(A, i, j k) // pierwsze dwie trzecie tablicy 7 Stooge-Sort(A, i + k, j) // ostatnie dwie trzecie tablicy 8 Stooge-Sort(A, i, j k) // znowu pierwsze dwie trzecie P Jaki jest czas działania tego algorytmu dla tablicy długości n, tj. przy wywołaniu: Stooge-Sort(A, 1, n)? 6
Zadanie 22 Sortowanie przez scalanie Scalanie (ang. merge) dwóch części tablicy (A[p..q] i A[q + 1.. r]) z których każda jest posortowana polega na przepisaniu ich do pomocniczej tablicy w odpowiedniej kolejności, a następnie z powrotem do właściwej tablicy, gdzie będą już posortowane. Na przykład tablica A = [10, 11, 13, 16, 9, 12, 14, 15] składa się z dwóch posortowanych części: A[1..4] i A[5..8]. Ich scalenie odbywa się następująco (B jest pomocniczą tablicą): porównaj A[1] z A[5] i wpisz mniejszą wartość, czyli 9, do B[1]; następnie porównaj A[1] z A[6] i wpisz mniejszą wartość, czyli 10, do B[2]; następnie porównaj A[2] z A[6] i wpisz mniejszą wartość, czyli 11, do B[3] itd., aż wszystkie elementy od 1 do 8 zostaną wpisane do tablicy B; na końcu przepisz elementy z tablicy B = [9, 10, 11, 12, 13, 14, 15, 16] z powrotem do A. Poniżej przedstawiono algorytm sortujący tablicę A od elementu p do elementu r z wykorzystaniem scalania. Merge-Sort(A, p, r) 1 if p < r 2 then q (p + r)/2 3 Merge-Sort(A, p, q) 4 Merge-Sort(A, q + 1, r) 5 Merge(A, p, q, r) P Jaki jest czas działania procedury Merge(A, p, q, r) dla dwóch tablic o łącznej długości n? P Jaki jest czas działania tego algorytmu dla tablicy długości n, tj. przy wywołaniu: Merge-Sort(A, 1, n)? P Udowodnij metodą indukcji matematycznej, że dla wszystkich liczb naturalnych n N, n 1, poniższe równania są prawdziwe: (a) 1 + 2 + + n = n(n+1) 2, (b) 1 3 + 2 3 + + n 3 = (1 + 2 + + n) 2, (c) 1 2 + 2 2 + + n 2 = n(n+1)(2n+1) 6. Zadanie 23 Równania P Udowodnij metodą indukcji matematycznej, że prawdziwe są następujące nierówności: (a) n! > 2 n dla n 4, (b) 3 n > n 2 + 5 dla n 3, (c) (1 + x) n 1 + nx, jeśli 1 + x > 0, (d) n! > 3 n dla n 7, (e) 2 n > n 2 dla n 5, gdzie n N. Zadanie 24 Nierówności 7
P Udowodnij, że dla wszystkich liczb naturalnych n N następujące równania są prawdziwe: (a) n 1 = 1 1 2 i 2, n i=1 (b) n 2 i = 2 n+1 1, i=0 (c) n i=1 (d) n i=0 1 i(i+1) = n n+1, a i = an+1 1 a 1, (e) n i2 i = (n 1)2 n+1 + 2. i=1 Zadanie 25 Sumy P Rozwiąż następujące równania rekurencyjne: T (0) = 1 (a) T (n) = 2T (n 1) + 1 Zadanie 26 Równania rekurencyjne T (1) = 8 (b) T (n) = 3T (n 1) 15 (c) T (n) = nt (n 1) + n T (0) = 1 (d) T (n) = 2T (n 1) 9 T (1) = 3 (e) T (n) = 6T (n/6) + 3n 1 (f) T (n) = 3T (n 1) + 2 (g) T (n) = 4T (n/3) + n 2 (h) T (n) = 3T (n/2) + n 2 (i) T (n) = 6T (n/6) + 2n + 3 (j) T (n) = 2T (n/2) + 6n 1 T (1) = 2 (k) T (n) = 4T (n/3) + 3n 5 (l) T (n) = 3T (n/2) + n 2 8
P Udowodnij metodą indukcji matematycznej, że: (a) liczba naturalna n 2 n jest podzielna przez 2, (b) liczba naturalna 8 n 1 jest podzielna przez 7, (c) liczba naturalna 13 n 7 jest podzielna przez 6, gdzie n N. Zadanie 27 Podzielność Zadanie 28 Poniższy algorytm sortuje elementy tablicy A[1..n]. Sortowanie bąbelkowe i rekurencja BubbleSort(A, n) 1 if n > 1 2 then for i 1 to n 1 3 do if A[i] > A[i + 1] 4 then zamień (A[i], A[i + 1]) 5 BubbleSort(A, n 1) P Przeanalizuj podany algorytm ze względu na operację dominującą, jaką jest porównanie kluczy znajdujących się w tablicy A[1..n]. P Udowodnij, że algorytm rozwiązujący problem wież Hanoi musi wykonać co najmniej 2 n 1 kroków. Zadanie 29 Wieże Hanoi Zadanie 30 Liczby Fibonacciego Przeanalizuj algorytm wyznaczający liczby Fibonacciego: Fibonacci(n) 1 if n 1 2 then return n 3 else return Fibonacci(n 1) + Fibonacci(n 2) P Ułóż równanie rekurencyjne oraz określ złożoność obliczeniową tego algorytmu. Zadanie 31 Poniższy algorytm wyznacza n!, gdzie n N. Jeszcze raz silnia Silnia(n) 1 if n 1 2 then return 1 3 else return n Silnia(n 1) P Ułóż równanie rekurencyjne oraz określ złożoność obliczeniową tego algorytmu. 9
P Udowodnij metodą indukcji matematycznej, że dla wszystkich liczb naturalnych n N, n 1, poniższe równanie jest prawdziwe: Zadanie 32 Jeszcze raz równanie 1 2 + 2 3 + 3 4 +... + n(n + 1) = n(n + 1)(n + 2). 3 Literatura 1. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Stein Clifford Wprowadzenie do algorytmów 2. Zbigniew J. Czech, Sebastian Deorowicz, Piotr Fabian Algorytmy i struktury danych : wybrane zagadnienia 3. Sanjoy Dasgupta, Christos H. Papadimitriou, Umesh Virkumar Vazirani Algorytmy 4. Ronald E. Graham, Donald E. Knuth, Oren Patashnik Matematyka konkretna 5. Barbara Marszał-Paszek, Piotr Paszek Algorithms and Complexity Theory 6. Ian Parberry, William Gasarch Problems on Algorithms 7. Ian Parberry Lecture Notes on Algorithm Analysis and Computational Complexity 10