background image

Przegląd podstawowych 
algorytmów

zajęcia 1.

background image

Treść kursu

Zajęcia 1

Wprowadzenie

Programowanie dynamiczne

Zajęcia 2

Sortowanie

Wyszukiwanie binarne

Zajęcia 3

Sortowanie pozycyjne

Algorytmy zachłanne

Zajęcia 4

Rekurencja

Przeszukiwanie z nawrotami (backtracking)

Zajęcia 5 i 6

Grafy — Wprowadzenie

Zajęcia 7

Algorytmy tekstowe

Zajęcia 8

Algorytmy geometryczne

background image

Programowanie dynamiczne

Programowanie dynamiczne: 

Strategia projektowania 

algorytmów, która opiera się na 
obliczaniu wyniku pewnego 
problemu na podstawie wyników 
dla tego samego problemu z innymi 
argumentami. 

background image

Definicja 1. Liczby 
Fibonnaciego

Ciąg liczbowy F

n

 zadany 

następującymi równościami:

1. F

0

 = F

1

 = 1

2. F

n

 F

n−1

 + F

n−2

  

dla n >= 2

background image

Wydawanie reszty

Mamy dany pewien zbiór monet 
i/lub banknotów, których możemy 
użyć do wydania konkretnej kwoty. 

Pytanie brzmi,
 jak to zrobić korzystając z 
najmniejszej możliwej liczby monet 
lub banknotów.

background image

Wydawanie reszty – rozwiązanie

Nie najgorszym pomysłem jest, na 

przykład, wybieranie zawsze 

największych nominałów, które mieszczą 

się w pozostałej do wydania kwocie.  

Podejście to nazywa się zachłannym.

Pytanie:
Czy takie rozwiązanie jest zawsze 

optymalne (tzn. czy zawsze wydaje 

kwotę minimalną ilością monet)? 

background image

Najdłuższy wspólny 
podciąg

Mając dane dwa ciągi a

n

 b

n

, należy znaleźć ich 

najdłuższy wspólny podciąg, tzn. takie i

1

 < i

2

 < … < i

k

 

oraz j

1

 < j

2

 < … < j

k

 , że a

im

 b

jm

 dla każdego

m < 12, . . . , k>.

W tym celu należy obliczyć kolejne wartości macierzy t

gdzie t[g][h] oznacza najdłuższy wspólny podciąg 
(a raczej jego długość) spośród pierwszych wyrazów 

ciągu a

n

 oraz pierwszych wyrazów ciągu b

n

Łatwo wtedy obliczymy kolejne wyrazy t. Jeśli bowiem 

a

g

 b

h

, to

t[g][h] = 1+t[g − 1][h − 1]

a w przeciwnym wypadku:

t[g][h] = max(t[g − 1][h], t[g][h − 1])

background image

NWP - Ćwiczenie

Dla podanych ciągów oblicz długość 
NWP

a[11]={0,1,2,3,4,5,6,7,8,9,1};
b[8]={0,2,3,4,1,8,3,6};
Odpowiedz:
123456,  dł:6

background image

NWP
Optymalizacja zużycia pamięci

// A i B to długości ciągów a i b
// tablica t[2][B] jest początkowo wyzerowana

for(int g=1; g<=A; g++)
for(int h=1; h<=B; h++)

if(a[g] == b[h])
t[g % 2][h] = 1 + t[1 - g % 2][h - 1];

else

t[g % 2][h] = max(t[1 - g % 2][h], t[g % 2][h - 

1]);


Document Outline