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

Ŝ

Ŝ

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 wykorzystujący strukturę danych 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 wykorzystujący strukturę danych jest całkowicie 
poprawny 
ze względu na specyfikację <wpwkjeŜeli dla wszystkich 
danych w strukturze 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  (np. wielkość pliku lub tablicy)
a ilością czasu 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 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

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

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

1 101 003       91%                  9%            0.0003%  

0.09%

10

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

n

o

,

Ŝ

e dla ka

Ŝ

dego 

zachodzi  



Zgodnie z powy

Ŝ

sz

ą

 definicj

ą

, zwi

ą

zek mi

ę

dzy funkcjami 

f

g

mo

Ŝ

na wyrazi

ć

 stwierdzaj

ą

c, 

Ŝ

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

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 opisuje funkcja

f(n) = n

+ 100n + log n + 1000



Wówczas, wykorzystuj

ą

c O-notacj

ę

, mo

Ŝ

na napisa

ć

Ŝ

n

+ 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

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

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

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

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 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 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 jest rzędu g, jeśli 
(

c

1

>0, c

2

>0, 

n

o

N) 

n>n

o

c

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

),

≠ Ω

(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

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

≤≤≤≤

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

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

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

Drzewo rekursji

Przykład 2

Dlaczego?

w sumie:

log

3/2

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

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

Metoda rekurencji uniwersalnej

background image

77

Algorytmy i struktury danych

 Niech 

a

1

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

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