background image

TEORETYCZNE 

PODSTAWY 

INFORMATYKI

Prowadzący:

 

ppor. mgr inż. Mariusz 

CHMIELEWSKI

e-mail:

mchmiel@isi.wat.waw.pl

Temat 1:

Temat 1:

  

Analiza złożoności 

Analiza złożoności 

obliczeniowej algorytmów

obliczeniowej algorytmów

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

2

Analiza złożoności obliczeniowej

Analiza  złożoności  czasowej  algorytmu  (ang.  Time  complexity  analysis)  to 

określenie  liczby  wykonań  operacji  podstawowej  dla  każdej  wartości 
rozmiaru danych wejściowych.

Zakłada się że:

-

 nie uwzględniamy szczegółów implementacji algorytmu;

-

 

operacja 

elementarna 

jest 

zaimplementowana 

sposób 

najwydajniejszy z możliwych;

Wybór operacji podstawowej:

-

 zależy od specyfiki analizowanego algorytmu;

-

  potrzeb  przeprowadzanej  analizy  (nie  uwzględnia  się  instrukcji 
sterujących);

-

 możliwość wyboru więcej niż jednej operacji podstawowej;

Rodzaje złożoności czasowej:
1.

Złożoność czasowa w każdym przypadku – every-case time complexity

2.

Złożoność  czasowa  w  najgorszym  przypadku  –  worst-case  time 
complexity

3.

Złożoność  czasowa  w  średnim  przypadku  –  average-case  time 
complexity

4.

Złożoność  czasowa  w  najlepszym  przypadku  –  best-case  time 
complexity

Złożoność czasowa algorytmów

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

3

Rodzaje złożoności czasowej

Złożoność czasowa w każdym przypadku – every-case time complexity - 

T(n)

W przypadku, gdy operacja podstawowa jest zawsze wykonywana tę samą 
liczbę razy dla każdej realizacji problemu o rozmiarze n.

Złożoność czasowa w najgorszym przypadku – worst-case time complexity 

W(n)

W przypadku analizowanego algorytmu złożoność W(n) definiujemy jako 

maksymalna liczbę wykonań

operacji podstawowej dla danych wejściowych o rozmiarze n. 

Złożoność czasowa w średnim przypadku – average-case time complexity - 

A(n)

W przypadku analizowanego algorytmu złożoność A(n) definiujemy jako 

średnią (wartość oczekiwaną) 

liczbę wykonań operacji podstawowej dla danych wejściowych o rozmiarze 

n. 

Złożoność czasowa w najlepszym przypadku – best-case time complexity - 

B(n)

W przypadku analizowanego algorytmu złożoność B(n) definiujemy jako 

minimalną liczbę wykonań

operacji podstawowej dla danych wejściowych o rozmiarze n. 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

4

Wyszukiwanie sekwencyjne 

– przykład analizy algorytmu

Algorytm nie posiada złożoności w każdym przypadku – zależność od 
rozmiaru danych n.

Złożoność czasowa  w średnim przypadku

Operacja podstawowa: porównanie elementu w tablicy z x.

Rozmiar danych wejściowych: n, liczba elementów znajdujących 
się w tablicy

Przypadek gdy wyszukiwany element znajduje się w tablicy 
danych wejściowych:

Przypadek gdy wyszukiwany element nie znajduje się w tablicy 
danych wejściowych:

 

n

k

n

k

n

n

n

n

k

n

n

k

n

A

1

1

2

1

2

)

1

(

1

1

1

)

(

 

 

n

k

p

p

n

p

n

n

n

n

p

p

n

n

p

k

n

A

1

2

2

1

1

2

)

1

(

1

)

(

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

5

Wyszukiwanie sekwencyjne 

– przykład analizy algorytmu

Złożoność czasowa  w najgorszym przypadku

Operacja podstawowa: porównanie elementu w tablicy z x.

Rozmiar danych wejściowych: n, liczba elementów 
znajdujących się w tablicy

W(n) = n; przypadek kiedy ostatnim elementem w tablicy 
jest element poszukiwany a więc algorytm wykona n 
przebiegów

Złożoność czasowa  w najlepszym przypadku

Operacja podstawowa: porównanie elementu w tablicy z x.

Rozmiar danych wejściowych: n, liczba elementów 
znajdujących się w tablicy

B(n) = 1; przypadek kiedy nastąpi jedno wykonanie pętli 
ponieważ wyszukiwany element znajduje się na początku 
tablicy do przeszukiwania czyli x = S[1] gdzie S jest 
tablicą zawierająca dane do przeszukiwania natomiast x 
jest poszukiwanym elementem;

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

6

Złożoność obliczeniowa i 

asymptotyczna

Złożoność obliczeniowa:

 miara służąca do porównywania efektywności 

algorytmów. Mamy dwa kryteria efektywności: 

czas i pamięć

.

Do oceny efektywności stosujemy jednostki logiczne 
wyrażające związek miedzy rozmiarem danych 
(wielkość pliku lub tablicy) N a ilością czasu T 
potrzebna na ich przetworzenie.

Funkcja wyrażająca zależność miedzy  N  a T  jest 
zwykle bardzo 
skomplikowana, a jej obliczenie ma znaczenie 
jedynie w odniesieniu do 
dużych rozmiarów danych => 

przybliżona miara 

efektywności czyli
tzw. złożoność asymptotyczna.

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

7

Szacowanie złożoności obliczeniowej

O z n a c z e n i a :  
   -   a l g o r y t m   r o z w i ą z u j ą c y   d e c y z y j n y   p r o b l e m      ; 

D

n

  -  

z b i ó r   d a n y c h   r o z m i a r u     d l a   r o z w a ż a n e g o   p r o b l e m u ;  

  t (    -   l i c z b a   k r o k ó w   D T M   p o t r z e b n a   d o   r o z w i ą z a n i a  
k o n k r e t n e g o   p r o b l e m u  

n

I

D

  o   r o z m i a r z e  

 

n

z

N

  p r z y  

p o m o c y   a l g o r y t m u     


D e fi n i c j a    

Z ł o ż o n o ś c i ą   o b l i c z e n i o w ą   ( p e s y m i s t y c z n ą )   a l g o r y t m u     
n a z y w a m y   f u n k c j ę   p o s t a c i    

( 1 )    

 

 

n

I

I

W

D

:

t

n

α

 max

 

 

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

8

SZACOWANIE ZŁOŻONOŚCI 

OBLICZENIOWEJ

D e fi n i c j a    

M ó w i m y ,  

ż e  

a l g o r y t m  

   m a   z ł o ż o n o ś ć   o b l i c z e n i o w ą  

w i e l o m i a n o w ą ,   j e ś l i   i s t n i e j e   s t a ł a   c   >   0   o r a z   w i e l o m i a n   p ( n )   t a k i e ,  
ż e :  
 

 

 

n

cp

n

α

n

n

0

W

  

 

 

 

 

 

 

c o   z a p i s u j e m y

 

 

 

n

p

O

n

α

W

.  

W   i n n y c h   p r z y p a d k a c h   m ó w i m y ,   ż e   a l g o r y t m      m a   z ł o ż o n o ś ć  
w y k ł a d n i c z ą .

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

9

Definicja rzędów złożoności obliczeniowej

Niech R* =R

+

{0}. 

 

 
Mówimy, 

że 

funkcja 

f(x):R* R*  jest  rzędu

1

 

O(g(x))  (g(x):R* R*),  jeśli 
istnieje taka stała c
>0 oraz 

x

0

R*, że dla każdego xx

zachodzi  f(x)cg(x)  (f  nie 
rośnie szybciej niż g
). 

                              

                  

 

1

  

x

y

x

0

f(x)

cg(x)

f(x)=O(g(x))

[1] 

0.

c

 

pewnego

 

dla

   

)

(

)

(

lim

gdy   

   

)),

(

(

)

(

x

c

x

g

x

f

x

g

O

x

f

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

10

Definicja rzędów złożoności obliczeniowej

Mówimy, 

że 

funkcja 

f(x):R* R*  jest  rzędu

2

 

(g(x))  (g(x):R* R*),  jeśli 
istnieje taka stała c
>0 oraz 

x

0

R*, że dla każdego xx

zachodzi  g(x)cf(x)  (f  nie 

rośnie wolniej niż g). 

x

y

x

0

cf(x)

g(x)

[2] 

.

0

)

(

)

(

lim

   

lub

   

)

(

)

(

lim

gdy   

   

)),

(

(

)

(

x

x

c

x

g

x

f

x

g

x

f

x

g

x

f

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

11

Definicja rzędów złożoności obliczeniowej

Mówimy, 

że 

funkcja 

f(x):R* R*  jest  rzędu 
(g(x)

(g(x):R* R*)

jeśli istnieją takie stałe c

1

c

2

>0  oraz  x

0

R*,  że  dla 

każdego xx

0   

zachodzi  

    c

1

g(x)f(x)c

2

g(x)  

(f  rośnie tak samo jak g). 

x

y

x

0

f(x)

c

1

g(x)

c

2

g(x)

 

Jeżeli funkcja f(x) jest O(

g(x)) oraz (g(x)), to jest (g(x)) . 

 

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

12

Graficzna ilustracja notacji

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

13

Definicja rzędów złożoności obliczeniowej

P r a k t y c z n e   p r z y k ł a d y   d e fi n i c j i   r z ę d ó w  

  2   |s i n   x |   =   O ( l o g   x ) ,    

2   |s i n   x |   =   O ( 1 )  

  x

3

+ 5 x

2

+ 2 = O ( x

3

)       o r a z   x

3

+ 5 x

2

+ 2 =  ( x

3

) ,   w i ę c      

 

  x

3

+ 5 x

2

+ 2 =  ( x

3

)  

  f ( x ) = x

2

+ b + c =  ( x

2

) ,  

 

 

 

g d y ż  

a

c

a

b

x

x

|

|

,

|

|

max

2

0

z a c h o d z i :      

 

 

 

c

1

g ( x )  f ( x )  c

2

g ( x )   d l a  

a

c

4

1

1

,  

a

c

4

7

2

,   g ( x ) = x

2

     

 

)1

(

1

1

2

O

x

,  

1

0

x

x

  o r a z   n p .   d l a    1 ;  

  x ! = O ( x

x

) ,    

1

0

x

x

  o r a z   n p .   d l a    1 .  

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

14

Własności funkcji rzędów złożoności 

obliczeniowej

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 dodatniego j.

Z  tych  wszystkich  własności  wynika,  ze  dowolny 
wielomian  jest  „duże  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 dodatniego j).

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

15

Własności funkcji rzędów złożoności 

obliczeniowej

Własność 5:

Własność 5:

 

 

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

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

Własność 6:

Własność 6:

 

 

Funkcja log

Funkcja log

a

a

n jest  O(log

n jest  O(log

b

b

n) dla dowolnych a i b większych 

n) dla dowolnych a i b większych 

niż 1.

niż 1.

Własność 7: 
log

a

n jest O(log

2

n)  dla dowolnego dodatniego a.

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  niż 
logarytmiczna,  jednak  zaledwie  kilka  spośród  nich, jak 
O(log

2

 log

2

n) czy O(1) ma praktyczne znaczenie.

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

16

Wymagany czas obliczeń dla 

algorytmów różnej złożonosci

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

17

Własności funkcji rzędów złożoności 

obliczeniowej - Przykład

P r z y k ł a d   2  
D z i a ł a n i a   n a   f u n k c j a c h   r z ę d ó w   z ł o ż o n o ś c i ,   n p . :  

 

)

(

)

(

2

1

3

2

2

2

2

n

n

n

n

n

 

 

P i e r w s z e   z   r ó w n a ń   m ó w i ,   ż e   i s t n i e j e   p e w n a   f u n k c j a   )   ( )  

t a k a ,   ż e  

)

(

2

1

3

2

2

2

n

f

n

n

n

  d l a   w s z y s t k i c h   .  

 

D r u g i e ,   ż e   d l a   k a ż d e j   f u n k c j i   )   ( )   i s t n i e j e   p e w n a   f u n k c j a  

)   ( n

2

)  

t a k a ,  

ż e  

)

(

)

(

2

2

n

h

n

g

n

 

d l a  

w s z y s t k i c h  

.    

 

Z   i n t e r p r e t a c j i   t e j   w y n i k a ,   ż e  

)

(

1

3

2

2

2

n

n

n

.  

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

18

Własności funkcji rzędów złożoności obliczeniowej 

Własności funkcji rzędów złożoności obliczeniowej 

potencjalne problemy

potencjalne problemy

Celem wprowadzonych wcześniej sposobów zapisu (notacji) jest 
porównanie 

efektywności 

rozmaitych 

algorytmów 

zaprojektowanych do rozwiązania tego samego problemu. 

Jeżeli  będziemy  stosować  tylko  notacje  „wielkie  O”  do 
reprezentowania 
złożoności  algorytmów,  to  niektóre  z  nich  możemy 
zdyskwalifikować 

zbyt 

pochopnie.

Załóżmy,  że  mamy  dwa  algorytmy  rozwiązujące  pewien 
problem, wykonywana przez nie liczba operacji to odpowiednio 
10

8

n i 10n

2

Pierwsza funkcja jest O(n), druga O(n

2

). 

Opierając się na informacji dostarczonej przez notacje „wielkie 
O”  odrzucilibyśmy  drugi  algorytm,  ponieważ  funkcja  kosztu 
rośnie zbyt szybko. 

Spełnione  jest  to  jednak  dla  odpowiednio  dużych  n,  ponieważ 
dla  n<10

7

  drugi  algorytm  wykonuje  mniej  operacji  niż 

pierwszy !!!. 

Istotna  jest  więc  tez  stała  (10

8

),  która  w  tym  przypadku  jest 

zbyt duża, aby notacja była znacząca.

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

19

Metody mierzenia czasu działania 

algorytmu

Sposób  pomiaru  ilości  pracy  wykonanej  przez  algorytm  powinien 

zapewniać: 

 

  porównanie efektywności dwóch różnych algorytmów rozwiązujących ten 

sam problem; 

 

 

  oszacowanie faktycznej wydajności metody, abstrahując od komputera, 

języka  programowania,  umiejętności  programisty  i  szczegółów 

technicznych  implementacji  (sposobu  inkrementacji  zmiennych 

sterujących  pętli,  sposobu  obliczania  indeksów  zmiennych  ze 

wskaźnikami itp.); 

WNIOSEK: 

Dobrym  przybliżeniem  czasochłonności  algorytmu  jest 

obliczenie  liczby  przejść  przez 

wszystkie pętle w algorytmie

.  

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

20

Oszacowanie złożoności algorytmu - 

wytyczne

W  praktyce  zlicza  się  tzw.  operacje  podstawowe  dla  badanego 

problemu  lub  klasy  rozważanych  algorytmów,  tj.  takie,    które  są 

najczęściej  wykonywane  (ignorując  pozostałe  operacje  pomocnicze, 

takie jak instrukcje inicjalizacji, instrukcje organizacji pętli itp.). 

 

 

Ponieważ  większość  programów  to  programy  złożone  z  wielu 

modułów  lub  podprogramów,  a  w  każdym  takim  podprogramie  inna 

instrukcja  może  grać  rolę  operacji  podstawowej,  więc  fragmenty 

większej  całości  analizuje  się  zwykle  oddzielnie  i  na  podstawie 

skończonej  liczby  takich  modułów  szacuje  się  czasochłonność 

algorytmu jako całości. 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

21

SZACOWANIE ZŁOŻONOŚCI 

OBLICZENIOWEJ

Jak mierzyć czas działania algorytmu?, c.d.

Jak mierzyć czas działania algorytmu?, c.d.

Tabela 1    Przykłady operacji podstawowych dla    

        typowych problemów obliczeniowych 

 

Lp. 

Problem 

Operacja 

1. 

 

 

2. 

 

 

 

3. 

 

 

4. 

Znalezienie x na liście 

nazwisk. 

 

Mnożenie dwóch macierzy 

liczb rzeczywistych. 

 

 

Porządkowanie liczb. 

 

 

Wyznaczanie drogi 

najkrótszej w grafie zadanym 

w postaci listy sąsiadów. 

Porównanie x z pozycją na 

liście. 

 

Mnożenie dwóch macierzy 

liczb typu real (lub mnożenie 

i dodawanie). 

 

Porównanie dwóch liczb  

(lub porównanie i zamiana). 

 

Operacja na wskaźniku listy. 

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

22

SZACOWANIE ZŁOŻONOŚCI 

OBLICZENIOWEJ

Jak mierzyć czas działania algorytmu?, c.d.

Jak mierzyć czas działania algorytmu?, c.d.

Zalety zliczania operacji podstawowych: 
  możliwość przewidywania zachowania się algorytmu dla 

dużych rozmiarów danych (jeżeli łączna liczba operacji 

jest proporcjonalna do liczby operacji podstawowych); 

 

  swoboda wyboru operacji podstawowej.  

W  skrajnym  przypadku  można  wybrać  rozkazy  maszynowe  konkretnego 

komputera.  Z  drugiej  strony  jedno  przejście  przez  instrukcję  pętli  można 

również  potraktować  jako  operację  podstawową.  W  ten  sposób  możemy 

manipulować stopniem precyzji w zależności od potrzeb. 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

23

Przykłady praktyczne mierzenia 

złożoności obliczeniowej

Przykład 4:  Prosta pętla

   

for (i=sum=0; i<n; i++) sum+=a[i];

Powyższa pętla powtarza się n razy, podczas każdego jej przebiegu realizuje 
dwa przypisania: aktualizujące zmienną „sum” i zmianę wartości zmiennej „i”. 
Mamy zatem 2n przypisań podczas całego wykonania pętli; jej 

asymptotyczna złożoność wynosi O(n).

asymptotyczna złożoność wynosi O(n).

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

24

Przykłady praktyczne mierzenia 

złożoności obliczeniowej

Przykład 5:  Pętla zagnieżdżona

   

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

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

Na  samym  początku  zmiennej  „i”  nadawana  jest  wartość  początkowa. 
Pętla  zewnętrzna  powtarza  się  n  razy,  a  w  każdej  jej  iteracji  wykonuje 
się wewnętrzna pętla oraz instrukcja przypisania wartości zmiennym „i”, 
„  j”,  „  sum”.  Pętla  wewnętrzna  wykonuje  się  „i”  razy  dla  każdego    i  e 
{1,...,n-1},  a  na  każdą  iteracje  przypadają  dwa  przypisania:jedno  dla 
„sum”, jedno dla „j”. Mamy zatem 
     1 + 3n + 2(1+2+...+n-1) = 1 + 3n + n (n-1) = O(n) + O(n

2

) = O(n

2

przypisań wykonywanych w całym programie. 
Jej 

asymptotyczna złożoność wynosi O(n

asymptotyczna złożoność wynosi O(n

2

2

).

).

Pętle  zagnieżdżone  mają  zwykle  większą  złożoność  niż  pojedyncze, 

Pętle  zagnieżdżone  mają  zwykle  większą  złożoność  niż  pojedyncze, 

jednak nie musi tak być zawsze.

jednak nie musi tak być zawsze.

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

25

Przykłady praktyczne mierzenia 

złożoności obliczeniowej

Analiza tych dwóch przypadków była stosunkowo prosta ponieważ 
liczba iteracji nie zależała od wartości elementów tablicy.
Wyznaczenie złożoności asymptotycznej jest trudniejsze jeżeli 
liczba iteracji nie jest zawsze jednakowa. 

Przykład 6:  Znajdź najdłuższą podtablicę zawierającą 
liczby uporządkowane rosnąco.

   

for (i=0; len=1; i<n-1; i++) {

          for (i1=i2=k=i; k<n-1 && a[k]<a[k+1]; k++,i2++);
               if(len < i2-i1+1)  len=i2-i1+1;   }

=> Jeśli liczby w tablicy są uporządkowane malejąco, to pętla zewnętrzna
    wykonuje się n-1 razy, a w każdym jej przebiegu pętla wewnętrzna 
    wykona się tylko raz. Złożoność algorytmu jest więc 

O(n).

O(n).

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

26

Przykłady praktyczne mierzenia 

złożoności obliczeniowej

Analiza tych dwóch przypadków była stosunkowo prosta ponieważ 
liczba iteracji nie zależała od wartości elementów tablicy.
Wyznaczenie złożoności asymptotycznej jest trudniejsze jeżeli 
liczba iteracji nie jest
zawsze jednakowa. 

Przykład 6:  Znajdź najdłuższą podtablicę zawierającą 
liczby uporządkowane rosnąco.

   

for (i=0; len=1; i<n-1; i++) {

          for (i1=i2=k=i; k<n-1 && a[k]<a[k+1]; k++,i2++);
               if(len < i2-i1+1)  len=i2-i1+1;   }

Jeśli liczby w tablicy są uporządkowane rosnąco, to pętla zewnętrzna wykonuje się 
n-1 razy, a w każdym jej przebiegu pętla wewnętrzna wykona się i razy dla i {1,...,n-1}.  

    Złożoność algorytmu jest więc  

O(n

O(n

2

2

).

).

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

27

Przykłady praktyczne mierzenia 

złożoności obliczeniowej 

Analiza tych dwóch przypadków była stosunkowo prosta ponieważ 
liczba iteracji nie zależała od wartości elementów tablicy.
Wyznaczenie złożoności asymptotycznej jest trudniejsze jeżeli 
liczba iteracji nie jest 
zawsze jednakowa. 

Przykład 6:  Znajdź najdłuższą podtablicę zawierającą 
liczby uporządkowane rosnąco.

   

for (i=0; len=1; i<n-1; i++) {

          for (i1=i2=k=i; k<n-1 && a[k]<a[k+1]; k++,i2++);
               if(len < i2-i1+1)  len=i2-i1+1;   }

=> Z reguły dane nie są uporządkowane i ocena złożoności algorytmu jest
    rzeczą niełatwą, ale bardzo istotną. Staramy się wyznaczy złożoność
    w „przypadku optymistycznym”, „przypadku pesymistycznym” oraz
   „przypadku średnim”. 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

28

Sortowanie stabilne

Definicja:

Metoda sortowania jest stabilna, jeśli 
zachowuje względną kolejność elementów o 
jednakowych kluczach.

Oznaczenia : sortujemy tablicę:
      ElemType a[n];
Definiujemy funkcję 
      replaceElements( x, y) 
,która zamienia wartości dwóch elementów

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

29

Sortowanie bąbelkowe (bubblesort)

      for (i = n-1; i>=1   ; i--) 

for (j = 0  ; j<=i-1 ; j++)

           if (a[j]>a[j+1]) 

replaceElements (a[j],a[j+1]);

Idea działania:
w i-tej iteracji, kolejne zamiany w zakresie a[0..i-1] powodują, że największy spośród elementów 

w a[0..i-1] trafia na miejsce o indeksie "i-1"; iteracja jest powtarzana dla i=n-1,n-2,...,1.

Złożoność:

Operacjami dominującymi są porównania a[j]>a[j+1]. Jest ich:

(n-1) + (n-2) + . . . + 1 = n*(n-1) / 2

Zatem pesymistyczna złożoność czasowa wynosi 
T(n) = 1/2 * n

2

 – 1/2 * n 

T(n) = 1/2 * n

2

 + O(1)  

T(n) = O(n

2

)

Złożoność średnia: identyczna jak pesymistyczna.
Czyli: liczba porównań pesymistycznie i średnio ok. 1/2 n

2

.

Metoda jest stabilna. 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

30

Sortowanie przez wybieranie

for (i = 0; i< (n-1); i++){
   min = i ;

       for (j = i+1; j<=n-1; j++)
         if  (a[j] < a[min]) min := j;
       replaceElements ( a[i], a[min] );

}

Idea
w i-tym kroku znajdź najmniejszy element spośród a[i . .n-1] i zamień go z 

elementem a[i]; powtarzaj ten krok dla i=0,...,n-2

 
Złożoność: identycznie jak dla metody bąbelkowej

T(n) = O(n

2

)

Czyli: zarówno w pesymistycznym, jak i średnim przypadku, liczba 

porównań wynosi ok. 1/2 n

2

.

 Zalety:
Wykonuje tylko n-1 zamian (istotne dla długich rekordów) 
Sortowanie metodą selekcji nie jest  stabilne. 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

31

Sortowanie przez wstawianie

   

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

     j = i-1;  
     tmp = a[i];
     while ((j >= 0)&&(tmp < a[j])){
       a[j+1]=a[j];

           j=j-1;

     }
     a[j+1] = tmp;
   }

Idea: W i-tym kroku wstaw element a[i] na właściwe miejsce w posortowanym fragmencie a[0 . . i-

1], wcześniej przesuwając wszystkie elementy większe od niego w tym fragmencie w prawo o 

1; powstaje posortowany fragment a[0 . . i].

Złożoność pesymistyczna (ciąg posortowany malejąco na wejściu) identyczna jak dla poprzednich 

przypadków. 

Średnia dwukrotnie lepsza.

w przypadku pesymistycznym ok. 1/2 n

2

 porównań

w przypadku średnim ok. 1/4 n

2

 porównań.

Zalety:
1. Stabilność
2. Średnio dwukrotnie szybszy niż inne proste metody
3. Optymalny dla ciągów prawie posortowanych

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

32

Przykłady praktyczne mierzenia złożoności 

obliczeniowej

Przykład 7:

Algorytm sortowania
Insertion-Sort(A)

1. for j:=2 to length[A]
2.      do key:=A[j]
      /* Wstaw A[i] w 

posortowany 

       ciąg A[1..j-1].*/
3. i:= j-1
4. while i>0 i A[i] > key
5. do A[i+1] := A[i]
6.  i:= i-1
7.  A[i+1] := key

Przykład działania 
algorytmu

 

5   2   4   6   1   3   

 2   5   4   6   1   3
 2   4   5   6   1   3
 2   4   5   6   1   3
 1   2   4   5   6   3
 1   2   3   4   5   6   

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

33

 

 

Przykłady praktyczne mierzenia złożoności obliczeniowej

Przykłady praktyczne mierzenia złożoności obliczeniowej

Insertion-Sort(A)

koszt

koszt

liczba wykonań

liczba wykonań

1. 

for j:=2 to length[A]

 c

1

   

n

2.       

do key:=A[i]

 c

2

  n-1

3.

i:= j-1

 c

3

  n-1

4.

while i>0 i A[i] > key

 c

4

  

5.

do A[i+1] := A[i]

 c

5

 

6. 

 

i:= i-1

 c

6

7. 

 

A[i+1] := key

 c

7

 

  n-1

n

j

j

t

2

n

j

j

t

2

)

1

(

n

j

j

t

2

)

1

(

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

34

Przykłady praktyczne mierzenia złożoności 

obliczeniowej 

)

1

(

)

1

(

)

1

(

)

1

(

)

1

(

)

(

7

2

6

2

5

2

4

3

2

1

n

c

t

c

t

c

t

c

n

c

n

c

n

c

n

T

n

j

j

n

j

j

n

j

j

1

2

)

1

(

2

n

n

j

n

j

2

)

1

(

)

1

(

2

n

n

j

n

j

)

1

(

2

)

1

(

2

)

1

(

1

2

)

1

(

)

1

(

)

1

(

)

(

7

6

5

4

3

2

1

n

c

n

n

c

n

n

c

n

n

c

n

c

n

c

n

c

n

T

)

(

2

2

2

2

2

2

7

4

3

2

7

6

5

4

3

2

1

2

6

5

4

c

c

c

c

n

c

c

c

c

c

c

c

n

c

c

c

)

(

)

(

2

2

n

c

bn

an

n

T

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

35

Algorytm sortowania metodą scalania

Analizujemy pesymistyczną złożoność czasową – operacjami dominującymi są porównania wykonywane podczas 

scalania.

Załóżmy najpierw, że n jest potęgą dwójki,  n = 2

k

Analiza złożoności algorytmu "dziel i zwyciężaj" za pomocą równania rekurencyjnego na liczbę operacji 

dominujących. 

Tutaj: 

T(n) = 0,   jeśli n = 1

       2 T(n/2)  +  n  ,   jeśli  n > 1 bo:

dwa podzadania wielkości n/2, 

koszt podziału pomijalny (zero porównań) ,

koszt scalania to liczba porównań podczas scalania ciągów posortowanych, równa sumie ich 

długości – tutaj  n.

Rozwiązanie równania rekurencyjnego: na T(n) przez iterowanie tego równania i wywnioskowanie stąd jego 

ogólnej postaci:
T(n) =  2 T(n/2) + n = 2 ( 2 T(n/4) + n/2) + n =  2 ( 2 ( 2 T(n/8) + n/4 ) + n/2 ) + n =

         =  2 ( . . . . 2 ( 2 T(1) + 2 ) + 4 ) + . . . . . ) + n =  n log n

Inna metoda: rozrysowując drzewo wywołań rekurencyjnych. Na każdym poziomie zagnieżdżenia rekurencji liczba 

porównań wynosi n, a drzewo ma wysokość log n.

Dla dowolnego n (tzn. niekoniecznie będącego potęgą dwójki) wysokość drzewa wywołań nie przekracza log n + 1.
Liczba porównań w algorytmie sortowania przez scalanie wynosi zatem:  

T(n) = n log n  + O(n)

Wady metody: 

potrzebuje pamięci roboczej rozmiaru O(n) (złożoność pamięciowa)
traci czas na przepisywanie elementów.

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

36

Mierzenie złożoności obliczeniowej

 – przydatne funkcje

2

)

1

(

0

n

n

i

n

i

   

 

 

 

 

 

1

2

2

1

0

n

n

i

i

 

n

n

i

i

n

2

0





   

 

 

 

 

 

 

1

1

1

0

x

x

x

n

n

i

i

   

3

)

1

)(

5

.

0

(

0

2

n

n

n

i

n

i

  

 

 

 

)

1

(

ln

1

1

O

n

i

n

i

 

 
 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

37

Mierzenie złożoności obliczeniowej 

– przydatne funkcje

 

O S Z A C O W A N I A :  

 

J e ś li f () j e s t f u n k c j ą  r o s n ą c ą , to :  

 

 

1

1

)

(

)

(

)

(

b

a

b

a

i

b

a

dx

x

f

i

f

dx

x

f

 

 

 

J e ś li f () j e s t f u n k c j ą  m a le j ą c ą , to :  

 

 

b

a

b

a

i

b

a

dx

x

f

i

f

dx

x

f

1

1

)

(

)

(

)

(

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

38

KLASY I TYPY FUNKCJI ZŁOŻONOŚCI 

OBLICZENIOWEJ

 

 

Klasa funkcji 

Typ funkcji 

Przykłady 

stała 

n

e

n

2

sin

 

n

/

1

 

subliniowa 

polilogarytmiczna 

n

log

log

n

2

log

 

liniowa 

 

n

n

n

n

/

1

1

 

quasi-liniowa 

n

nlog

n

n

log

log

 

wielomianowa 

kwadratowa 

 

2

n









2

n

 

superwielomianowa 

 

n

n

lg

 

n

e

 

wykładnicza 

 

n

2

n

3

2

 

niewielomianowa 

superwykładnicza 

 

n

n

2

 

n

n

 

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

39

Wpływ wzrostu prędkości komputera na 

maksymalny rozmiar zagadnienia, które można 

rozwiązać w jednostce czasu

 

Algorytm 

Maksymalny rozmiar zagadnienia 

Symbol 

Złożoność 

przed wzrostem 

prędkości  

po 100-krotnym 

wzroście prędkości 

5

A  

 

n

 

N

5

 

5

100N

 

4

A  

 

2

n

 

N

4

 

10 N

4

 

3

A  

 

3

n

 

N

3

 

4.64 N

3

 

2

A  

 

5

n

 

N

2

 

3.5 N

2

 

1

A  

 

n

2

 

N

1

 

6.64+N

1

 

0

A  

n

nlog

 

N

0

 

0

100dla 

1

0



N

 

 

h

1

2

4

 , 

100

1

2

4

4

h

N

c

 

  

10

100

4

c

 

h

N

1

2

1

100

1

2

1

1

h

c

N

 

 

100

2

1

c

 

  c

1

=

lo

g

2

1

0

0

=

6

.6

4

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

40

Przykład postępu, jaki dokonał się w 

dziedzinie projektowania algorytmów 

badających planarność grafu 

A lgo rytm  

R o zm ia r 

a na lizo w a neg o  

gra fu  

w  przyp a dku 

udo stęp nia nia  

ko m putera  na  

o kres 

Sym bo l 

A uto r [ ro k]   Z ło żo no ść 

C za s o bliczeń 

dla  

ms

c

 

10

100

n

 

m inuty  go dziny 

1

A

 

K urato w sk i 

[19 30] 

6

cn

 

325  lat 

4  

2

A

 

G o ldstein 

[19 63] 

3

cn

 

2.8 go dz in 

18  

71 

3

A

 

L em pel et al. 

[19 67] 

2

cn

 

100 sek und  

77  

6  0 00 

4

A

 

H o pcro ft-

T arjan [197 1] 

n

cn

2

log

 

7 sek und  

643 

24 6 73  

5

A

 

H o pcro ft-

T arjan [197 4] 

cn

 

1 sek unda 

6 000  

4

10

36 

 

 

background image

ppor. mgr inż. Mariusz CHMIELEWSKI

41

Związek pomiędzy rzędem złożoności, stałą 

proporcjonalności, rozmiarem danych i rzeczywistym 

czasem obliczeń na minikomputerze i superkomputerze

 

n

 

C

r

a

y

-1

  

3

3

[n

s

] 

P

E

N

T

IU

M

 IV

 1

.6

 G

H

z

 

1

9

5

0

0

0

n

 [n

s

] 

1

0

 

3

 μ

s

 

 3

0

0

 μ

s

 

1

0

0

 

3

 m

s

 

3

 m

s

 

1

 0

0

0

 

3

 s

 

    3

0

 m

s

 

1

0

 0

0

0

 

4

9

 m

in

  3

0

0

 m

s

 

1

0

0

0

 0

0

0

 

9

5

 la

t

 

       3

 s

 

 

M

im

o

 ż

e

 a

lg

o

r

y

t

m

 s

z

e

ś

c

ie

n

n

y

 „

w

y

s

t

a

r

t

o

w

a

ł”

 z

 w

k

s

z

y

m

 im

p

e

t

e

m

,  

d

r

u

g

i a

lg

o

r

y

t

m

 (

lin

io

w

y

)

, m

a

c

y

 z

ło

ż

o

n

o

ś

ć

 o

 2

 r

z

ę

d

y

 n

s

z

ą

  

(

O

(

n

)

 w

 s

t

o

s

u

n

k

u

  d

o

 O

(

n

3

)

)

,  

d

o

g

o

n

ił g

o

 i o

k

a

z

a

ł s

 s

z

y

b

s

z

y

 d

la

 

100

n


Document Outline