53
Złożoność czasowa W przypadku złożoności czasowej, z reguły wyróżniamy pewną operację dominującą, a czas będziemy traktować jako liczbę wykonanych operacji dominujących. W ten sposób analiza będzie zależna jedynie od algorytmu, a nie od implementacji i sprzętu. 1

< Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Złożoność czasowaW przypadku złożoności czasowej, z reguły wyróżniamy pewną operację dominującą, a czas będziemy traktować jako liczbę wykonanych operacji dominujących. W ten sposób analiza będzie zależna jedynie od algorytmu, a nie od implementacji i sprzętu.

1

Page 2: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

• Zazwyczaj określamy pewien parametr n, będący rozmiarem problemu wejściowego i określamy złożoność jako funkcję T(n), której argumentem jest rozmiar problemu.

• Z reguły będziemy przyjmować, że każda operacja arytmetyczna na małych liczbach daje się wykonać w jednym kroku.

• Złożoność algorytmu może być rozumiana w sensie złożoności najgorszego przypadku lub złożoności średniej.

Złożoność najgorszego przypadku nazywamy złożonością pesymistyczną - jest to maksymalna złożoność dla danych tego samego rozmiaru T(n).

2

Page 3: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

W notacji używanej do opisu asymptotycznego czasu działania algorytmów korzysta się z funkcji, których zbiorem argumentów jest zbiór liczb naturalnych.

Notacja Θ

Notacja O

Notacja Ω

3

Page 4: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Notacja Θ

Dla danej funkcji g(n) przez Θ(g(n)) („duże theta od g od n”)

oznaczamy zbiór funkcji:

02102,1 )()()(0 :0,,:)())(( nnngcnfngcnccnfng >∀≤≤≤>∃=Θ

4

Page 5: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Notacja O

Notacja Θ asymptotycznie ogranicza funkcję od góry i od dołu. Kiedy mamy tylko ograniczenie górne, używamy notacji O.

020 )()( :0,:)())(( nnngcnfncnfngO >∀≤>∃=Z notacji O korzystamy, gdy chcemy oszacować funkcję z góry z dokładnością do stałej.

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

Page 6: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Notacja Ω

Notacja Ω asymptotycznie ogranicza funkcję od dołu.

00 )()(0 :0,:)())(( nnnfncgncnfng >∀≤≤>∃=Ω

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

6

Page 7: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Większość rozważanych algorytmów ma złożoność czasową proporcjonalną do jednej z podanych funkcji:

log2n - złożoność logarytmiczna - np. poszukiwanie binarne w ciągu uporządkowanym:

- j=1; while (j<n) j=2*j;

n - złożoność liniowa - dla algorytmów, w których wykonywana jest pewna stała liczba działań dla każdego z n elementów wejściowych.

n*log2n - złożoność liniowo logarytmiczna

7

Page 8: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

n2 - złożoność kwadratowa n3 , n4 - złożoności wielomianowe 2n - złożoność wykładnicza 2n

n! - złożoność wykładnicza n!

UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie dla danych małych rozmiarów

8

Page 9: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Przy korzystaniu z wyników analizy złożoności algorytmów należy brać pod uwagę następujące uwarunkowania:

1. wrażliwość algorytmu na dane wejściowe może spowodować, że faktyczne zachowanie algorytmu na używanych danych może odbiegać od zachowania opisanego funkcjami W(n) i A(n)

2. może być trudno przewidzieć rzeczywisty rozkład prawdopodobieństwa zmiennej losowej Xn

3.czasami trudno porównać jednoznacznie działanie dwóch algorytmów: jeden działa lepiej dla pewnej klasy zestawów danych, a drugi dla innej

4.algorytm i jego realizacja przeznaczona do wykonania są zwykle wyrażone w dwóch całkowicie różnych językach

9

Page 10: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnychRekurencja polega na wywoływaniu danegopodprogramu w jego treści.Rekurencja:

• Bezpośrednia (podprogram wywołuje sam siebie)

• Pośrednia (podprogramy wywołują się naprzemiennie) W języku C – rekurencyjne wywoływanie funkcji

1

Page 11: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencja

• Każde wywołanie funkcji tworzy nowe zmienne – często o nazwach już istniejących. Ze względu na ich lokalny zasięg, nie występują konflikty.

• Konieczność poprawnego zdefiniowania warunku zakończenia pętli – groźba zapętlenia

1

Page 12: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencja

• Rekurencji należy unikać, jeżeli istnieje rozwiązanie iteracyjne. Może się jednak zdarzyć, że skomplikowane rozwiązanie iteracyjne działa o wiele gorzej (dłużej się wykonuje, potrzebuje więcej pamięci itd…) niż rozwiązanie iteracyjne.

• Algorytmy, które w swej istocie są rekurencyjnie, nie iteracyjne, powinny być zaimplementowane jako funkcje rekurencyjne

1

Page 13: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencja -silnia• Silnia dla liczby nieujemnej, całkowitej, zdefiniowana jest jako:

>

== ∏

=0

01!

1nkn

n k

i

• Rekurencyjny wzór na obliczenie n! zapisuje się jako: n!=n*(n-1)!

• Ze wzoru wynika, że aby obliczyć np. 4!, należy najpierw obliczyć 3!. Ale żeby obliczyć 3! trzeba obliczyć 2! itd. aż dojdziemy do 0!, które wynosi 1.

• Sposób obliczenia 4! wygląda więc następująco:4!=4*3!=4*3*2!=4*3*2*1!=4*3*2*1*0!=4*3*2*1*1=24

1

Page 14: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencja -silnia• Definicja rekurencyjna n!:

>−=

=0)!1(*01

!nnnn

n

Rekurencyjna definicja silni prowadzi do następującego algorytmu:

1

Page 15: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencja -silnia• Definicja rekurencyjna n!:

>−=

=0)!1(*01

!nnnn

n

Rekurencyjna definicja silni prowadzi do następującego algorytmu:

unsigned int Factorial (unsigned int n)(1) if (n == 0)(2) return 1; else(3) return n * Factorial (n - 1);

1

Page 16: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-silniaAnaliza złożoności:

1

Page 17: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-silniaAnaliza złożoności:

instr n=0 n>01 O(1) O(1)2 O(1) -3 - T(n-1)+O(1)razem O(1) T(n-1)+O(1)

Z tabeli wynika, że złożoność czasowa rekurencyjnego algorytmu Factorial dana jest rekurencyjnym wzorem:

>+−=

=0)1()1(0)1(

)(nOnTnO

nT

1

Page 18: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-silniaJak rozwiązać takie równanie?

Pominiemy O(.), rozwiążemy równanie i wstawimy O(.).

Rozwiązujemy więc równanie:

>+−=

=01)1(01

)(nnTn

nT

Jest to tak zwane równanie rekurencyjne.

1

Page 19: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-silnia

1

Page 20: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-silniaNajprostszą metodą rozwiązywania równań rekurencyjnych jest metoda powtórzonych podstawień (nazywana też rozwinięciem równania do sumy):

1. Rozpisujemy równania jawnie dla wszystkich n.

1)0(1)0()1(

.

.

.1)2()1(

1)1()(

=+=

+−=−+−=

TTT

nTnTnTnT

2. Po podstawieniach otrzymujemy:nnTnTnTnT +=+=++−=+−= 1)0(11)2(1)1()(

czyli rekurencyjny algorytm obliczania silni jest klasy O(n)

2

Page 21: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjneWyznaczenie złożoności algorytmu sprowadza się często do rozwiązania równania rekurencyjnego.

Mamy następujące równanie rekurencyjne:

>+=

=1)2/(10

)(ncnTn

nT

(równanie to otrzymujemy jako równanie złożoności wtedy, kiedy problem rozmiaru n sprowadza się do problemu o połowę mniejszego)

Trudno jest w tym przypadku zastosować rozwinięcie równania do sumy.

Zastosujemy zmianę zmiennych: podstawiamy kn 2=

2

Page 22: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjne

2

Page 23: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjne

>+=

=1)2/(10

)(ncnTn

nT

Trudno jest w tym przypadku zastosować rozwinięcie równania do sumy.

Zastosujemy zmianę zmiennych: podstawiamy kn 2=

cTcTT kkk +=+= − )2()2/2()2( 1

Teraz możemy zastosować metodę rozwinięcia równania do sumy:

nckckcTccTcTT kkk log)2()2()2()2( 021 ==+=++=+= −−

Stąd wynika, że

T(n)=O(logn)

2

Page 24: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjneMamy następujące równanie rekurencyjne:

>++=

=1)2/()2/(10

)(ncnTnTn

nT

(równanie to otrzymujemy jako równanie złożoności wtedy, kiedy problem rozmiaru n sprowadza się do dwóch podproblemów rozmiaru n/2 +stała liczba działań)

podobnie jak poprzednio, trudno jest w tym przypadku zastosować rozwinięcie równania do sumy.

Zastosujemy zmianę zmiennych: podstawiamy kn 2=

cTcTTT kkkk +=++= − )2(2)2/2()2/2()2( 1

2

Page 25: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjne

2

Page 26: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjne

Teraz możemy zastosować metodę rozwinięcia równania do sumy:

( ) ( )( ) ( )

( ) )1()12(1222222

222)1(2222)2(2

2)2(2)2(22)2(2)2(

01021

0210210

2221

−=−=−+=++

=+++=+++

=++=++=+=

−−−

−−−−

−−−

ncccc

cTcT

ccTccTcTT

kk

kk

kkkkkk

kkkk

Stąd wynika, że

)()( nOnT =

2

Page 27: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjneMamy następujące równanie rekurencyjne:

>++=

=1)2/()2/(10

)(ncnnTnTn

nT

(równanie to otrzymujemy jako równanie złożoności wtedy, kiedy problem rozmiaru n sprowadza się do dwóch podproblemów rozmiaru n/2 +liniowa liczba działań - np. MERGESORT)

podobnie jak poprzednio, trudno jest w tym przypadku zastosować rozwinięcie równania do sumy.

Zastosujemy zmianę zmiennych: podstawiamy kn 2=kkkkkk cTcTTT 2)2(22)2/2()2/2()2( 1 +=++= −

2

Page 28: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjne

2

Page 29: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza złożoności – równania rekurencyjne

Teraz możemy zastosować metodę rozwinięcia równania do sumy:

( )( ) ( )

( ) )log(0222

22222222

22)2(222)2(2)2(

0

2222

121

ncnkcT

cTccT

ccTcTT

kk

kkkkk

kkkkkk

+=+=

=+=++

=++=+=−−

−−−

Stąd wynika, że

)log()( nnnT Θ=

2

Page 30: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Obliczanie wartości wielomianu w punkcie:

Mamy tablicę współczynników wielomianu A[0..n]:A[0] – a0

A[1] – a1

A[n] – an

Gdzie

Chcemy obliczyć wartość wielomianu w punkcie x.

3

nnxaxaxaanxW ++++= ...),( 2

210

Page 31: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Obliczanie wartości wielomianu w punkcie:

0)0,( axW =

xaxWxaaxW 110 )0,()1,( +=+=

22

2210 )1,()2,( xaxWxaxaaxW +=++=

nnxanxWnxW +−= )1,(),(

3

Page 32: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Obliczanie wartości wielomianu - algorytm rekurencyjny:

Double W(double x,int n)(1)If (n==0) (2) return a[0](3)else return W(x,n-1)+a[n]*P(x,n)gdzie P(x,n) podnosi x do potęgi n

3

nnxanxWnxW +−= )1,(),(

Page 33: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-obliczanie wartości wielomianu

3

Page 34: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-obliczanie wartości wielomianu

Analiza złożoności:

inst.. n=0 n>01 O(1) O(1)2 O(1) -3 - T(n-1)+O(n)razem O(1) T(n-1)+O(n)

Z tabeli wynika, że złożoność czasowa rekurencyjnego algorytmu W() dana jest rekurencyjnym wzorem:

>+−=

=0)()1(0)1(

)(nnOnTnO

nT

3

Page 35: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-obliczanie wartości wielomianu

Pominiemy O(.), rozwiążemy równanie i wstawimy O(.).

Rozwiązujemy więc równanie:

>+−=

=0)1(01

)(nnnTn

nT

Po podstawieniach otrzymujemy:T(n)= O(n^2)

3

Page 36: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Obliczanie wartości wielomianu- Schemat Hornera

Przyjmijmy, że:

Przykładowo:

nnnn xaxaxaanxW 0

221 ...),( ++++= −−

)...)(...((),( 0121 xaaxaxaxanxW nnn ++++= −−

))(()3,( 01233

02

123 xaaxaxaxaxaxaaxW +++=++=

)()2,( 0122

012 xaaxaxaxaaxW ++=++=

3

Page 37: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Obliczanie wartości wielomianu- Schemat Hornera

Oznaczmy:

)1,()...)(...(),( 0121 −+=+++++= −− nxxTaxaaxxaaxanxT nnnn

110 )0,()1,( axxTaxaxT +=+=

0)0,( axT =

2210 )1,()()2,( axxTaxaxaxT +=++=

3

)...)(...((),( 0121 xaaxaxaxanxW nnn ++++= −−

Page 38: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Schemat Hornera – algorytm rekurencyjny

Double Horner(double x, int n)If (n==0) return a[0] elsereturn Horner(x,n-1)*x+a[n]T(n)=O(n) (analiza złożoności analogiczna do analizy funkcji Factorial)

3

Page 39: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Analiza funkcji rekurencyjnych-liczby Fibonacciego

Ciąg Fibonacciego, to ciąg liczb spełniających:

≥+==

=

−− 21100

21 nFFnn

F

nn

n

Kolejne elementy tego ciągu to: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,...

Kolejnym elementem ciągu jest suma dwóch poprzednich elementów.

3

Page 40: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Nierekurencyjna wersja obliczania liczb Fibonacciego

4

Page 41: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Nierekurencyjna wersja obliczania liczb Fibonacciego1. unsigned int Fibonacci (unsigned int n) 2. int previous = -1;3. int result = 1;4. for (unsigned int i = 0; i <= n; ++i) 5. int const sum = result + previous;6. previous = result;7. result = sum;

8. return result;

4

Page 42: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Nierekurencyjna wersja obliczania liczb Fibonacciego

5. Instrukcje (2), (3) są O(1). Z reguły sumowania złożoność fragmentu (2)(3) jest O(max(1,1))=O(1)

6. Instrukcje (5), (6), (7) są rzędu O(1). Z reguły sumowania złożoność fragmentu (5)(6)(7) jest O(max(1,1,1))=O(1)

7. Dla pętli (4)-(7) czas wykonania jest sumą czasów wykonania wnętrza pętli dla każdego nawrotu pętli. Należy przyjąć, że zwiększanie zmiennej iteracyjnie, sprawdzenie warunku wyjścia oraz ewentualny skok do początku pętli zajmuję O(1). Wnętrze pętli też jest O(1), a liczba iteracji pętli wynosi n+1. Zatem na podstawie reguły mnożenia złożoność fragmentu (4)-(7) jest O((n+1)*1)=O(n+1).

4

Page 43: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Nierekurencyjna wersja obliczania liczb Fibonacciego

8. Ponieważ złożoność czasowa fragmentu (2)(3) jest rzędu złożoność(1), a złożoność pętli (4)-(7) jest rzędu O(n+1), wiec z reguły sumowania złożoność całego algorytmu jest O(n+1) czyli O(n)

4

Page 44: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb Fibonacciego

4

Page 45: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb Fibonacciegounsigned int Fibonacci (unsigned int n)(1) if (n == 0 || n == 1) (2) return n; else(3) return Fibonacci (n - 1) + Fibonacci (n - 2);

Algorytm wielokrotnie liczy te same wartości(wada!)

4

Page 46: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb Fibonacciego

unsigned int Fibonacci (unsigned int n)(1) if (n == 0 || n == 1)(2) return n; else(3) return Fibonacci (n - 1) + Fibonacci (n - 2);

instr N<2 n>=21 O(1) O(1)2 O(1) -3 - T(n-1)+T(n-2)+O(1)razem O(1) T(n-1)+T(n-2)+O(1)

Rekurencyjna wersja obliczania liczb Fibonacciego

4

Page 47: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Z tabeli wynika, że złożoność czasowa rekurencyjnego algorytmu Fibonacci dana jest rekurencyjnym wzorem:

≥+−+−<

=2)1()2()1(2)1(

)(nOnTnTnO

nT

Jak rozwiązać takie równanie?

Pominiemy O(.), rozwiążemy równanie i wstawimy O(.).

Rozwiązujemy więc równanie:

≥+−+−<

=21)2()1(21

)(nnTnTn

nT

4

Page 48: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb FibonacciegoEtap 1: Pokażemy przez indukcję, że:

1)( 0 +≥≥∀ nFnTnDowód:1. n=0: 11)0( 1 =≥= FT n=1: 11)1( 2 =≥= FT2. założenie indukcyjne:

kiFiT i ≤∀≥ + 1)( dla pewnego k>=13. ?)1( 2+≥+ kFkT

221 11)1()()1( +++ ≥+≥++≥−+=+ kkkk FFFFkTkTkTUdowodniliśmy wiec indukcyjnie, że 1)( 0 +≥≥∀ nFnTn Tak więc )()( 1+Ω= nFnT . Czy to dobra złożoność?

4

Page 49: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb Fibonacciego

Na podstawie poniższego twierdzenia pokażemy, że wersja nierekurencyjna algorytmu Fibonacii jest dużo lepsza.

Twierdzenie 2.

( )nnnF φφ ˆ

51 −= gdzie

( )( ) 2/51

2/51−=+=

φφ

4

Page 50: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb Fibonacciego

Dowód indukcyjny

1. n=0: ( ) 0115

11 =−=F

n=1: ( ) ( )( ) ( )

155

1

2/51515

12/512/515

11

=

=+−+=−−+=F

2. założenie indukcyjne:

( ) kiF iii ≤∀−= φφ ˆ

51 dla pewnego k>=1

5

Page 51: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb Fibonacciego

3. ( )?ˆ5

1 111

+++ −= kk

kF φφ

Wskazówka:( )( )

φφ

+=++=++=+=

12/)51(14/52/54/12/51 22

( )( )φ

φˆ12/)51(1

4/52/54/12/51ˆ 22

+=−+

=+−=−=

5

Page 52: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Rekurencyjna wersja obliczania liczb Fibonacciego

( ) ( )( ) ( )( )

( )( )11

2121

11

11

11

ˆ5

1

ˆˆ5

1

ˆ1ˆ15

1

ˆ5

1ˆ5

1

++

−−

−−

−−

−+

=−

=+−+

=−+−

=+=

kk

kk

kk

kkkk

kkk FFF

φφ

φφφφ

φφφφ

φφφφ

5

Page 53: < Algorytmy i struktury danychiswiki.if.uj.edu.pl/images/4/49/AiSD_02a._Analiza... · 2019. 4. 3. · UWAGA: Algorytmy o złożoności wykładniczej mogą być realizowane jedynie

Na podstawie Twierdzenia 2 mamy:

( )nnnF φφ ˆ

51 −= gdzie

( )( ) 2/51ˆ

2/51

−=

+=

φ

φ

Rozważmy φˆ .Ponieważ ( ) 2/51ˆ −=φ , więc 1ˆ <φ .

Im większe n, tym mniejsze nφˆ .Tak więc dla odpowiednio dużych n mamy:

( )nnF φΩ= .

Ponieważ 2/362.1 >≈nφ mamy:

Fn=Ω((3/2)n) - czas wykonania rekurencyjnej funkcji Fibonacii rośnie wykładniczo wraz ze wzrostem n!

5