Teoria obliczeń: notacja 0, rekurencja

advertisement
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
Download