Teoria obliczeń: notacja 0, rekurencja Wykład 8 Ο(n log n) Σ PRZYPOMINAJKA: Komputerowo „ udowodniliśmy”, że dla n odpowiednio dużego zachodzi: n < n < n log 2 n < n 2 < 2 n < n! < n n log 2 n < Pokażemy: ... ≤ n m 4 n ≤ 3 n ≤ < 2 n dla log 2 n < m n n ≤ n ≤ n 2 ≤ n 3 ≤ n 4 ≤ ... dla n ∈ N n ≥ 4m dla 2 n < n! < n n dla 2 n ≥ (4m 2 ) m n≥4 2 D. Makowiec: Programowanie dla I BioInf 2013-04-15 Notacja asymptotyczna O Niech f(n) i g(n) będą ciągami liczb rzeczywistych. Piszemy f(n) = O(g(n)) wtedy i tylko wtedy, gdy istnieje stała C taka, że f(n) <= C g(n) dla n dostatecznie dużego Jako funkcji mierzących asymptotyczne własności ciągów używa się następujących ciągów: 1, log 2 n , Interesują nas wartości f(n) względem g(n) dla n dużych n , n , n log 2 n , n 2 , 2 n , n! , n n 3 D. Makowiec: Programowanie dla I BioInf 2013-04-15 Notacja asymptotyczna O TW: oto hierarchia znanych ciągów uporządkowanych w ten sposób, że każdy z nich jest O od wszystkich ciągów na prawo od niego : wielomianowa wykładnicza kwadratowa n , 3 n , n , n , n log 2 n , n 2 , n 3 , n 4 ,...., 2 n , n! , n n liniowa 4 logarytmiczna stały 1, log 2 n ,..., Mówimy, że ciąg f(n) rośnie: wielomianowo ( potęgowo), jeśli f(n)= O(nm) logarytmicznie, jeśli f(n)=O(log2 n) wykładniczo, jeśli f(n)= O(2n) 4 D. Makowiec: Programowanie dla I BioInf 2013-04-15 Notacja asymptotyczna O TW 2: (a) Jeśli f(n)=O(g(n)) i c jest stałą, to c f(n)=O(g(n)). (b) Jeśli f(n)=O(g(n)) i h(n)=O(g(n)), to f(n) + h(n)=O(g(n)). (c) Jeśli f(n)=O(a(n)) i g(n)=O(b(n)), to f(n) g(n)=O(a(n) b(n)). (d) Jeśli a(n)=O(b(n)) i b(n)=O(c(n)), to a(n) =O(c(n)). Przykłady: n 2 + 13 n = O ( n 2 ) 3 3 ( n + 1) = O ( n ) n 2 + 13 n + ( n + 1) 3 = O ( n 3 ) ( n 2 + 13 n )( n + 1) 3 = O ( n 5 ) Oszacowanie determinuje jednomian o najwyższy m stopniu 5 D. Makowiec: Programowanie dla I BioInf 2013-04-15 Operator SUMY Ciąg liczb: a1 , a2 ,a3 , ……,ak ,ak+1 ,……,an double a[n]; int b[10]; /* a[0], a[1], a[2],……., a[n-1] Operator sumowania: n ∑a k =1 k „Wysumuj wszystkie wyrazy ciągu ak których indeks zawiera się pomiędzy 1 i n „ zmienna związana ze znakiem sumy 6 D. Makowiec: Programowanie dla I BioInf 2013-04-15 */ Operator SUMY Zadanie: wysumuj kwadraty 10 pierwszych liczb naturalnych 10 10 1 + 2 + ..... + 10 = ∑ k = ∑ n 2 2 2 2 k =1 n =1 9 1 + 2 + ..... + 10 = ∑ (k + 1) 2 2 2 k =0 1 + 2 2 + ..... + 10 2 = ∑k nazwa zmiennej nic nie znaczy poza operatorem sumy możliwe są różne postacie równoważne operacji sumy 2 1≤ k ≤10 Dane: liczby naturalne start=1, postać ciagu ak=k2 Wynik: suma Zmienna pomocnicza: k koniec= 10, suma =0 k=start Dopóki k<=koniec wykonuj ak=k2 suma =suma+ak k=k+1 wyświetl suma 7 D. Makowiec: Programowanie dla I BioInf 2013-04-15 Operator SUMY Uogólniony operator sumowania ∑a Wysumuj wszystkie wyrazy ciągu ak, których indeksy k spełniają warunek P(k) k P (k ) Przykład: ∑k Która postać czytelniejsza? 2 1≤ k <100 k parzyste 2 2 2 + 4 + .... + 98 2 49 2 ( 2 k ) ∑ k =1 Używajmy takiej postaci, która lepiej wyraża intencje obliczenia 8 D. Makowiec: Programowanie dla I BioInf 2013-04-15 Suma jako rekurencja Zauważmy własność operacji sumy: n −1 n ∑a = ∑a k k =1 n k m + an = a1 + ∑ ak = ∑ ak + k =1 k =2 k =1 n ∑a k k = m +1 n Oznaczmy: S ( n) = ∑ ak k =1 Suma jest rekurencją: Każda rekurencja składa się z: 1) warunku początkowego 2) warunku rekurencyjnego S (1) = a1 S (n) = S (n − 1) + an Rekurencyjne rozwiązanie zadania Suma(n; s): dane: liczba n naturalna wynik: liczba s Jeśli n == 1 to s = 1 inaczej Suma(n-1; s’) s = s’+ n*n 9 D. Makowiec: Programowanie dla I BioInf 2013-04-15 „popularna” rekurencja : SILNIA 1 dla n = 1 n!= (n − 1)!n dla n > 1 n n!= 1⋅ 2 ⋅ ..... ⋅ n = ∏ k k =1 Rekurencja to przepis na rozwiązanie zadania przy zadanym argumencie korzystający z rozwiązania tego samego zadania uzyskanego przy argumencie „mniejszym” Algorytm Euklidesa znajdowania największego wspólnego dzielnika Euklides(m, n ; d): Dane: liczby m, n naturalne nie równe jednocześnie 0 Wynik: d=NWD(m, n) jeśli n == 0 to d = m inaczej Euklides( n, m mod n ; d’) d=d’ 10 D. Makowiec: Programowanie dla I BioInf 2013-04-08 SumaCyfr(n; s): Dane: liczba naturalna n Wynik: liczba s suma cyfr Jeśli n < 10 to s = n inaczej s = n mod 10 SumaCyfr( n div 10; s’ ) s = s +s’ int SumaCyfr( int n) { if (n <9) return n; else return n%10+ SumaCyfr(n/10); } 11 D. Makowiec: Programowanie dla I BioInf 2013-04-08