lecture3 complexity introduction

background image

Zajęcia nr 2/3

Analiza wydajności algorytmów

– złożoność i jej miary

Algorytmy i struktury danych

Prowadzący

:

dr hab.inż. ANDRZEJ WALCZAK,

prof.WAT

background image

Złożoność obliczeniowa algorytmów

-

analiza algorytmów

Analiza algorytmów - złożoność obliczeniowa jest podstawową

własnością określaną dla algorytmów. Zadaniem analizy

algorytmu jest określenie tej złożoności, a co za tym idzie

określenie realizowalności algorytmu oraz jego wydajności..

• Algorytmy

realizowalne

mają

najczęściej

złożoność

aproksymowaną funkcją:

liniową (wielomianem)
logarytmiczną.

Mówi się, że takie algorytmy określają zadania ze zbioru

zadań

rozwiązywalnych

(a

co

za

tym

idzie

implementowalnych). Najszybsze są algorytmy o złożoności

logarytmicznej.

Nie potrafimy skutecznie implementować algorytmów o

złożoności wykładniczej.

background image

Rodzaje złożoności algorytmów

Złożoność zasobowa (pamięciowa) - wyrażana w skali

zajętości zasobów (PAO, pamięci zewnętrznych itp.)
niezbędnych dla realizacji algorytmu

Złożoność czasowa - wyrażana w skali czasu wykonania

algorytmu (liczba kroków, aproksymowany czas
rzeczywisty)

• Przykłady szacowania wartości złożoności algorytmów

będziemy realizować przy okazji konkretnych
przykładów na kolejnych wykładach

• De facto wszystko przenosi się w konsekwencji na

koszty eksploatacji oprogramowania, realizującego
analizowany algorytm

background image

Czynniki wpływające na złożoność

algorytmów

Rozmiar zadania - rozmiar danych niezbędnych dla

realizacji algorytmu. Bierze się pod uwagę:

rozmiar danych wejściowych
rozmiar danych roboczych
rozmiar danych wyjściowych

Czas działania algorytmu - liczba kroków przekładająca

się na czas faktycznej pracy maszyny realizującej
algorytm. Istotne znaczenie mają w tym przypadku:

– złożoność obliczeniowa rozwiązywanego zadania
– sposób konstrukcji algorytmu
– wydajność maszyny realizującej obliczenia

background image

Funkcja kosztu algorytmu

Funkcja kosztu zasobowego algorytmu stanowi odwzorowanie

rozmiaru zadania w umowne jednostki kosztu algorytmu (np.
rozmiar zasobów, jednostki monetarne (złotówki, dolary itp.)):

FKz : RZ -> WKz, gdzie: FKz - funkcja kosztu zasobowego,

RZ - rozmiar zadania,

WKz - wartość kosztu zasobowego,

Dla potrzeb wykładu pozostaniemy jedynie przy

kosztach zasobowych algorytmów.

• Jednak nie tylko koszty zasobowe są brane pod uwagę. Często

analizuje się inne koszty realizacji algorytmów (np. pieniądze).

Przejrzyj ponownie slajdy z analizą efektywności algrytmu

Fibonacciego. Co możesz powiedzieć na temat jego
złożoności obliczeniowej?

background image

Asymptotyczna złożoność

algorytmów

Asymptotyczna oznacza, że dla dostatecznie dużych danych

wejściowych n liczymy tylko rząd wielkości czasu działania
algorytmu;

• Zapiszmy formalnie asymptotyczną górną granicę

(pesymistyczny czas działania algorytmu):

O( g(n) ) = { f(n): 0 <= f(n) <= c*g(n), c > 0, n > N}

Jest to przykład tak zwanej notacji dużego O. Fakt, że
dana wielkość jest rzędu f zapisujemy symbolicznie
jako O(f).

W zapisie formalnym złożoności wskazano, że
złożoność zależy od liczby przetwarzanych danych n.

background image

Przykłady asymptotycznej

złożoności algorytmów

• W praktyce, większość algorytmów ma złożoność zaliczaną do

jednej z poniższych klas:

log n, czyli złożoność logarytmiczna. Podstawa logarytmu

nie ma tu znaczenia, gdyż jej zmiana oznacza jedynie

przemnożenie przez stałą.

n, n

2

, ..., czyli złożoność liniowa, kwadratowa, sześcienna

lub inaczej złożoność wielomianowa, gdyż funkcje te są

wielomianami zmiennej n. Problemy dla których istnieją

algorytmy o złożonosci co najwyżej wielomianowej,

nazywane są problemami typu P (ang. polynomial, czyli

wielomian).  Jest to bardzo ważna klasa algorytmów, gdyż

algorytmy które mają złożoność czasową co najwyżej

wielomianową, (czyli są O(n

k

), k=1,2,...) dają się w

użytecznym czasie wykonać na komputerach dla większości

rzeczywistych problemów.

n log n czyli złożoność liniowo logarytmiczna.

– n

log n

 , czyli złożoność podwykładnicza

– 2

n

, czyli złożoność wykładnicza

– n!, czyli złożoność wykładnicza n!

background image

Przykłady asymptotycznej

złożoności algorytmów

• Pojedyncza instrukcja

– s1; s2; …. ; sk

• O(1) dopóki k jest stałą

• Pojedyncza pętla

– for(i=0;i<n;i++) { s; }

• Założenie: s jest O(1)
• Złożoność czasowa jest: n O(1) lub O(n)

• Zagnieżdżona pętla:

– for(i=0;i<n;i++)

for(j=0;j<n;j++) { s; }

– Złożoność jest: n O(n) lub O(n

2

)

background image

Analiza wydajności algorytmów

– złożoność i jej miary

• Do opisu wydajności (złożoności) algorytmów używa się

najczęściej tzw. O notacji. Opisuje ona górne
ograniczenie funkcji z dokładnością do czynnika stałego.

• Wydajność algorytmu rozumiemy ogólnie jako liczbę

operacji wykonywanych w algorytmie w zależności od
liczby przetwarzanych danych. Jeśli dane mają rozmiar n
to złożoność algorytmu zapiszemy jako pewną funkcję
f(n).

• Notacje O rozumiemy jako wskazanie funkcji g(n) takiej,

że istnieje takie n

0

, że dla n>n

0

zawsze f(n)<cg(n) gdzie

c jest stałą. Notacja O wskazuje nam wiec majorantę
albo inaczej ograniczenie górne funkcji złożoności
algorytmu.

background image

Analiza wydajności algorytmów

– złożoność i jej miary

• Symetrycznie do O-notacji stosuje się 

-notację, która oznacza ograniczenie
złożoności od dołu czyli minorantę.

• Notacje  rozumiemy jako wskazanie

funkcji g(n) takiej, że istnieje takie n

0

,

że dla n>n

0

zawsze f(n)>cg(n) gdzie c

jest stałą. Notacja  wskazuje nam wiec

minorantę albo inaczej ograniczenie
dolne funkcji złożoności algorytmu.

background image

Analiza wydajności algorytmów

– złożoność i jej miary

• Łatwo zauważyć, że definicje złożoności

mają charakter asymptotyczny co
oznacza, że rozumiemy je jako zdążanie
złożoności

algorytmu

do

funkcji

wskazanej przez O-notację albo -

notację przy odpowiednio dużej liczbie
zmiennych

w

algorytmizowanym

zdaniu.

background image

Reguły O-notacji

• Oceniając liczbę operacji w algorytmie możemy

pominąć składniki stałe wobec składników
zależnych od n bo wraz ze wzrostem n udział
składników stałych będzie tak mały, że możemy go
zaniedbać. Podobnie w oszacowaniu złożoności
możemy uzasadnić pomijanie czynników stałych.
Jeśli algorytm zawiera kilka składowych
elementów, z których każdy wnosi swoją złożoność
tak, że możemy skonstruować funkcję f(n) =
n

3

+n

2

+n+..., to do oceny majoranty g(n) bierzemy

tylko składnik o najwyższym wykładniku.

background image

Formalizm O-notacji

• Składniki stałe zapisujemy jako O(1) czyli

O(const) = O(1)

• Pomijamy czynniki stałe O(const*f) = c O(f) = O(f)
• Dodawanie elementów składowych jest

uwzględniane przez wybranie składnika o
najwyższej potędze O(f

1

) + O(f

2

) = O(f

1

+f

2

) =

max(O(f

1

), O(f

2

))

• Jeśli mnożone są elementy składowe o różnej

złożoności to mnożenie ulega zachowaniu O(f

1

)

O(f

2

) = O(f

1

*f

2

)

background image

Przykłady O-notacji

złożonoś

ć

przykład

O(1)

Pobieranie pierwszego elementu ze

zbioru danych

O(lg n)

Podział n elementowego zbioru na

pół, następnie podział części na pół
itd.

O(n)

Przeglądanie zbioru n danych

background image

Przykłady O-notacji

złożonoś

ć

przykład

O(n lg n) Kolejne podziały zbioru na pół

połączone z ich przeszukiwaniem

O(n

2

)

Przeglądanie zbioru n

elementowego raz dla każdego

elementu z innego równolicznego

zbioru danych

O(2

n

)

Generowanie wszystkich możliwych

podzbiorów zbioru n danych

background image

Inne typy notacji złożoności

algorytmów

• Definicja: funkcja f(n) ma złożoność

(g(n)) wtedy, kiedy istnieją dwie

dodatnie liczy c oraz N takie, że
f(n)>=cg(n) dla wszystkich n>=N.

• Widać, że g(n) jest ograniczeniem f(n) z

dołu, czyli minorantą badanej funkcji.

background image

Inne typy notacji złożoności

algorytmów

• Definicja: f(n) ma złożoność

(g(n)), jeśli istnieją dodatnie

liczby c

1

, c

2

oraz N takie, że

c

1

g(n)=<f(n)=<c

2

g(n) dla

wszystkich n>=N.

• Czyli szukamy w tej notacji funkcji

g(n) takiego samego rzędu jak f(n)

background image

Inne typy notacji złożoności

algorytmów

• Po co są wprowadzane różne typy

notacji? Otóż dlatego, że notacja
za pomocą majoranty O(f(n)) może
prowadzić do uznania niektórych
algorytmów za zbyt złożone,
podczas, gdy w notacji

(f(n)) albo

(f(n)) mogą zostać przyjęte za

wystarczająco wydajne.

background image

Złożoność pesymistyczna,

optymistyczna i średnia

• Przykład: Złożoność wyszukiwania elementu

w tablicy n-elementowej. Możemy trafić od

razu – przypadek najlepszy- element

szukany to T[0] i złożoność otrzymana to

O(1), albo po przeszukaniu całej tablicy czyli

element szukany to T[n] i złożoność O(n).

• Mówimy, że złożoność pesymistyczna to

taka,

która

poprzez

zadanie

danych

wejściowych do algorytmu powoduje, że

wykona się on maksymalną możliwą liczbę

razy.

background image

Złożoność pesymistyczna,

optymistyczna i średnia

• Złożoność optymistyczna to ten przypadek,

w którym „trafiamy najszybciej jak można
w rozwiązanie”. Każdy z przypadków
zależy od doboru danych wejściowych. Czy
możemy ich dobór przewidzieć „a priori”
czyli przed eksperymentem?

• Definiuje się złożoność średnią ulokowaną

pomiędzy przypadkiem skrajnie złym i
skrajnie dobrym

background image

Złożoność pesymistyczna,

optymistyczna i średnia

• Oznaczmy przez p prawdopodobieństwo, że

element x znajduje się w tablicy i załóżmy, że
wszystkie lokalizacje elementu x są jednakowo
prawdopodobne. Czyli z prawdopodobieństwem
1-p element w tablicy nie występuje. Oznaczmy
przez Z

i, n

zbiór takich i, że 0<i<n oraz x

znajduje się na i-tym miejscu w tablicy. Przez Z

n,n

oznaczymy zbiór, w którym x jest nieobecne.

Wobec założeń zapiszemy:

• P(Z

i,n

) = p/n oraz P(Z

n,n

) = 1-p

background image

Złożoność pesymistyczna,

optymistyczna i średnia

• Złożoność odpowiednią algorytmu oznaczymy

jako:

• f(Z

i,n

) = i oraz f(Z

n,n

) = n

• Średnia złożoność algorytmu w analizowanym

przykładzie to:

 

2

1

1

1

1

,

1

,

p

n

n

p

n

p

i

n

p

Z

f

Z

P

f

n

i

i

n

N

i

i

n

average

n

i

n

n

i

1

2

1

background image

• Z definicji złożoności w przypadku

średnim widać, że jest ona
równoznaczna z pojęciem wartości
oczekiwanej statystycznie

Złożoność pesymistyczna,

optymistyczna i średnia

   

i

n

n

i

i

n

average

Z

f

Z

P

f

,

0

,

background image

Złożoność pesymistyczna,

optymistyczna i średnia

• Jeśli element znajduje się w tablicy czyli

p=1, to średnia złożoność w
analizowanym przykładzie wynosi:

• f = (n+1)/2.

• Tylu kroków średnio wymaga znalezienie

elementu poszukiwanego wtedy, kiedy
prawdopodobieństwa znalezienia dla
każdego losowania są jednakowe.

• O jakim rodzaju złożoności powinniśmy

mówić kiedy analizujemy O-notację?

background image

Złożoność zamortyzowana

• Widoczne było w przykładzie, że dane

wpływają na złożoność algorytmu. A co

będzie w przypadku algorytmów, w których

poszczególne ich części (podprogramy)

zmieniają

dane

wykorzystywane

w

pozostałych?

Przykładowo

jeśli

przeszukiwana tablica będzie wcześniej

posortowana

czyli

uporządkuje

swoje

elementy

rosnąco

lub

malejąco,

to

znalezienie elementu wybranego będzie z

pewnością trwało krócej. Mówimy, że

złożoność

zostanie

w

takiej

sytuacji

zamortyzowana.

background image

Złożoność zamortyzowana

• Analiza w przypadku zamortyzowanym nie

jest więc analizą złożoności pojedynczego
algorytmu ale analizą sekwencji (albo
ogólniej zbioru) kilku algorytmów. W
najprostszym

przybliżeniu

możemy

przyjmować,

że

oszacowana

złożoność

zamortyzowana jest sumą złożoności każdego
z algorytmów występującego w analizowanej
sekwencji. Można tak przyjąć wówczas, kiedy
poszczególne

algorytmy

od

siebie

niezależne i współpracują sekwencyjnie.

background image

Złożoność zamortyzowana

• Wiemy, że złożoność zależy od postaci

danych wejściowych. Definiuje się funkcję

nazywaną funkcją potencjału danych,

która przypisuje danym i-tego rodzaju liczbę

określającą koszty operacji na tych danych.

Wówczas zamortyzowany koszt operacji i-tej

zapiszemy:

kosztAmort(op

i

)=koszt(op

i

)+f.potencjału

(ds

i

)-f.potencjału(ds

i-1

)

• Jeśli mamy m takich operacji to koszt

zamortyzowany jest sumą kosztów dla

wszystkich m operacji

background image

Techniki wyznaczania złożoności nie

zamortyzowanych

• Budowanie

funkcji

f(n)

zależności

pomiędzy liczbą danych n, a liczbą operacji

w

algorytmie

w

formie

tabeli

przyporządkowania

(pokazano

przy

analizie rekurencji Fibonacciego jako

liczbę podstawień i liczbę dodawań).

• Tworzenie

postaci

kombinatorycznej

funkcji dyskretnej f(n) na podstawie ww.

tabeli lub innych danych z matematyki

dyskretnej i ocena majoranty O(g(n)) dla

tej funkcji (albo innego wariantu notacji).

• Metoda równań rekurencyjnych.

background image

Równania rekurencyjne

• DEFINICJA

• RÓWNANIE POSTACI

JAK PO PRAWEJ

NAZYWAMY

RÓWNANIEM

REKURENCYJNYM,

HOMOGENICZNYM ZE

STAŁYMI

WSPÓŁCZYNNIKAMI ze

względu na t.

• Liniowe bo t występuje

tylko w pierwszej potędze

• Homogeniczne bo prawa

strona jest równa zeru

0

...

1

1

0

k

n

k

n

n

t

a

t

a

t

a

background image

Równania rekurencyjne - przykład

• Szereg

Fibonacciego
opisuje rekurencja
podana obok

• Pierwsze równanie

możemy zapisać
jako homogeniczne,
liniowe równanie
rekurencyjne

1

0

1

0

2

1

t

t

t

t

t

n

n

n

0

2

1

n

n

n

t

t

t

background image

Równania rekurencyjne

• DEFINICJA

• JEŻELI DANE JEST

RÓWNIANIE
REKURENCYJNE TO
JEGO RÓWNANIEM
CHARAKTERYSTYCZNY
M NAZYWAMY
WIELOMIAN ZMIENNEJ
r ZAPISANY OBOK
(czyli metoda
podstawiania)

0

...

0

1

1

0

r

a

r

a

r

a

k

k

k

0

...

1

1

0

k

n

k

n

n

t

a

t

a

t

a

background image

Równania rekurencyjne

• DEFINICJA

• ROZWIAZANIEM

LINIOWEGO,
HOMOGENICZNEGO
RÓWNANIA
REKURENCYJNEGO
WYRAZONEGO W
FORMIE
WIELOMIANOWEJ JEST
KOMBINACJA LINIOWA
POTĘG ZMIENNEJ r.

n

k

k

n

n

n

r

c

r

c

r

c

t

...

2

2

1

1

0

...

0

1

1

0

r

a

r

a

r

a

k

k

k

0

...

1

1

0

k

n

k

n

n

t

a

t

a

t

a

background image

Równania rekurencyjne

• Szereg

Fibonacciego ma
równanie
charakterystyczn
e jak obok

1

0

1

1

0

2

1

t

t

n

gdy

t

t

t

n

n

n

0

1

2

r

r

background image

Równania rekurencyjne

• Rozwiązanie dla t

n

ma

postać jak obok.
Współczynniki c

1

i c

2

określamy z
pozostających równań
rekurencji Fibonacciego
dla elementu przy n=0
oraz n=1.

• Takie dodatkowe

równania nazywamy
warunkami
początkowymi

n

n

n

c

c

t





 





 

2

5

1

2

5

1

2

1

background image

Równania rekurencyjne

• Warunki

początkowe dla
rekurencji
Fibonacciego
mają postać jak
obok

0

2

0

1

0

2

5

1

2

5

1





 





 

c

c

t

1

2

1

1

2

5

1

2

5

1





 





 

c

c

t

n

0

2

1

c

c

1

2

5

1

2

5

1

2

1





 





 

c

c

background image

Równania rekurencyjne

• Ostateczna forma

rozwiązania

powoduje, że wraz ze

wzrostem n rośnie

dokładność

potrzebna do

wyrażenia

pierwiastka z 5.

Widać także

jednoznacznie, że

jest to funkcja

wykładnicza.

5

1

,

5

1

2

1

c

c

5

2

5

1

2

5

1

n

n

n

t

 

 

background image

Równania rekurencyjne

• DEFINICJA

• RÓWNANIE POSTACI JAK PO

PRAWEJ NAZYWAMY

RÓWNANIEM

REKURENCYJNYM,

NIEHOMOGENICZNYM ZE

STAŁYMI

WSPÓŁCZYNNIKAMI ze

względu na t. Funkcja f(n) jest

dowolna.

• Liniowe bo t występuje tylko

w pierwszej potędze

• niehomogeniczne bo prawa

strona nie jest równa zeru

NIE ISTNIEJE OGÓLNA

METODA ANALITYCZNA

ROZWIAZYWANIA TAKICH

RÓWNAŃ

• Pokazać można rozwiązania

m.in.. Dla przypadku gdy

równanie da się sprowadzić do

postaci pokazanej obok gdzie

b to stałą a p(n) to wielomian.

 

n

f

t

a

t

a

t

a

k

n

k

n

n

...

1

1

0

 

n

p

b

t

a

t

a

t

a

k

n

k

n

n

...

1

1

0

background image

Równania rekurencyjne

• Jest to przykład

równania
rekurencyjnego
liniowego
niehomogenicznego z
warunkami
początkowymi. Po
stronie prawej mamy
stałą a więc jest to
przypadek
rozwiązywalny.

4

0

1

4

3

1

0

1

t

t

n

dla

t

t

n

n

n

background image

Równania rekurencyjne

• Jeśli zastąpić w nim n przez

n-1 to jest to równoważne
podzieleniu każdej ze stron
przez 4. Albo inaczej,
ponieważ pierwsze równanie
jest prawdziwe także dla
n=n+1, to dzieląc je przez 4
otrzymamy postać drugą,
która jest równoważna
pierwszej. Ponieważ wyniki
są sobie równoważne to
odejmowanie otrzymanych
równań stronami musi dać
równanie homogeniczne,
którego sposób
rozwiązywania już znamy.

0

3

4

7

4

4

4

3

4

4

3

2

1

1

1

1

2

1

n

n

n

n

n

n

n

n

n

t

t

t

t

t

t

t

background image

Równania rekurencyjne

• Po pomnożeniu przez 4:

0

12

7

2

1

n

n

n

t

t

t



0

4

3

12

7

2

r

r

r

r

n

n

n

c

c

t

4

3

2

1

 

n

n

n

t

t

t

3

4

4

;

4

;

0

1

1

0

background image

Podsumowanie i spis

zagadnień

• Co to jest złożoność i rozróżnienie złożoności

obliczeniowej oraz czasowej

• Miary złożoności i jej notacje
• Złożoność pesymistyczna, optymistyczna i średnia

algorytmów prostych

• Złożoność zamortyzowana algorytmów

sekwencyjnych i zbioru algorytmów
współpracujących

• Metody wyliczania złożoności
• Sposoby rozwiązywania wybranych typów równań

rekurencyjnych


Document Outline


Wyszukiwarka

Podobne podstrony:
Lecture 01 Introduction
Lecture1 Introduction Femininity Monstrosity Supernatural
Adler M An Introduction to Complex Analysis for Engineers
Feynman Lectures on Physics Complete Volumes 1,2,3 1376 pages
Lecture I Introduction to linguistics
Lecture1 Introduction Femininity Monstrosity Supernatural
Freitag Several complex variables local theory (lecture notes, web draft, 2001)(74s) MCc
Introduction to Algotrade lecture1
Cannas da Silva A Introduction to symplectic and Hamiltonian geometry (Rio de Janeiro lectures, 2002
lecture 1 introduction to NMR
The Notion of Complete Reducibility in Group Theory [lectures] J Serre (1998) WW
computational complexity lectures

więcej podobnych podstron