AiSD W1 2

background image

Algorytmy i struktury danych

Prowadzący:

dr hab. inż. Kazimierz Worwa, prof. WAT

e-mail:

kworwa@wat.edu.pl

r.a. 2008/2009

WOJSKOWA AKADEMIA TECHNICZNA

Wydział Cybernetyki

background image

2

Algorytmy i struktury danych





A L G O R Y T M Y I ST R U K T U R Y D A N Y C H

R A ZE M

W ykłady

Ć w iczenia

L aboratoria

60

30x

10

20+


background image

3

Algorytmy i struktury danych



Przedmiot kończy się egzaminem



Warunkiem dopuszczenia do egzaminu jest uzyskanie co najmniej 16 pkt.
z ćwiczeń i zajęć laboratoryjnych (łącznie)



W ramach ćwiczeń rachunkowych student może uzyskać do 10 pkt., w tym:



0 – 5 pkt. z odpowiedzi ustnych i/lub sprawdzianów pisemnych,
wg ustaleń prowadzącego ćwiczenia;



0 – 5 pkt. z kolokwium końcowego;



W ramach ćwiczeń laboratoryjnych student może uzyskać do 20 pkt.;
na każdych ćwiczeniach laboratoryjnych student powinien opracować
(napisać

i

uruchomić)

program,

będący

rozwiązaniem

zadania

sformułowanego przez prowadzącego zajęcia; za poprawny, napisany w
trakcie zajęć program student otrzymuje 2 pkt.; za każdy poprawny program
oddany z opóźnieniem (na kolejnych zajęciach) student otrzymuje 1 pkt.



Egzamin - test wielokrotnego wyboru

Warunki zaliczenia przedmiotu

background image

4

Algorytmy i struktury danych

LITERATURA

1.

Aho A.V., Hopcroft J.E., Ullman J.D.: Algorytmy i struktury danych.

Wydawnictwo Helion, Gliwice, 2003.

2. Aho A.V., Hopcroft J.E., Ullman J.D.: Projektowanie i analiza

algorytmów. Wydawnictwo Helion, Gliwice, 2003.

3. Banachowski L., Diks K., Rytter W., Algorytmy i struktury danych.

WNT, Warszawa, 2006.

4. Cormen T.H., Leiserson C.E., Rivest R.L., Stein C.: Wprowadzenie do

algorytmów. WNT, Warszawa, 2005.

5. Drozdek A.: C++. Algorytmy i struktury danych. Wydawnictwo Helion,

Gliwice, 2004.

6. Kotowski P.: Algorytmy + struktury danych = abstrakcyjne typy

danych. Wydawnictwo BTC, Warszawa, 2006.

7. Harris S, Ross J.: Algorytmy od podstaw. Wydawnictwo Helion,

Gliwice, 2006.

8. Wirth N.: Algorytmy + struktury danych = programy. WNT, Warszawa,

2004.

9. Wróblewski P.: Algorytmy, struktury danych i techniki programowania.

Wydawnictwo Helion, Gliwice, 2006.

background image

5

Algorytmy i struktury danych

Tematyka przedmiotu



Poj

ę

cia podstawowe



Listy



Kolejki (LIFO, FIFO, kolejki priorytetowe)



Drzewa binarne



drzewa BST



drzewa AVL



drzewa czerwono-czarne



drzewa cz

ęś

ciowo uporz

ą

dkowane (kopce)



Drzewa wielokierunkowe



Algorytmy sortowania



wewn

ę

trznego



zewn

ę

trznego



Podstawowe algorytmy grafowe



Tablice rozproszone (haszowanie)



Problemy obliczeniowo trudne

background image

6

Algorytmy i struktury danych

Materiały do wykładów



Materiały wykorzystywane na wykładach udost

ę

pniam na stronie

http://www.kw.ocom.pl/



folder

Algorytmy i struktury danych



logowanie:



nazwa u

ż

ytkownika

2008/2009



hasło

sl

background image

Algorytmy i struktury danych

Wykład 1-2

Pojęcia podstawowe.
Złożoność obliczeniowa algorytmów.

background image

8

Algorytmy i struktury danych

Tematyka wykładu



Poj

ę

cia podstawowe



Klasyfikacja algorytmów



Własno

ś

ci algorytmów



Metody oceny algorytmów



Poj

ę

cie zło

ż

ono

ś

ci obliczeniowej algorytmów



Zło

ż

ono

ść

asymptotyczna: O-notacja,

-notacja,

Θ

-notacja



Wyznaczanie zło

ż

ono

ś

ci czasowej algorytmów:



iteracyjnych



rekurencyjnych

background image

9

Algorytmy i struktury danych

Potoczne rozumienie pojęcia „algorytm”



Algorytmika jest dziedzin

ą

wiedzy zajmuj

ą

c

ą

si

ę

badaniem

algorytmów



Potocznie algorytm jest rozumiany jako pewien przepis na
wykonanie zestawu czynno

ś

ci, prowadz

ą

cych do osi

ą

gni

ę

cia

oczekiwanego i z góry okre

ś

lonego celu



Mówi si

ę

równie

ż

,

ż

e

algorytm jest pewn

ą

ś

ci

ś

le okre

ś

lon

ą

procedur

ą

obliczeniow

ą

, która dla zestawu wła

ś

ciwych danych

wej

ś

ciowych generuje okre

ś

lone dane wyj

ś

ciowe



Dzisiejsze, uogólnione znaczenie słowa algorytm:

zbiór reguł post

ę

powania, umo

ż

liwiaj

ą

cych rozwi

ą

zanie okre

ś

lonego

zadania w sko

ń

czonej liczbie kroków (w sko

ń

czonym czasie)

background image

10

Algorytmy i struktury danych

P

ochodzenie słowa „algorytm”



Słowo „algorytm” pochodzi od łaci

ń

skiego słowa „algorism”,

rozumianego w

ś

redniowieczu jako sztuka rachowania na liczbach

w systemie decymalnym



Słowo „algorism” zostało utworzone od nazwiska perskiego
matematyka z 9-tego wieku n.e., Muhameda ibu-Musy al-Choresmi,
twórcy systemu dziesi

ę

tnego

background image

11

Algorytmy i struktury danych

Pojęciowy model algorytmu

Algorytm mo

ż

e by

ć

rozumiany jako pewne odwzorowanie

f

,

które dla okre

ś

lonego zestawu danych wej

ś

ciowych

We

generuje okre

ś

lony zestaw danych wyj

ś

ciowych

Wy

:

f: We

Wy

Dane

wejściowe

We

Dane

wyjściowe

Wy

f

background image

12

Algorytmy i struktury danych

Pojęcie dziedziny algorytmicznej



Ka

ż

dy algorytm działa na pewnym zbiorze obiektów (np. liczb),

wykonuj

ą

c na tych obiektach pewne operacje



Zbiór obiektów wraz z operacjami wykonywanymi na tych
obiektach nazywamy dziedzin

ą

algorytmiczn

ą

background image

13

Algorytmy i struktury danych

S

posoby zapisu algorytmów



Opis algorytmu obejmuje precyzyjny opis jego kolejnych
kroków



Do przedstawienia algorytmu stosuje si

ę

:



opis werbalny,



zapis formalny, np.:



zapisy graficzne (schematy blokowe),



formalne specyfikacje programów (np.VDM)



zapisy w postaci pseudokodu (paraprogramu)



zapis algorytmu w dowolnym j

ę

zyku programowania

background image

14

Algorytmy i struktury danych

Język programowania



J

ę

zyk programowania jest

ś

rodkiem umo

ż

liwiaj

ą

cym zapis algorytmów w

postaci zrozumiałej dla człowieka, a równocze

ś

nie przetwarzalnej do postaci

zrozumiałej dla komputera.



Zapis algorytmu w j

ę

zyku programowania jest traktowany jako zapis

formalny.



Program komputerowy mo

ż

e by

ć

uznawany za jeden z rodzajów modeli

matematycznych.

Kod źródłowy programu
(w języku programowania)

Kod wynikowy programu
(w języku maszynowym)

Przetworzenie

programu

źródłowego

w kod

maszynowy

background image

15

Algorytmy i struktury danych

Klasyfikacja algorytmów

Rozwa

ż

a

ć

b

ę

dziemy nast

ę

puj

ą

ce klasy algorytmów:



algorytmy sekwencyjne - algorytmy równoległe;



algorytmy numeryczne - algorytmy nienumeryczne;



algorytmy rekurencyjne - algorytmy iteracyjne.

background image

16

Algorytmy i struktury danych

Techniki algorytmiczne

Podstawowe techniki wykorzystywane w budowie algorytmów:



Iteracja



Rekurencja

background image

17

Algorytmy i struktury danych

Rekurencja



Rekurencja oznacza wywołanie funkcji (procedury) przez t

ę

sam

ą

funkcj

ę

(procedur

ę

)



Niepo

żą

dana cecha definicji rekurencyjnych: aby wyznaczy

ć

n-t

ą

warto

ść

trzeba najpierw wyznaczy

ć

wszystkie „wcze

ś

niejsze” warto

ś

ci



Wa

ż

ne jest, aby kolejne wywołania funkcji (procedury) rekurencyjnej

były realizowane dla kolejnych warto

ś

ci parametrów formalnych w taki

sposób, aby nie doszło do zjawiska „niesko

ń

czonej p

ę

tli

rekurencyjnych wywoła

ń

funkcji”

background image

18

Algorytmy i struktury danych

Stos programu w wywołaniach

rekurencyjnych – przykład C/C++

Adres powrotu do

systemu operacyjnego

Dno stosu programu

Adres powrotu z funkcji

Zwracana wartość

Parametry przez adres

Parametry przez wartość

Zmienne lokalne

Adres powrotu z funkcji

Zwracana wartość

Parametry przez adres

Parametry przez wartość

Zmienne lokalne

Adres powrotu z funkcji

Zwracana wartość

Parametry przez adres

Parametry przez wartość

Zmienne lokalne

funkcja main()

funkcja f1

funkcja f2

funkcja fN

Kolejne poziomy rekurencji wymagają

odkładania na stosie programu kolejnych

rekordów aktywacji funkcji

.

.

.

Stos programu w wywołaniach

rekurencyjnych jest bardziej

eksploatowany niż wtedy, gdy wywołania

nie są rekurencyjne

background image

19

Algorytmy i struktury danych

Funkcja rekurencyjna – ciąg Fibonacciego



n-ty wyraz ci

ą

gu Fibonacciego jest wyliczany wg formuły, n

0:

n

dla n<2

Fib(n)=

Fib(n-2) + Fib(n-1) dla n>=2



Rekurencyjna implementacja w j

ę

zyku C:

long int Fib (int n)

{

if (n<2)

return n;

else

return Fib(n-2) + Fib (n-1);

}

Dla dużych n stos programu
„nie wytrzyma” takiej realizacji
funkcji Fib!

background image

20

Algorytmy i struktury danych

Efektywność rekurencyjnego wykonania funkcji

Fibonacciego (cd.)



Rekurencyjna implementacja funkcji Fibonacciego jest bardzo nieefektywna.



Stos programu nie jest praktycznie w stanie zrealizowa

ć

tego algorytmu ju

ż

dla liczb wi

ę

kszych od 50.



Oznacza to,

ż

e program ma zbyt du

żą

„zło

ż

ono

ść

pami

ę

ciow

ą

”.

F(6)

F(5)

F(4)

F(2)

F(0)

F(1)

F(3)

F(1)

F(2)

F(3)

F(1)

F(2)

F(4)

F(2)

F(3)

F(0)

F(1)

F(0)

F(1)

F(0)

F(1)

F(1)

F(2)

F(0)

F(1)

0

1

0

1

1

0

1

0

1

0

1

1

1



Przykład: drzewo wywoła

ń

dla F(6):

background image

21

Algorytmy i struktury danych

Efektywność rekurencyjnego wykonania funkcji Fibonacciego

2 692 537

1 346 268

30

242 785

121 392

25

21 891

10 945

20

1 973

986

15

177

88

10

25

12

6

Liczba

wywoła

ń

Liczba

dodawa

ń

n

background image

22

Algorytmy i struktury danych

Iteracyjne wykonanie rekurencyjnej funkcji

Fibonacciego



Bardziej efektywna jest iteracyjna implementacja funkcji Fibonacciego. Nie
przepełniamy wtedy stosu programu i wykonujemy znacznie mniejsz

ą

liczb

ę

przypisa

ń

warto

ś

ci ni

ż

w implementacji rekurencyjnej



Przykład iteracyjnej implementacji funkcji Fibonacciego:

long int IteracyjnyFib(int n)
{

register int i=2, last=0, tmp; long int current =1;
if (n<2)

return n;

else {

for ( ; i<=n; i++) {

tmp = current;
current += last;
last = tmp;

}

return current;

}

}

background image

23

Algorytmy i struktury danych

Efektywność iteracyjnego wykonania rekurencyjnej funkcji

Fibonacciego

2 692 537

87

30

242 785

72

25

21 891

57

20

1 973

42

15

177

27

10

25

15

6

Liczba przypisa

ń

(wywoła

ń

) w algorytmie

rekurencyjnym

Liczba przypisa

ń

w

algorytmie iteracyjnym

n

Program 1.1b

Program 1.1a

background image

24

Algorytmy i struktury danych

Pułapki rekurencji

int jakas_funkcja(int n)
{

if (n==1)

return 1;

else

if ((n%2)==0)

// czy n jest parzyste?

return jakas_funkcja(n-2)*n;

else

return jakas_funkcja(n-1)*n;

}

Program 1.2

Co będzie wynikiem wykonania poniższej funkcji?

background image

25

Algorytmy i struktury danych

Jak porównywać algorytmy?

Idealny algorytm to taki, który:

 ma czytelny i zrozumiały kod,
 jest napisany w ogólnie dostępnym języku programowania,
 jest efektywny obliczeniowo (szybko liczy, nie wymaga dużej pamięci),
 zawsze daje poprawne wyniki.

background image

26

Algorytmy i struktury danych

Jak porównywać algorytmy – przykładowe kryteria



prostota,



czytelność kodu,



długość kodu,



poprawność,



czas realizacji (obliczeń),



zajętość pamięci.

background image

27

Algorytmy i struktury danych

Częściowa poprawność algorytmu

 Specyfikacją algorytmu nazywamy parę warunków (własności):

Warunek początkowy

Warunek końcowy

< wp , wk >

Algorytm A wykorzystujący strukturę danych S jest częściowo poprawny ze
względu na specyfikację <wp, wk>, jeżeli dla wszystkich danych spełniających
warunek początkowy i dla których algorytm zatrzyma się, uzyskane wyniki
spełniają warunek końcowy.

wk

wp

A

background image

28

Algorytmy i struktury danych

Całkowita poprawność algorytmu

wk

wp

A

Mówimy, że algorytm A wykorzystujący strukturę danych S jest całkowicie
poprawny
ze względu na specyfikację <wp, wk> jeżeli dla wszystkich
danych w strukturze S spełniających warunek początkowy wp, algorytm
zatrzymuje się i daje wyniki spełniające warunek końcowy wk.

background image

29

Algorytmy i struktury danych

 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.

Złożoność obliczeniowa algorytmów

background image

30

Algorytmy i struktury danych

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

background image

31

Algorytmy i struktury danych

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)

background image

32

Algorytmy i struktury danych

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

background image

33

Algorytmy i struktury danych

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



Funkcje opisuj

ą

ce zwi

ą

zek mi

ę

dzy

T(n)

a

n

mog

ą

by

ć

bardzo zło

ż

one;

w praktyce upraszczamy je, pozostawiaj

ą

c tzw. składowe dominuj

ą

ce,

tj. składowe maj

ą

ce najwi

ę

kszy wpływ na warto

ś

ci

T(n)

background image

34

Algorytmy i struktury danych

Przykład



Niech zale

ż

no

ść

czasu realizacji algorytmu od rozmiaru

danych wej

ś

ciowych opisuje funkcja

f(n) = n

2

+ 100n + log

10

n + 1000

background image

35

Algorytmy i struktury danych

Porównanie szybkości wzrostu funkcji

f(n)= log n

f(n)=n

f(n) = 2

n

f(n) = n

2

n

f(n)

background image

36

Algorytmy i struktury danych

Funkcja: f(n) = n

2

+ 100*n + log

10

n + 1000

n f(n) n

2

100*n log

10

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%

10

3

1 101 003 91% 9% 0.0003%

0.09%

10

4

99% 1% 0.0%

0.001%

10

5

99,9% 0.1% 0.0%

0.0000%

Szybkość wzrostu poszczególnych składników funkcji

Dla dużych wartości n składnikiem dominującym jest n

2

, tzn. funkcja rośnie

jak n

2

; pozostałe składniki mogą być pominięte;

n – ilość wykonywanych operacji

background image

37

Algorytmy i struktury danych



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.

Asymptotyczna złożoność obliczeniowa

background image

38

Algorytmy i struktury danych

O-notacja



Definicja:

Funkcja

f(n)

jest funkcj

ą

o zło

ż

ono

ś

ci

O(g(n)),

je

ż

eli istniej

ą

takie

liczby dodatnie

c

i

n

o

,

ż

e dla ka

ż

dego

zachodzi



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

n

0

(takich par mo

ż

e by

ć

wiele)



Interpretacja:

O(g(n)) = { f(n): istniej

ą

dodatnie liczby c i n

0

takie,

ż

e dla

ka

ż

dego n

n

0

zachodzi 0

f(n)

c g(n) }



Piszemy: f(n)

O(g(n)) lub cz

ęś

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

0

n

n

g(n)

c

f(n)

background image

39

Algorytmy i struktury danych

O-notacja – ilustracja graficzna

f(n)

c g(n)

n

n

0

f

(n)=O(g(n))

background image

40

Algorytmy i struktury danych

Przykład



Niech zale

ż

no

ść

czasu realizacji algorytmu od rozmiaru

danych wej

ś

ciowych n opisuje funkcja

f(n) = n

2

+ 100n + log n + 1000



Wówczas, wykorzystuj

ą

c O-notacj

ę

, mo

ż

na napisa

ć

,

ż

e

n

2

+ 100n + log n + 1000

O(n

2 )



Zatem, dla badanej funkcji

T(n) = n

2



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

background image

41

Algorytmy i struktury danych

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 an

k

jest O(n

k

).

Własność 4:

Funkcja n

k

jest O(n

k+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) = a

k

n

k

+ a

k-1

n

k-1

+ ... + a

1

n

+a

0

jest O(n

k

)

(jest też oczywiście O(n

k+j

) dla dowolnego nieujemnego j).

background image

42

Algorytmy i struktury danych

Własność 5:

Jeśli f(n)=c g(n), to f(n) jest O(g(n))

Własność 6:

Funkcja log

a

n jest O(log

b

n) dla dowolnych a i b większych niż 1

Własność 7:

log

a

n jest O(log

2

n) dla dowolnego dodatniego a

Własności O-notacji (cd.)

Wniosek:

Wszystkie funkcje logarytmiczne (niezależnie od podstawy logarytmu) są

sobie równoważne w sensie O-notacji

background image

43

Algorytmy i struktury danych

Własności O-notacji (cd.)

Własność 8 (reguła sumy)

Je

ś

li

T

1

(n)=O(f(n))

i

T

2

(n)=O(g(n))

s

ą

czasami wykonywania dwóch

fragmentów algorytmu, to ł

ą

czny czas wykonania obydwu fragmentów

wynosi:

T

1

(n) +T

2

(n) = O(max{ f(n), g(n)})

Własność 9 (reguła iloczynu)

Niech

T

1

(n)=O(f(n))

i

T

2

(n)=O(g(n))

s

ą

czasami wykonywania dwóch

fragmentów algorytmu. Wówczas:

T

1

(n)

T

2

(n) = O(f(n)

g(n))

background image

44

Algorytmy i struktury danych



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(log

2

log

2

n) czy O(1) ma praktyczne

znaczenie.

Własności O-notacji

background image

45

Algorytmy i struktury danych

- notacja



O-notacja dotyczy kresu górnego funkcji



Istnieje symetryczna definicja kresu dolnego w postaci

-notacji



Definicja:

f(n)

jest funkcj

ą

o zło

ż

ono

ś

ci

je

ż

eli istniej

ą

takie liczby

dodatnie

c

i

n

0

,

ż

e dla ka

ż

dego

zachodzi



Wniosek

Funkcja f(n)

ma zło

ż

ono

ść

wtedy i tylko wtedy, gdy

g(n)

ma zło

ż

ono

ść

0

n

n

g(n)

c

f(n)

(g(n))

(f(n))

O

(g(n))

background image

46

Algorytmy i struktury danych

- notacja



Interpretacja:

(g(n)) = { f(n): istniej

ą

dodatnie liczby c i n

0

takie,

ż

e dla

ka

ż

dego n

n

0

zachodzi 0

c g(n)

f(n) }



Piszemy: f(n)

∈ Ω

(g(n)) lub cz

ęś

ciej f(n) =

(g(n))

background image

47

Algorytmy i struktury danych

-notacja – ilustracja graficzna

f(n)

c g(n)

n

n

0

f(n)=

(g(n))

background image

48

Algorytmy i struktury danych

Θ

Θ

Θ

Θ

- notacja



Definicja

f(n)

jest funkcj

ą

o zło

ż

ono

ś

ci

je

ż

eli istniej

ą

liczby dodatnie

c

1

, c

2

i

n

0

takie,

ż

e dla ka

ż

dego

zachodzi



Wniosek

Funkcja

f(n)

ma zło

ż

ono

ść

wtedy i tylko wtedy, gdy

f(n)

ma zło

ż

ono

ść

i

f(n)

ma zło

ż

ono

ść

(g(n))

Θ

0

n

n

g(n)

c

f(n)

g(n)

c

2

1

(g(n))

Θ

(g(n))

O

(g(n))

background image

49

Algorytmy i struktury danych

Θ

Θ

Θ

Θ

- notacja



Interpretacja:

Θ

(g(n)) = { f(n): istniej

ą

dodatnie liczby c

1

, c

2

i n

0

takie,

ż

e dla

ka

ż

dego n

n

0

zachodzi 0

c

1

g(n)

f(n)

c

2

g(n) }



Piszemy: f(n)

∈ Θ

(g(n)) lub cz

ęś

ciej f(n) =

Θ

(g(n))

background image

50

Algorytmy i struktury danych

Θ

Θ

Θ

Θ

-notacja – ilustracja graficzna

c

1

g(n)

f(n)=

Θ

(g(n))

f(n)

n

c

2

g(n)

n

0

background image

51

Algorytmy i struktury danych

O-notacja,

-notacja,

Θ

Θ

Θ

Θ

-notacja – porównanie

f(n)

c g(n)

n

n

0

f(n)=

(g(n))

f(n)

c g(n)

n

n

0

f

(n)=O(g(n))

c

1

g(n)

f(n)=

Θ

(g(n))

f(n)

n

c

2

g(n)

n

0

background image

52

Algorytmy i struktury danych

Notacja asymptotyczna - podsumowanie

Niech f , g : N

R

+

.

Mówimy, że funkcja f jest co najwyżej rzędu g, jeśli
(

c>0,

n

o

N)

n>n

o

f(n)

c g(n)

Mówimy, że funkcja f jest co najmniej rzędu g, jeśli
(

c>0,

n

o

N)

n>n

o

c g(n)

f(n)

f =

(g )

f = O (g )

f =

Θ

Θ

Θ

Θ

(g )

Mówimy, że funkcja f jest rzędu g, jeśli
(

c

1

>0, c

2

>0,

n

o

N)

n>n

o

c

1

g(n)

f(n)

c

2

g(n)

background image

53

Algorytmy i struktury danych

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

Θ

(n

2

)

 wielomianową

jeśli T(A, n) =

Θ

(n

α

)

α ∈

N

 wykładniczą

jeśli T(A, n) =

Θ

(a

n

) a

R

+

background image

54

Algorytmy i struktury danych

Porównywanie rzędów funkcji

Przykład 1

Niech f(n)=100n, g(n)= 2n+100, h(n) = 0.1 n

2

+n

Mamy: f = O(n), f =

(n), g = O(n) ale także g = O(n

2

), g =

Θ

(n)

h = O(n

2

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

2. Je

ż

eli c = 0, to f = O(g) oraz f

≠≠≠≠ Ω

(g).

3. Je

ż

eli c =+

, to f ma rz

ą

d wi

ę

kszy ni

ż

g,

g = O(f) i g

≠≠≠≠ Ω

(f).

Przykład 2

f(n) = 0,3 n

3

+ 10n + 100

g(n)= n

3

h(n) = log n

lim

n

→∞

f(n)/g(n)= 0,3

Zatem f = g =

Θ

(n

3

)

lim

n

→∞

f(n)/h(n) = +

Zatem h = O(f) = O(n

3

),

h

≠ Ω

(f).

background image

55

Algorytmy i struktury danych

Złożoność a rozmiar i czas

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

Ile czasu potrzeba na rozwiązanie zadania o ustalonym rozmiarze i złożoności?

1 s

1 godz.

n

3

lg n

n

n lg n

n

2

2

n

10

2

15* 10

2

2

1000000

63*10

3

10

6

10

3

19

36*10

8

13* 10

7

60* 10

3

31

T(A,n)

czas

n=10

2

n= 10

4

n

3

lg n

n

n lg n

n

2

2

n

1s

1

1

dni

6.6

µ

s

13.3

µ

s

0.6ms

0.1ms

10ms

10

6

lat

10ms

0.1s

100s

10

100

lat

T(A,n)

wymiar

background image

56

Algorytmy i struktury danych

Czy szybkość może przezwyciężyć złożoność?

 Mamy 5 algorytmów A

1

, A

2

, A

3

, A

4

, A

5

rozwiązujących ten sam problem.

Niech s

i

oznacza maksymalny rozmiar problemu, który można rozwiązać na

komputerze 1 przy pomocy algorytmu A

i

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

Komputer 2

n

3

lg n

n

n

2

2

n

s

4

2*s

4

s

1

s

1

10

s

2

s

3

s

5

10*s

2

10*s

3

3,2 + s

5

5

5

s

x

x

s

2

10

2

2

t

2

10

t

=

=

=

Zatem:

czyli

x = 3,2 + s

5

t

)

x

,

A

(

T

=

Szukamy takiego x, że

10

/

t

2

)

s

,

A

(

T

5

s

5

=

=

Dla komputera 2:

t

2

)

s

,

A

(

T

5

s

5

=

=

Dla komputera 1:

background image

57

Algorytmy i struktury danych

Wpływ dziesięciokrotnego przyspieszenia

komputera na wzrost rozmiaru zadania

1,3

13

10

2

n

2,3

27

12

n

3

/2

3,2

45

14

5n

2

10,0

100

10

100n

Wzgl

ę

dny przyrost

rozmiaru problemu

Komputer

dziesi

ę

ciokrotnie

szybszy

Komputer

oryginalny

Zło

ż

ono

ść

czasowa T(n)

background image

58

Algorytmy i struktury danych

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<n; i++)

sum=sum+ a[i];

 Liczba przypisań w całej pętli: 2+2n

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

background image

59

Algorytmy i struktury danych

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<n; i++) {

for (j=1, sum=a[0]; j<=i; j++)

sum=sum+ a[j];

printf(„\n Suma podtablicy %d” , sum)

}

 Liczba przypisań w całej pętli:

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

2

)

)

n

(

O

)

1

n

(

n

n

3

1

)

1

n

...

2

1

(

2

n

3

1

i

2

n

3

1

2

1

n

1

i

=

+

+

=

+

+

+

+

+

=

+

+

=

background image

60

Algorytmy i struktury danych

Wyznaczanie złożoności czasowej - przykłady

Przykład 3

Z

erowanie elementów tablicy leżących na i pod główną przekątną

int tab[n][n];

void zerowanie();

{

int i,j;

i=0;

// 1

while (i<n)

// 1

{

j=0;

// 1

while (j<=i)

// 1

{

tab[i][j]=0; // 1
j=j+1;

// 1

}
i=i+1;

// 1

}

}

Złożoność czasowa (z uwagi na wszystkie instrukcje):

)

n

(

O

2

)

1

n

(

n

3

n

3

1

))

1

i

(

3

3

(

1

)

3

3

(

1

)

n

(

T

2

1

n

0

i

i

0

j

1

n

0

i

=

+

+

+

=

=

+

+

+

=

+

+

=

=

=

=

=

background image

61

Algorytmy i struktury danych

 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 problemu rozmiaru n za pomocą czasów dla
podproblemów mniejszych rozmiarów.

 Możemy więc użyć narzędzi matematycznych, aby rozwiązać rekurencję

i w ten sposób otrzymać oszacowania czasu działania algorytmu.

Złożoność czasowa algorytmów rekurencyjnych

background image

62

Algorytmy i struktury danych

 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 algorytmu dla 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
problemu wyjściowego , to otrzymujemy rekurencję

Rekurencja dla algorytmu typu “dziel i zwycieżaj”

c

n

dla

c

n

dla

C(n)

D(n)

aT(n/b)

)

1

(

)

n

(

T

>

+

+

Θ

=

background image

63

Algorytmy i struktury danych

Przykład: algorytm sortowania przez scalanie



znajdujemy środek przedziału, zajmuje to czas stały D(n)=

Θ

(1)



rozwiązujemy rekurencyjnie dwa podproblemy, każdy rozmiaru

n/2, co daje czas działania 2 T(n/2)



łączymy dwa uporządkowane podciągi w jeden (uporzadkowany) w czasie

Θ

(n), a wiec C(n)=

Θ

(n).



Ostatecznie

 Można pokazać, że rozwiązaniem tej rekurencji jest T(n) =

Θ

Θ

Θ

Θ

(n log n)

Rekurencja dla algorytmu typu “dziel i zwycieżaj”

1

n

dla

1

n

dla

(n)

)

1

(

2T(n/2)

)

1

(

)

n

(

T

>

=

Θ

+

Θ

+

Θ

=

background image

64

Algorytmy i struktury danych

Metody rozwiązywania rekurencji:

1.

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

2.

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

3.

Metoda drzewa rekursji: uzupełniająca metodę podstawiania

4.

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ą.

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

background image

65

Algorytmy i struktury danych

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.

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

background image

66

Algorytmy i struktury danych

Przykład:



Postać rekurencji: T(n) = 2T(



n/2



) + n

 Zachodzi: T(1)=1; T(2)=4; T(3)=5, T(4)=12 ...

 Przewidywane rozwiązanie: T(n) = O(n lg n), tzn.

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, jeśli c

≥≥≥≥

1 zachodzi:

T(n)

≤≤≤≤

c n lg n

 Rozwiązanie T(n) = O(n lg n) jest poprawne dla c

2 i n

2

Metoda podstawiania

Dlaczego?

Oznaczenia:



a

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



a

 - najmniejsza liczba całkowita x taka, że x>a

0

c

>

Dlaczego?

background image

67

Algorytmy i struktury danych

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.

Metoda iteracyjna

background image

68

Algorytmy i struktury danych

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

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

background image

69

Algorytmy i struktury danych

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

}

+

=

=

1

n

dla

1

)

1

n

(

T

0

n

dla

1

)

n

(

T

Zło

ż

ono

ść

czasowa

:

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

Θ

Θ

Θ

Θ

(1)

background image

70

Algorytmy i struktury danych

1

)

0

(

T

1

)

0

(

T

)

1

(

T

...

1

)

2

n

(

T

)

1

n

(

T

1

)

1

n

(

T

)

n

(

T

=

+

=

+

=

+

=

)

0

(

T

)

1

(

T

...

)

1

n

(

T

1

n

)

0

(

T

)

1

(

T

...

)

1

n

(

T

)

n

(

T

+

+

+

+

+

=

+

+

+

+

Zatem:

T(n)= n+1=O(n)

Metoda iteracyjna - rozwinięcie rekurencji

+

=

=

1

n

dla

1

)

1

n

(

T

0

n

dla

1

)

n

(

T

Przykład 1 (cd.)

dodajemy stronami

background image

71

Algorytmy i struktury danych

Przykład 2:

 Postać rekurencji: T(n) = 3T(n/4) + n; T(1)=a

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

Metoda iteracyjna

)

n

(

)

4

3

(

n

4

n

3

...

4

n

3

4

n

3

4

n

3

n

T(n)

n

log

0

k

k

n

log

n

log

3

3

2

2

4

4

4

Θ

=

=

+

+

+

+

+

=

 Iterujemy tak długo, aż osiągniemy warunek brzegowy:

 i-ty składnik ciągu wynosi 3

i

n/4

i

 Iterowanie kończymy, gdy n/4

i

= 1, czyli i = log

4

n

1

q

,

q

1

q

1

a

S

k

1

k

=

background image

72

Algorytmy i struktury danych

 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)

Metoda drzewa rekursji

background image

73

Algorytmy i struktury danych

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

2

, T(1)=a

n

2

T(n/2)

T(n/2)

T(n) =

Θ

(n

2

)

Zatem, ostateczny wynik:

n

2

T(n/4)

T(n/4)

(n/2)

2

(n/2)

2

T(n/4)

T(n/4)

n

2

n

2

/2

n

2

/4

w sumie:

Θ

Θ

Θ

Θ

(n

2

)

Drzewo rekursji

Przykład 1

...

Jaką maksymalną wysokość ma drzewo rekursji?

...

background image

74

Algorytmy i struktury danych

T(n) =

Θ

(n log n )

Zatem, ostateczny wynik:

T(n) = T(n/3) + T(2n/3) + n, T(1)=a

n

n/9

2n/9

n/3

2n/3

2n/9

4n/9

log

3/2

n

wysokość drzewa: log

3/2

n

Drzewo rekursji

Przykład 2

Dlaczego?

w sumie:

n

log

3/2

n

n

n

n

...

background image

75

Algorytmy i struktury danych

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

background image

76

Algorytmy i struktury danych

 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

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

Metoda rekurencji uniwersalnej

background image

77

Algorytmy i struktury danych

 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

dla pewnej stałej

ε

>0

, to

2. Jeśli to

3. Jeśli

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

Metoda rekurencji uniwersalnej

)

n

(

)

n

(

T

a

log

b

Θ

=

)

n

(

O

)

n

(

f

a

log

b

ε

=

)

n

(

)

n

(

f

a

log

b

Θ

=

)

n

log

n

(

)

n

(

T

a

log

b

Θ

=

)

n

(

)

n

(

f

a

log

b

ε

+

=

background image

78

Algorytmy i struktury danych

Interpretacja

 W każdym z trzech przypadków porównujemy funkcję

f(n)

z funkcją

 Rozwiązanie rekurencji zależy od większej z tych dwóch funkcji

 Jeśli funkcja jest większa (Przypadek 1), to rozwiązaniem rekurencji

jest

 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

,

czyli

T(n) =

Θ

( f(n) log n)

Metoda rekurencji uniwersalnej

a

log

b

n

)

n

log

n

(

)

n

(

T

a

log

b

Θ

=

a

log

b

n

)

n

(

)

n

(

T

a

log

b

Θ

=

background image

79

Algorytmy i struktury danych

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

 Ponieważ

, gdzie

ε

=1

, możemy zastosować przypadek 1

twierdzenia o rekurencji uniwersalnej i wnioskować że rozwiązaniem jest

T(n) =

Θ

Θ

Θ

Θ

( n

2

)

Metoda rekurencji uniwersalnej

2

9

log

a

log

n

n

n

3

b

=

=

)

n

(

O

)

n

(

f

9

log

3

ε

=

background image

80

Algorytmy i struktury danych

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

 Stosujemy przypadek 2, gdyż

a zatem rozwiązaniem rekurencji jest

Metoda rekurencji uniwersalnej

1

n

n

n

0

1

log

a

log

2

3

b

=

=

=

)

1

(

)

n

(

)

n

(

)

n

(

)

n

(

f

0

1

log

a

log

2

3

b

Θ

=

Θ

=

Θ

=

Θ

=

)

n

(log

)

n

log

n

(

)

n

log

n

(

)

n

(

T

1

log

a

log

2

3

b

Θ

=

Θ

=

Θ

=

background image

81

Algorytmy i struktury danych

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

 Ponieważ

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

Metoda rekurencji uniwersalnej

793

,

0

3

log

a

log

n

n

n

4

b

=

=

)

n

(

)

n

(

f

3

log

4

ε

+

=

background image

82

Algorytmy i struktury danych

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

Wydaje się, że powinien to być przypadek 3, gdyż

f(n)=n log n

jest

asymptotycznie większe niż (ale nie wielomianowo!)

 Stosunek jest asymptotycznie mniejszy niż

n

ε

dla

każdej dodatniej stałej

ε

.

 W konsekwencji rekurencja ta “wpada” w lukę między przypadkiem 2 i 3.

 Nie można zatem zastosować twierdzenia o rekurencji uniwersalnej

Metoda rekurencji uniwersalnej

n

n

a

log

b

=

n

n

a

log

b

=

n

/

n

log

n

n

/

)

n

(

f

a

log

b

=

background image

83

Algorytmy i struktury danych

Zadanie

Wykorzystując metodę rekurencji uniwersalnej określić oszacowanie

asymptotyczne dla rekurencji:

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

b) T(n) = T(2n/3) + 1

background image

84

Algorytmy i struktury danych


Wyszukiwarka

Podobne podstrony:
AiSD W1 1
Farmakologia pokazy, Podstawy Farmakologii Ogólnej (W1)
W1 wprow
Przygotowanie PRODUKCJI 2009 w1
w1 czym jest psychologia
PD W1 Wprowadzenie do PD(2010 10 02) 1 1
wde w1
Finanse W1
W1 ZLO
AM1 2005 W1
w1

więcej podobnych podstron