background image

 

 

Sld 18.1. Zaawansowane 

techniki

1.Algorytmy typu „dziel-i-

rządź”(“conquer and divide”)

2.Algorytmy „zachłanne“ (“żarłoczne”, 

“greedy”)

3.Algorytmy dynamiczne 

background image

 

 

Sld 18.2. Algorytmy typu „dziel-i-

rządź“

Programowanie  typu  „dziel-i-rządź"  polega  na  wykorzystaniu 

podstawowej cechy rekurencji: 

1. dekompozycji 

problemu 

na 

pewną 

skończoną 

ilość 

podproblemów tego samego typu, 

2. rozwiązania podproblemów,
3. połączeniu  częściowych  rozwiązań  w  celu  odnalezienia 

rozwiązania globalnego

 

Jeśli  oznaczymy  problem  do  rozwiązania  przez  Pb,  a  rozmiar  danych 

przez N, to zabieg wyżej opisany da się przedstawić za pomocą zapisu:

 

Pb(N) → Pb(N

1

) + Pb(N

2

) + ...+ Pb(N

k

+ KOMB(N). 

 

Problem „rzędu" N  został podzielony na podproblemów. 
Funkcja KOMB(N) nie 
jest rekurencyjna.

Technika  „dziel-i-rządź"  pozwala  w  wielu  przypadkach  na  zmianę  klasy 

algorytmu (np. z O(n) do O(log

2

N) ). 

Istnieje  grupa  zadań,  dla  których  zastosowanie  metody  „dziel-i-rządź" 

nie spowoduje przyspieszenia. 

 

 

background image

 

 

Sld 18.3. Algorytmy typu „dziel-i-

rządź“ - 2

   Pb

0

   Pb

1

    Pb

i

    Pb

n

  Pb

1,1

  Pb

1,k

  Pb

i,1

   Pb

i,l,

   Pb

n,1

   Pb

n,s

  Pb 

i,1,t

  
Pb

i,1,1

.

°°°

°°°

°°°

°°°

°°°

°°°

 ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° 

 ° ° ° ° ° ° ° ° °

background image

 

 

Sld 18.4. Quicksort

Złożoność O(n 

log

n)

background image

 

 

Sld 18.5. Przeszukiwanie binarne

Złożoność O(n log

n)

Binarne przeszukiwanie elementu 

27 

w liście 

 

                    

                                               

 

2  4  7  8  8  9  10  11  14  15  17  20  21  25  27  37  41  57  69  73  92  94 

                                                                         

 

2  4  7  8  8  9  10  11  14  15  17 

20  21  25  27  37  41  57  69  73  92  94 

                                                               

 

2  4  7  8  8  9  10  11  14  15  17 

20  21  25  27  37 

41  57  69  73  92  94 

                                                                    

 

2  4  7  8  8  9  10  11  14  15  17  20  21  25 

27  37 

41  57  69  73  92  94 

                                                                 

 

2  4  7  8  8  9  10  11  14  15  17  20  21  25 

27 

37  41  57  69  73  92  94 

 

background image

 

 

Sld 18.6. Znajdowanie zera 

funkcji metodą

 połowienia przedziału 

a

b

x

3

x

4

x

2

x

1

y

x

1

= a+½(b - a);     y > 

0; 
x

2

= a+½(x

- a);    y < 

0;
x

3

= x

2

+½(x

1

 - x

2

);  y > 

0;
x

4

= x

2

+½(x

3

 - x

2

);  y > 

0;
. . . . . . . . . . . . . . . . . . 
. . .

x

Ilość iteracji i = log

2

((b – a)/ Δ; 

Δ – dokładność obliczeń 

background image

 

 

Sld 18.7. Algorytmy „zachłanne“ 

(“żarłoczne“, ”greedy”)

• Cechą szczególną algorytmu „zachlannego" jest to, że w każdym 

etapie poszukiwania rozwiązania wybiera on opcję lokalnie 

optymalną. W zależności od tego doboru, rozwiązanie globalne 

może być również optymalne, ale nie jest to gwarantowane. 

y

x

Δ = 
1,2,3,4,5,6

x

opt

y

min

y

min,loc

background image

 

 

Sld 18.8. Ogólny problem 

plecakowy

•Polega on na zapakowaniu do plecaka o ograniczonej pojemności możliwie 

najbardziej wartościowych rzeczy. W innych zastosowaniach, może to dotyczyć 

pakowania walizek, paczek, samochodu, samolotu itp. 

• Dane:

   n rzeczy R

1

 R

2

..., R

n

każda w nieograniczonej ilości; 

  rzecz R

i

 waży  w

i

 i ma wartość p

i

   maksymalna pojemność plecaka, wynosząca W

max

.

• Wyniki: 

Ilości  n

i

,  n

2

,...,  n

n

,  poszczególnych  rzeczy  (mogą  być  zerowe),  których 

całkowita  waga  W

 

nie  przekracza  W

max

  i  których  sumaryczna  wartość  P  jest 

największa.

                                                                                                                                      

                                                                                                                                         

                                                                                                                                         

                                                                                                                                         

                                                                                                                                         

                                                                                                                                         

                                                                                                                                         

                                                                                                                     

• W

 

 =   ∑ n

i

w

i

   =  n

1

 w

+ n

2

 w

+ ... + 

 

n

w

n   

  W

max

 

• P

 

  =   ∑ n

i

p

i

   =   n

1

 p

+ n

2

 p

+ … + n

n

 p

   →  max

 

background image

 

 

Sld 18.9. Algorytm zachłanny dla 

ogólnego problemu plecakowego 

W  decyzjach  ścierają  się  ze  sobą  trzy  kryteria 

wyboru kolejnych rzeczy do zapakowania:

1.

wybierać  najcenniejsze  rzeczy,  czyli w kolejności 

nierosnących wartości p

t

;

2.

wybierać  rzeczy  zajmujące  najmniej  miejsca, 

czyli w kolejności niemalejących wag w

i  

3.

wybierać  rzeczy  najcenniejsze  w  stosunku  do 

swojej  wagi,  czyli  w  kolejności  nierosnących 

wartości ilorazu p

i

/w

i

.

background image

 

 

Sld 18.10. Przyklad problemu 

plecakowego

 

 

 

 

 

 

R

i

 

1 

2 

3 

4 

5 

6 

p

10 

w

i

 

p

i

/w

i

 

6/6 

4/2 

5/3 

7/2 

10/3 

2/1 

Kryteria 

n

1

p

n

1

w

n

2

p

n

2

w

n

3

p

n

3

w

n

4

p

n

4

w

n

5

p

n

5

w

n

6

p

n

6

w

? n

i

p

? n

i

w

i

 

1 

0 

0 

0 

1×7 

1×2 

7×10 

7×3 

0 

77 

23 

2

 

23×2 

23×1 

46 
23 

11×7 

11×2 

1×2 

1×1 

79 

23 

W

max 

 =  ∑ n

i

w

i

   ≤  23 

background image

 

 

Sld 18.11. Programowanie 

dynamiczne 

1. koncepcja:
• dla  danego  problemu  P  stwórz  rekurencyjny  model 

jego rozwiązania (wraz z jednoznacznym określeniem 

przypadków elementarnych);

• stwórz  tablicę,  w  której  będzie  można  zapamiętywać 

rozwiązania przypadków elementarnych i rozwiązania 

podproblemów,  które  zostaną  obliczone  na  ich 

podstawie;

2. inicjacja:
• wpisz do tablicy wartości numeryczne, odpowiadające 

przypadkom elementarnym;

3. progresja:
• na  podstawie  wartości  numerycznych  wpisanych  do 

tablicy  używając  formuły  rekurencyjnej,  oblicz 

rozwiązanie  problemu  wyższego  rzędu  i  wpisz  je  do 

tablicy;

• postępuj  w  ten  sposób  do  osiągnięcia  pożądanej 

wartości.

background image

 

 

Sld 18.12. 

Ciąg Fibonacciego 

fib(4)=
5

fib(1)=
1

fib(1)=
1

fib(2) = 
2

fib(1)=
1

fib(0)=
1

fib(3)=3

fib(2)=
2

fib(1)= 
1

fib(5)=8

fib(1)=
1

fib(0)=1

fib(3)=3

fib(2)=2

fib(1)= 
1

fib(0) = 1, 

fib(1) = 1,

fib(n) = f(n - I) + fib(n - 2) gdzie n ≥ 2; N

f

  =  1, 1, 2, 3, 5, 8, 13, 21, 34, 

55, ...

Tablica dla zapamiętywania rozwiązania podproblemów:

 

background image

 

 

Sld 18.13. Dwuwymiarowy wzór 

rekurencyjny. 

Do  obliczenia  wartości  P(i,  j)  potrzebna  jest  znajomość 

dwóch  sąsiednich  komórek:  dolnej  -  P(ij-l)  oraz  tej 

znajdującej  się  z  lewej  strony  -  P(i-l,j).  Naturalnym 

sposobem obliczania wartości P(i,j) będzie posuwanie się 

„zygzakiem" zaznaczonym na rysunku. 

background image

 

 

Sld 18.14. Znajdowanie 

najkrótszej drogi do wyjścia z 

labiryntu 

1.

Rozpowszechnianie fali od pola S.

2.

Zwinięcie fali od pola wyjścia C1.

background image

 

 

Sld 18.23. Literatura

1. P.Wróblewski. Algorytmy.  

Struktury danych i techniki 

programowania. Helion. 2001.

2. K.A.Lambert, D.W.Nance, T.L.Naps. 

Introduction to Computer Science 

with C++. Books/Cole, 2000.

3. M.M. Syslo. Algorytmy. Warszawa, 

WSP, 1997.


Document Outline