Aisd W02

  • Uploaded by: api-26356906
  • 0
  • 0
  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Aisd W02 as PDF for free.

More details

  • Words: 3,850
  • Pages: 56
Złożoność obliczeniowa algorytmów

 Złożoność obliczeniowa - miara służąca do porównywania efektywności algorytmów. Mamy dwa zasadnicze kryteria efektywności: czas i pamięć.  Do oceny efektywności stosujemy jednostki logiczne, wyrażające związek miedzy rozmiarem danych n (np. wielkość pliku lub tablicy) a ilością czasu T potrzebną na ich przetworzenie.

Algorytmy i struktury danych

1

Rodzaje złożoności obliczeniowej algorytmów  Złożoność pamięciowa - wyrażana w skali zajętości pamięci (PAO, pamięci zewnętrznej), niezbędnej dla realizacji algorytmu  Złożoność czasowa - wyrażana w skali czasu wykonania algorytmu (liczba kroków, czas rzeczywisty)  Na ogół (obecnie) złożoność czasowa jest ważniejsza od złożoności pamięciowej

Algorytmy i struktury danych

2

Czynniki wpływające na czas wykonania programu  Rozmiar danych wejściowych algorytmu  Jakość kodu wynikowego generowanego przez kompilator (język kodu źródłowego)  Architektura i szybkość komputera, na którym program jest wykonywany  Efektywność wykorzystanego algorytmu (jego złożoność czasowa)

Algorytmy i struktury danych

3

Złożoność czasowa algorytmu  Do oszacowania czasu realizacji algorytmu nie powinno się używać zwykłych jednostek czasu  Zamiast tego powinny być stosowane jednostki logiczne, określające związek między rozmiarem danych wejściowych a czasem potrzebnym na ich przetworzenie  Czas wykonywania algorytmu, gdy rozmiar danych wejściowych wynosi n, będziemy oznaczać przez T(n)  Funkcje opisujące związek między T(n) a n mogą być bardzo złożone; w praktyce upraszczamy je, pozostawiając składowe mające największy wpływ na wartości czasu T(n)

Algorytmy i struktury danych

4

Złożoność czasowa algorytmu

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

Algorytmy i struktury danych

5

Przykład

 Niech zależność czasu realizacji algorytmu od rozmiaru danych wejściowych opisuje funkcja f(n) = n2 + 100n + log10 n + 1000

Algorytmy i struktury danych

6

Porównanie szybkości wzrostu funkcji f(n)

f(n) = n2 f(n) = 2n f(n)=n

f(n)= log n n

Algorytmy i struktury danych

7

bkość wzrostu poszczególnych składników funk

Funkcja: f(n) = n2 + 100*n + log10 n + 1000 n

f(n)

n2

100*n

log10 n

1000

1 1 101 0.1% 9% 0.0 % 91% 10 2 101 4.8% 48% 0.05% 48% 100 21 002 48% 48% 0.001% 4.8% 103 1 101 003 91% 9% 0.0003% 0.09% 104 99% 1% 0.0% 0.001% 105 99,9% 0.1% 0.0% 0.0000% Dla dużych wartości n składnikiem dominującym jest n2, tzn. funkcja rośnie jak n2; pozostałe składniki mogą być pominięte; n – ilość wykonywanych operacji Algorytmy i struktury danych

8

symptotyczna złożoność obliczeniowa

 Funkcja wyrażająca zależność miedzy n a T jest zwykle bardzo skomplikowana, a jej dokładne obliczenie ma znaczenie jedynie w odniesieniu do specyficznych problemów  Przybliżoną miarą efektywności najczęściej stosowaną w praktyce jest tzw. asymptotyczna złożoność obliczeniowa.

Algorytmy i struktury danych

9

O-notacja ■







Definicja: Funkcja f(n) jest funkcją o złożoności O(g(n)), jeżeli istnieją takie liczby dodatnie c i no ,n ≥ żen0dla każdego zachodzi f(n) ≤ c g(n) Zgodnie z powyższą definicją, związek między funkcjami f i g można wyrazić stwierdzając, że g(n) jest kresem górnym dla f(n) Uwaga: powyższa definicja nie daje żadnych wskazówek co do tego, jak wyznaczyć stałe c i n0 (takich par może być wiele) Interpretacja:

O(g(n)) = { f(n): istnieją dodatnie liczby c i n0 takie, że dla każdego n ≥ n0 zachodzi 0 ≤ f(n) ≤ c Algorytmy i struktury danych

10

O-notacja – ilustracja graficzna

c g(n) f(n)

n0

n

f(n)=O(g(n))

Algorytmy i struktury danych

11

Przykład ■

Niech zależność czasu realizacji algorytmu od rozmiaru danych wejściowych n opisuje funkcja f(n) = n2 + 100n + log n + 1000



Wówczas, wykorzystując O-notację, można napisać, że n2 + 100n + log n + 1000 ∈ O(n2 )

■ ■



Zatem, dla badanej funkcji T(n) = n2 Tak określona złożoność czasową algorytmu nazywa się asymptotyczną złożonością czasową W praktyce wykorzystuje się także pojęcia optymistycznej, pesymistycznej oraz średniej złożoności czasowej algorytmu

Algorytmy i struktury danych

12

Własności O-notacji 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. Z powyższych własności wynika, ze dowolny wielomian jest „wielkie O” dla n podniesionego do najwyższej w nim potęgi, czyli f(n) = aknk + ak-1 nk-1 + ... + a1n +a0 jest O(nk) (jest też oczywiście O(nk+j) dla dowolnego nieujemnego j). Algorytmy i struktury danych

13

Własności O-notacji (cd.) 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

Algorytmy i struktury danych

14

Własności O-notacji (cd.) Własność 8 (reguła sumy) Jeśli T1(n)=O(f(n)) i T2(n)=O(g(n)) są czasami wykonywania dwóch fragmentów algorytmu, to łączny czas wykonania obydwu fragmentów wynosi: T1(n) +T2(n) = O(max{ f(n)), O(g(n)})

Własność 9 (reguła iloczynu) Niech T1(n)=O(f(n)) i T2(n)=O(g(n)) są czasami wykonywania dwóch fragmentów algorytmu. Wówczas: T1(n) ⋅T2(n) = O(f(n)) ⋅ O(g(n))

Algorytmy i struktury danych

15

Własności O-notacji

 Jedną z najważniejszych funkcji przy ocenianiu efektywności algorytmów jest funkcja logarytmiczna.  Jeżeli można wykazać, że złożoność algorytmu jest rzędu logarytmicznego, algorytm można traktować jako bardzo dobry.  Istnieje wiele funkcji lepszych w tym sensie niż logarytmiczna, jednak zaledwie kilka spośród nich, jak O(log2 log2 n) czy O(1) ma praktyczne znaczenie.

Algorytmy i struktury danych

16

Ω - notacja  O-notacja dotyczy kresu górnego funkcji  Istnieje symetryczna definicja kresu dolnego w postaci Ω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)

Ω (g(n))  Wniosek O(f(n)) Funkcja f(n) ma złożoność gdy g(n) ma złożoność

Algorytmy i struktury danych

wtedy i tylko wtedy,

17

Ω - notacja



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))

Algorytmy i struktury danych

18

Ω-notacja – ilustracja graficzna

f(n) c g(n)

n0

n

f(n)=Ω(g(n))

Algorytmy i struktury danych

19

Θ - notacja  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 zachodzi 0

c1 g(n) ≤ f(n) ≤ c2 g(n)  Wniosek Θ (g(n)) Funkcja f(n) ma złożoność wtedy i tylko wtedy, O(g(n)) Ω (g(n)) gdy f(n) ma złożoność i f(n) ma złożoność

Algorytmy i struktury danych

20

Θ - notacja

 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))

Algorytmy i struktury danych

21

Θ-notacja – ilustracja graficzna

c2 g(n)

f(n) c1 g(n)

n0

n f(n)=Θ(g(n))

Algorytmy i struktury danych

22

O-notacja, Ω-notacja, Θ-notacja – porównanie c g(n) f(n)

f(n) c g(n)

n0

n

n0 f(n)=Ω(g(n))

f(n)=O(g(n)) c2 g(n)

n

f(n) c1 g(n)

n0 Algorytmy i struktury danych

n f(n)=Θ(g(n)) 23

Notacja asymptotyczna podsumowanie Niech f , g : N → R+. Mówimy, że funkcja f jest co najwyżej rzędu g, jeśli (∃c>0, ∃no∈N) ∀n>no f(n) ≤ c g(n)

f = O (g )

Mówimy, że funkcja f jest co najmniej rzędu g, jeśli (∃c>0, ∃no∈N) ∀n>no c g(n) ≤ f(n)

f = Ω (g )

Mówimy, że funkcja f jest rzędu g, jeśli (∃c1>0, c2>0, ∃no∈N) ∀n>no c1 g(n) ≤ f(n) ≤ c2 g(n)

f = Θ (g )

Algorytmy i struktury danych

24

Porównanie szybkości wzrostu funkcji Mówimy, że algorytm A ma złożoność czasową:  logarytmiczną

jeśli

T(A, n) = Θ(log n)

 liniową

jeśli

T(A, n) = Θ(n)

 kwadratową

jeśli

T(A, n) = Θ(n2)

 wielomianową

jeśli

T(A, n) = Θ(nα)

 wykładniczą

jeśli

T(A, n) = Θ(an) a ∈ R+

Algorytmy i struktury danych

α ∈N

25

Porównywanie rzędów funkcji Przykład 1 Niech f(n)=100n, g(n)= 2n+100, h(n) = 0.1 n2 +n Mamy: f = O(n), f =Ω (n), g = O(n) ale także g = O(n2), g = Θ(n) h = O(n2), h ≠O(n), h = Ω (n) Lemat (o porównywaniu rzędów funkcji) Niech

lim n→∞ f(n)/g(n) = c. Wówczas:

1. Jeżeli c ≠ 0 to f i g są tego samego rzędu.

Przykład 2 f(n) = 0,3 n3 + 10n + 100 g(n)= n3 h(n) = log n

2. Jeżeli c = 0, to f = O(g) oraz f ≠ Ω (g).

lim n→∞ f(n)/g(n)= 0,3

3. Jeżeli c =+∞, to f ma rząd większy niż g,

Zatem f = g = Θ(n3)

g = O(f) i g ≠ Ω (f).

lim n→∞ f(n)/h(n) = +∞ Zatem h = O(f) = O(n3), h ≠ Ω(f).

Algorytmy i struktury danych

26

Złożoność a rozmiar i czas Ile czasu potrzeba na rozwiązanie zadania o ustalonym rozmiarze i złożoności? T(A,n)

lg n

n

n lg n

n2

n3

2n

n=102

6.6µs

0.1ms

0.6ms

10ms

1s

106lat

n= 104

13.3 µs

10ms

0.1s

100s

11dni

10100lat

wymiar

Jaki jest maksymalny rozmiar problemu n, który można rozwiązać w ustalonym czasie, znając złożoność algorytmu? czas

T(A,n)

1s 1 godz. Algorytmy i struktury danych

lg n

n

n lg n

n2

n3

2n

2 1000000

106

63*103

103

102

19

36*108 13* 107 60* 103 15* 102

31 27

Czy szybkość może przezwyciężyć złożoność?  Mamy 5 algorytmów A1, A2, A3, A4, A5 rozwiązujących ten sam problem. Niech si oznacza maksymalny rozmiar problemu, który można rozwiązać na komputerze 1 przy pomocy algorytmu Ai w ustalonym czasie t.  Jaki jest maksymalny rozmiar problemu, który można rozwiązać w tym samym czasie t na komputerze 2, który jest 10 razy szybszy? Komputer 1

lg n s1

n s2

n2 s3

n3 s4

2n s5

Komputer 2

s110

10*s2

√10*s3

2*s4

3,2 + s5

Dla komputera 1: T( A, s5 ) = 2

s5

=t

s5

= t / 10

Dla komputera 2: T( A, s5 ) = 2

Szukamy takiego x, że T( A, x ) = t Algorytmy i struktury danych

Zatem:

s

t = 10 ⋅ 2 5 t = 2x s5 x 2 = 10 ⋅ 2

czyli x = 3,2 + s5 28

Wpływ dziesięciokrotnego przyspieszenia komputera na wzrost rozmiaru zadania

Złożoność czasowa T(n)

Komputer oryginalny

Komputer dziesięciokrotn ie szybszy

100n

10

100

Względny przyrost rozmiaru problemu 10,0

5n2

14

45

3,2

n3/2

12

27

2,3

2n

10

13

1,3

Algorytmy i struktury danych

29

Wyznaczanie złożoności czasowej przykłady Przykład 1 Pojedyncza pętla wyznaczająca sumę elementów wektora for (i=sum=0; i
Algorytmy i struktury danych

30

Wyznaczanie złożoności czasowej przykłady Przykład 2 Pętla podwójna wyznaczająca sumę elementów tablicy for (i=0; i
• liczba przypisań w całej pętli: n −1

1 + 3 n + 2 ∑ i = 1 + 3 n + 2(1 + 2 + ... + n − 1 ) = 1 + 3 n + n( n − 1 ) = O( n 2 ) i =1

• zatem złożoność czasowa: T(n)=O(n2) Algorytmy i struktury danych

31

Wyznaczanie złożoności czasowej przykłady Przykład 3 Zerowanie elementów tablicy leżących na i pod główną przekątną int tab[n][n]; void zerowanie(); Złożoność czasowa (z uwagi na wszystkie instrukcje): { int i,j; T(n) = i=0; // 1 n −1 i n −1 while (i


Algorytmy i struktury danych





32

Złożoność czasowa algorytmów rekurencyjnych  Kiedy algorytm zawiera rekurencyjne wywołanie samego siebie, jego czas działania można często opisać zależnością rekurencyjną (rekurencją), wyrażającą czas dla podproblemów rozmiaru n za pomocą czasu dla podproblemów mniejszych rozmiarów.  Możemy wiec użyć narzędzi matematycznych aby rozwiązać rekurencję i w ten sposób otrzymać oszacowania czasu działania algorytmu.

Algorytmy i struktury danych

33

urencja dla algorytmu typu “dziel i zwycieżaj”  Rekurencja odpowiadającą czasowi działania algorytmu typu “dziel i zwyciężaj” opiera się na podziale jednego poziomu rekursji na trzy etapy  Niech T(n) będzie czasem działania dla jednego problemu rozmiaru n  Jeśli rozmiar problemu jest odpowiednio mały, powiedzmy n ≤ c dla pewnej stałej c, to jego rozwiązanie zajmuje stały czas, co zapiszemy jako Θ(1)  Załóżmy ze dzielimy problem rozmiaru n na a podproblemów, każdy rozmiaru n/b  Jeśli D(n) jest czasem dzielenia problemu na podproblemy, a C(n) czasem scalania rozwiązań poszczególnych podproblemów w pełne rozwiązanie wyjściowego problemu, to otrzymujemy rekurencję

Θ(1)  T(n) =  aT(n/b) + D(n) + C(n) Algorytmy i struktury danych

dla n ≤ c dla n > c 34

urencja dla algorytmu typu “dziel i zwycieżaj”

Przykład: algorytm sortowania przez scalanie  dziel: znajdujemy środek przedziału, zajmuje to czas stały D(n)=Θ(1)  zwyciężaj: rozwiązujemy rekurencyjnie dwa podproblemy, każdy rozmiaru n/2, co daje czas działania 2 T(n/2)  połącz: działa w czasie Θ(n), a wiec C(n)= Θ(n).  Ostatecznie

Θ(1)  T(n) =  2T(n/2) + Θ(1) + Θ(n)

dla n = 1 dla n > 1

 Można pokazać, że rozwiązaniem tej rekurencji jest T(n) = Θ(n log n) Algorytmy i struktury danych

35

Wyznaczanie złożoności czasowej algorytmów rekurencyjnych Metody rozwiązywania rekurencji:

 Metoda podstawiania: zgadujemy oszacowanie, a następnie wykorzystujemy indukcję matematyczną.

 Metoda iteracyjna: przekształcamy rekurencję na sumę (korzystamy z technik ograniczania sum).

 Metoda drzewa rekursji: uzupełniająca metodę podstawiania  Metoda rekurencji uniwersalnej: stosujemy oszacowanie na rekurencje mające postać T(n) = a T(n/b) + f(n), gdzie a≥1, b>1, a f(n) jest daną funkcją.

Algorytmy i struktury danych

36

Wyznaczanie złożoności czasowej algorytmów rekurencyjnych

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.

Algorytmy i struktury danych

37

Metoda podstawiania Oznaczenia:

Przykład:

 a - największa liczba całkowita x taka, że xa

 Postać rekurencji: T(n) = 2T(  n/2 ) + n  Zachodzi: T(1)=1; T(2)=4; T(3)=5, T(4)=6 ...  Przewidywane rozwiązanie: T(n) = O(n lg n), tzn. ∃ c > 0 T(n) ≤ c n lg n  Założenie: dla n = n/2 zachodzi: T( n/2 ) ≤ c n/2 lg ( n/2 )  Indukcja: T(n) ≤ 2[c n/2 lg ( n/2 )] + n ≤ c n lg(n/2) + n = = c n lg n – c n lg 2 + n = c n lg n – cn + n ≤ c n lg n  Zatem, dla c ≥ 1 zachodzi T(n) ≤ c n lg n dlaczego?

 Rozwiązanie T(n) = O(n lg n) jest poprawne dla c ≥ 2 i n ≥ 2

Algorytmy i struktury danych

38

Metoda iteracyjna

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.

Algorytmy i struktury danych

39

Wyznaczanie złożoności czasowej algorytmów rekurencyjnych

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

 Metoda jest skuteczna jedynie w odniesieniu do niektórych postaci rekurencji

Algorytmy i struktury danych

40

Metoda iteracyjna – rozwinięcie rekurencji Przykład 1: funkcja Silnia int Silnia(int n) { if (n==0) return 1; else return n*silnia(n-1); } Złożoność czasowa:

Czas wykonania jednej instrukcji porównania wartości (ogólnie: Θ(1)

1 T(n) =  T(n − 1) + 1

Algorytmy i struktury danych

dla n = 0 dla n ≥ 1 41

Metoda iteracyjna - rozwinięcie rekurencji Przykład 1 (cd.) 1 T(n) =  T(n − 1) + 1

dla n = 0 dla n ≥ 1 =(T)n +−1)n

T(n) = T(n −1) +1 T(n −1) = T(n − 2) +1 ... T(1) = T(0) +1 T(0) = 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 n 3 3 2 log4n 2 n 3 n T(n) ≤ n + 3 + 3 2 + 3 3 + ... + 3 = n(1 + + ( ) + ...) = Θ(n) log4n 4 4 4 4 4 4 Algorytmy i struktury danych

43

Metoda drzewa rekursji

 Drzewo rekursji pozwala w dogodny sposób zilustrować rozwijanie rekurencji, jak również ułatwia stosowanie aparatu algebraicznego, służącego do rozwiązywania tej rekurencji  Szczególnie użyteczne gdy rekurencja opisuje algorytm typu “dziel i zwyciężaj”  Każdy węzeł drzewa reprezentuje czas wykonania podproblemu  Sumując czasy na kolejnych poziomach drzewa otrzymujemy czas łączny  Drzewo rekursji może stanowić pomoc przy odgadywaniu rozwiązania (w metodzie podstawienia)

Algorytmy i struktury danych

44

Drzewo rekursji Przykład 1

T(n) = 2 T(n/2) + n2 n2

n2 T(n/2)

T(n/2)

n2

(n/2)2

T(n/4)

T(n/4)

(n/2)2

T(n/4)

...

n2/2 T(n/4)

n2/4

w sumie: Θ(n2) Zatem, ostateczny wynik:

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/3)

(n/9)

(2n/9)

n

(2n/3)

(2n/9)

wysokość drzewa: log3/2 n Zatem, ostateczny wynik:

n

(4n/9)

w sumie:

n ⋅log3/2 n dlaczego?

T(n) = Θ(n log n ) Algorytmy i struktury danych

46

Metoda rekurencji uniwersalnej

 Metoda rekurencji uniwersalnej podaje “uniwersalny przepis” rozwiązywania równania rekurencyjnego postaci T(n) = a T(n/b) + f(n) gdzie a≥1 i b>1 są stałymi, a f(n) jest funkcją asymptotycznie dodatnią.  Za wartość n/b przyjmujemy najbliższą liczbę całkowitą (mniejszą lub większą od wartości dokładnej) tj. n/b =n/b lub n/b = n/b

Algorytmy i struktury danych

47

Metoda rekurencji uniwersalnej  Rekurencja opisuje czas działania algorytmu, który dzieli problem rozmiaru n na a problemów, każdy rozmiaru n/b, gdzie a i b są dodatnimi stałymi.  Każdy z a problemów składowych jest rozwiązywany rekurencyjnie w czasie T(n/b).  Koszt dzielenia problemu oraz łączenia rezultatów częściowych jest opisany funkcją f(n)

Dowód twierdzenia o rekurencji uniwersalnej: patrz: T.H. Cormen, Ch.E.Leiserson, R.L.Rivest , C Stein: Wprowadzenie do algorytmów Algorytmy i struktury danych

48

Metoda rekurencji uniwersalnej

 Niech a≥1 i b>1 będą stałymi, niech f(n) będzie pewną funkcją i niech T(n) będzie zdefiniowane rekurencyjnie, dla nieujemnych liczb całkowitych: T(n) = a T(n/b) + f(n), gdzie n/b oznacza najbliższą liczbę naturalną (mniejszą lub większą od wartości dokładnej) tj. n/b =n/b lub n/b = n/b  Wtedy funkcja T(n) może być ograniczona asymptotycznie w następujący sposób: 1. Jeśli f (n) = O(nlogb a −ε ) dla pewnej stałej ε>0, to T(n) = Θ(n 2. Jeśli f (n) = Θ(nlogb a ) to T(n) = Θ(n 3. Jeśli f (n) = Ω(n

logb a + ε

logb a

logb a

)

log n)

) dla pewnej stałej ε >0 i jeśli a f(n/b) ≤ c f(n)

dla pewnej stałej c<1 i wszystkich dostatecznie dużych n, to T(n) = Θ(f(n)) Algorytmy i struktury danych

49

Metoda rekurencji uniwersalnej Interpretacja  W każdym z trzech przypadków porównujemy funkcję f(n) log a z funkcją n b  Rozwiązanie rekurencji zależy od większej z tych dwóch funkcji logb a

 Jeśli funkcja n jest

jest większa (Przypadek 1), to rozwiązaniem rekurencji

T(n) = Θ(nlogb a )  Jeśli funkcja f(n) jest większa (Przypadek 3), to rozwiązaniem jest

T(n) = Θ(f(n))

 Jeśli funkcje są tego samego rzędu (Przypadek 2), to rozwiązaniem jest

T(n) = Θ(nlogb a log n) , czyli Algorytmy i struktury danych

T(n) = Θ( f(n) log n) 50

Metoda rekurencji uniwersalnej Przykład 1 Określić oszacowanie asymptotyczne dla rekurencji: T(n) = 9 T(n/3) + n  Mamy: a=9, b=3, f(n)=n, a zatem n

logb a

= nlog3 9 = n2

 Ponieważ f (n) = O(nlog3 9 −ε ) , gdzie ε=1, możemy zastosować przypadek 1 twierdzenia o rekurencji uniwersalnej i wnioskować że rozwiązaniem jest T(n) = Θ( n2 )

Algorytmy i struktury danych

51

Metoda rekurencji uniwersalnej Przykład 2 Określić oszacowanie asymptotyczne dla rekurencji: T(n) = T(2n/3) + 1  Mamy: a=1, b=3/2, f(n)=1, a zatem n

logb a

log3 1

=n

2

= n0 = 1

 Stosujemy przypadek 2, gdyż f (n) = Θ(nlogb a ) = Θ(n a zatem rozwiązaniem rekurencji jest

T(n) = Θ(n

Algorytmy i struktury danych

logb a

log n) = Θ(n

log3 1 2

log3 1 2

) = Θ(n0 ) = Θ(1)

log n) = Θ(log n)

52

Metoda rekurencji uniwersalnej Przykład 3 Określić oszacowanie asymptotyczne dla rekurencji: T(n) = 3T(n/4) + n log n  Mamy: a=3, b=4, f(n)=n log n, a zatem n

logb a

= nlog4 3 = n0,793

 Ponieważ f (n) = Ω(nlog4 3 + ε ) , gdzie ε ~ 0.2, więc stosuje się tutaj przypadek 3, jeśli możemy pokazać, że dla f(n) zachodzi warunek regularności  Dla dostatecznie dużych n możemy napisać: a f(n/b) = 3 (n/4) log (n/4) ≤ (3/4) n log n = c f(n), przy czym c=¾ < 1  Warunek regularności jest zatem jest spełniony i możemy napisać, że rozwiązaniem rekurencji jest T(n) = Θ[f(n)] = Θ(n log n) Algorytmy i struktury danych

53

Metoda rekurencji uniwersalnej Przykład 4 Określić oszacowanie asymptotyczne dla rekurencji: T(n) = 2T(n/2) + n log n  Mamy: a=2, b=2, f(n)=n log n, a zatem nlogb a = n Wydaje się, że powinien to być przypadek 3, gdyż f(n)=n log n jest log a asymptotycznie większe niż n b = n (ale nie wielomianowo!)  Stosunek f (n) / n b = n log n / n każdej dodatniej stałej ε. log a

jest asymptotycznie mniejszy niż nε dla

 W konsekwencji rekurencja ta “wpada” w lukę między przypadkiem 2 i 3.  Nie można zatem zastosować twierdzenia o rekurencji uniwersalnej Algorytmy i struktury danych

54

Zadanie Wykorzystując metodę rekurencji uniwersalnej określić oszacowanie asymptotyczne dla rekurencji: c) T(n) = 2 T(n/2) + n d) T(n) = T(2n/3) + 1

Algorytmy i struktury danych

55

Algorytmy i struktury danych

56

Related Documents

Aisd W02
November 2019 14
Aisd Statement
June 2020 8
Aisd W12
November 2019 28
Aisd W11
November 2019 10
Aisd W7
November 2019 16
Aisd W01
November 2019 8