Professional Documents
Culture Documents
Definicja
Złożoność czasowa to liczba operacji podstawowych wykonanych
przez algorytm w czasie jego realizacji, wyrażona jako funkcja rozmiaru
danych.
Oznaczenie
Złożoność czasowa algorytmu A jako funkcja rozmiaru danych n:
lub
f(n)=n
f(n)= log n
c g(n)
f(n)
n0 n
f(n)=O(g(n))
Własność 1 (przechodniość)
Jeśli f(n) jest O(g(n)) i g(n) jest O(h(n)), to f(n) jest O(h(n)).
Własność 2:
Jeśli f(n) jest O(h(n)) i g(n) jest O(h(n)), to f(n)+g(n) jest O(h(n)).
Własność 3:
Funkcja ank jest O(nk).
Własność 4:
Funkcja nk jest O(nk+j) dla dowolnego nieujemnego j.
Własność 5:
Jeśli f(n)=c g(n), to f(n) jest O(g(n))
Własność 6:
Funkcja logan jest O(logbn) dla dowolnych a i b większych niż 1
Własność 7:
logan jest O(log2n) dla dowolnego dodatniego a
Wniosek:
Wszystkie funkcje logarytmiczne (niezależnie od podstawy logarytmu) są
sobie równoważne w sensie O-notacji
Definicja: Ω (g(n))
f(n) jest funkcją o złożoności n ≥ n0 jeżeli istnieją takie
liczby dodatnie c i n0, że dla każdego zachodzi
f(n) ≥ c g(n)
Wniosek Ω (g(n))
O(f(n))
Funkcja f(n) ma złożoność wtedy i tylko wtedy,
gdy g(n) ma złożoność
Interpretacja:
Ω(g(n)) = { f(n): istnieją dodatnie liczby c i n0 takie, że
dla każdego n ≥ n0 zachodzi 0 ≤ c
g(n) ≤ f(n) }
Piszemy: f(n) ∈ Ω(g(n)) lub częściej f(n) = Ω(g(n))
f(n)
c g(n)
n0 n
f(n)=Ω(g(n))
Definicja
Θ (g(n))
f(n) jest funkcją o złożoności jeżeli istnieją liczby
n≥n
dodatnie c1, c2 i n0 takie, że dla każdego
0 zachodzi
Wniosek
Θ (g(n))
Funkcja f(n) ma złożoność wtedy i tylko wtedy,
O(g(n))
gdy f(n) ma złożoność Ω (g(n))
i f(n) ma złożoność
Interpretacja:
Θ(g(n)) = { f(n): istnieją dodatnie liczby c1, c2 i n0 takie, że
dla każdego n ≥ n0 zachodzi 0 ≤ c1 g(n) ≤
f(n) ≤ c2 g(n) }
Piszemy: f(n) ∈ Θ(g(n)) lub częściej f(n) = Θ(g(n))
c2 g(n) f(n)
c1 g(n)
n0 n
f(n)=Θ(g(n))
n0 n n0 n
f(n)=O(g(n)) f(n)=Ω(g(n))
c2 g(n) f(n)
c1 g(n)
n0 n
f(n)=Θ(g(n))
Algorytmy i struktury danych 23
Notacja asymptotyczna -
podsumowanie
Niech f , g : N → R+.
czas T(A,n) lg n n n lg n n2 n3 2n
1s 2 1000000 106 63*103 103 102 19
1 godz. 36*108 13* 107 60* 103 15* 102 31
s5 s
Dla komputera 1: T( A, s5 ) = 2 =t Zatem: t = 10 ⋅ 2 5
s5
t = 2x
Dla komputera 2: T( A, s5 ) = 2 = t / 10 2 = 10 ⋅ 2
x s5
Przykład 1
Pojedyncza pętla wyznaczająca sumę elementów wektora
for (i=sum=0; i<n; i++)
sum=sum+ a[i];
• liczba przypisań w całej pętli: 2+2n
• zatem złożoność czasowa: T(n)=O(n)
Przykład 2
Pętla podwójna wyznaczająca sumę elementów tablicy
for (i=0; i<n; i++) {
for (j=1, sum=a[0]; j<=i; j++)
sum=sum+ a[j];
printf(„\n Suma podtablicy %d” , sum)
}
Θ(1) dla n ≤ c
T(n) =
aT(n/b) + D(n) + C(n) dla n > c
Θ(1) dla n = 1
T(n) =
2T(n/2) + Θ(1) + Θ(n) dla n > 1
Metoda podstawiania:
Polega na odgadnięciu postaci rozwiązania, a następnie wykazaniu przez
indukcję, że jest ono poprawne.
Trzeba także znaleźć wartości odpowiednich stałych.
Metoda jest bardzo skuteczna, ale może być stosowana tylko w przypadkach,
kiedy można przewidzieć postać rozwiązania.
Metoda iteracyjna
Polega na rozwijaniu (iterowaniu) rekurencji i wyrażanie jej jako sumy
składników zależnych tylko od warunków brzegowych.
Następnie mogą być użyte techniki sumowania do oszacowania rozwiązania.
Rozwinięcie rekurencji
Jest uproszczoną wersją metody iteracyjnej
Polega na:
rozpisaniu równania rekurencyjnego dla kolejnych wartości n,
dodaniu otrzymanych równań stronami,
zredukowaniu jednakowych wyrazów i przekształceniu otrzymanej
zależności tak, aby uzyskać jawną zależność funkcji T(n) od n
int Silnia(int n) {
if (n==0)
return 1;
else
return n*silnia(n-1);
} Czas wykonania jednej instrukcji
porównania wartości (ogólnie: Θ(1)
dodajemy stronami
T ( n ) + T ( n − 1 ) + ... + T (1 ) + T ( 0 ) = n + 1 + T ( n − 1 ) + ... + T (1 ) + T ( 0 )
Zatem:
T(n)= n+1=O(n)
Algorytmy i struktury danych 42
Metoda iteracyjna
Przykład 2:
Postać rekurencji: T(n) = 3T(n/4) + n
Iterujemy: T(n) = n + 3T(n/4) =
= n + 3[n/4 +3T(n/16)] =
= n + 3 n/4 + 9T( n/16) =
= n + 3 n/4 + 9[ n/16 + 3T(n/16)] =
= n + 3 n/4 + 9 n/16 + 27 T(n/64) = ...
Iterujemy tak długo, aż osiągniemy warunki brzegowe:
i-ty składnik w ciągu wynosi 3i n/4i
Iterowanie kończymy, gdy n = 1 lub gdy n/4i = 1, czyli i > log4 n
n 2 n 3 n n 3 3 2
T(n) ≤ n + 3 + 3 2 + 3 3 + ... + 3 log4n
log4n
= n(1 + + ( ) + ...) = Θ(n)
4 4 4 4 4 4
Algorytmy i struktury danych 43
Metoda drzewa
rekursji
n2 n2 n2
T(n) = Θ(n2)
Algorytmy i struktury danych 45
Drzewo rekursji
Przykład 2 T(n) = T(n/3) + T(2n/3) + n
log3/2n
n
n
n
(n/3) (2n/3)
n
(n/9) (2n/9) (2n/9) (4n/9)
Przykład 2
Określić oszacowanie asymptotyczne dla rekurencji:
T(n) = T(2n/3) + 1
log3 1
Mamy: a=1, b=3/2, f(n)=1, a zatem n logb a
=n 2
= n0 = 1
log3 1
Stosujemy przypadek 2, gdyż f (n) = Θ(nlogb a ) = Θ(n 2
) = Θ(n0 ) = Θ(1)
a zatem rozwiązaniem rekurencji jest
log3 1
T(n) = Θ(n logb a
log n) = Θ(n 2
log n) = Θ(log n)
Przykład 4
Określić oszacowanie asymptotyczne dla rekurencji:
T(n) = 2T(n/2) + n log n