Rekurencyjny algorytm

advertisement
RÓŻNORODNE ALGORYTMY OBLICZEŃ
I ICH KOMPUTEROWE REALIZACJE
Maciej M. Sysło
Uniwersytet Wrocławski
Uniwersytet UMK w Toruniu
[email protected]
informatyka +
2
Algorytm, algorytmika
Na str. 3-7 są zamieszczone uwagi
wstępne na temat algorytmiki.
Można je pominąć i wrócić później.
Algorytm – opis rozwiązania krok po kroku postawionego
problemu lub sposobu osiągnięcia jakiegoś celu
Pierwszy algorytm – algorytm Euklidesa
300 p.n.e
algorytm od Muhammad
ibn Musa al-Chorezmi IX w.
Algorytmika – dziedzina zajmująca się algorytmami i ich
własnościami
informatyka +
3
Algorytmy a informatyka
Informatyka – jedna z definicji: dziedzina wiedzy i działalności
zajmująca się algorytmami
Czy zajmuje się też algorytmami kulinarnymi?
Donald E. Knuth:
Mówi się często, że człowiek dotąd nie zrozumie czegoś,
zanim nie nauczy tego – kogoś innego.
Będziemy uczyć
W rzeczywistości,
komputery, czyli
programować je ! człowiek nie zrozumie czegoś (algorytmu) naprawdę,
zanim nie zdoła nauczyć tego – komputera.
Ralf Gomory (IBM):
Najlepszym sposobem przyspieszania komputerów
jest obarczanie ich mniejszą liczbą działań (szybszymi algorytmami)
informatyka +
4
Algorytmiczne rozwiązywanie problemu
Dla problemu – chcemy otrzymać rozwiązanie
komputerowe, które jest:
• zrozumiałe dla każdego, kto zna problemu
• poprawne, czyli spełnia specyfikację (opis) problemu
• efektywne, czyli nie marnuje czasu i pamięci komputera
Metoda rozwiązywania:
• analiza sytuacji problemowej
• sporządzenie specyfikacji: wykaz danych, wyników i relacji
• projekt rozwiązania
• komputerowa realizacja rozwiązania – implementacja
• testowanie poprawności rozwiązania
• dokumentacja i prezentacja rozwiązania
informatyka +
5
Rozwiązywanie problemów z pomocą komputerów
Objaśnienie dwóch terminów:
Problem:
• problem, gdy nie podano nam, jak należy go rozwiązać, ale wiemy
wystarczająco, by poradzić sobie z nim
• a więc, problem jest dla każdego nie tylko dla orłów
Programowanie:
• komputery wykonują tylko programy
• cokolwiek uruchamiamy na komputerze: Google, dokument w Word,
arkusz w Excel, naciśnięcie klawisza – jest programem
• każdy widoczny i niewidoczny efekt działania komputera to wynik
działania jakiegoś programu
Konkluzja: powinniśmy lepiej poznać programowanie komputerów
informatyka +
6
Myślenie algorytmiczne
Myślenie komputacyjne
(ang. computational thinking)
Reklama firmy IBM z
1924 roku
Komputer to maszyna do
myślenia !!!
informatyka +
7
Różnorodne algorytmy obliczeń
i ich komputerowe realizacje
PLAN
• Rozgrzewka (warm-up) – kilka krótkich programów
• Obliczanie wartości wielomianu – Schemat Hornera
• Liczby dziesiętne, binarne, … – system pozycyjny, zamiana
liczb między systemami
• Rekurencja: Wieże Hanoi, liczby Fibonacciego,
wyprowadzania liczb od początku
• Podnoszenie do potęgi – szybko!
• Algorytm Euklidesa
• Algorytmy zachłanne: wydawanie reszty, zmartwienie
kinomana, pakowanie plecaka, najdłuższa droga na piramidzie
• Przeszukiwanie z nawrotami: wychodzenie z labiryntu i
rozstawianie hetmanów na szachownicy
informatyka +
8
Rozgrzewka przy komputerach
Rozgrzewka (warm-up) – kilka krótkich programów:
• obliczanie pole trójkąta
• dodatkowo sprawdzanie, czy dane są dobre – warunek
• obliczanie pola trójkąta dla ciągu danych – iteracja i tablice
Ciekawe zadanie dotyczące trójkątów:
Dane:
ciąg (bardzo długi) liczb
Odpowiedź: czy z każdej trójki liczb z tego ciągu można
zbudować trójkąt?
Wskazówka: istnieje rozwiązanie, w którym nie trzeba
sprawdzać warunku trójkąta dla każdej trójki liczb
informatyka +
9
Warsztaty
Algorytm, język programowania, komputer
Proces komputerowej realizacji
algorytmu:
• Opis algorytmu – słowny
• Zapis w języku programowania
(Pascal, C++)
• Kompilacja – przetłumaczenie na
język zrozumiały przez komputer
• Wykonanie
• Testowanie
• Dokumentacja
informatyka +
10
Obliczanie wartości wielomianu
Obliczanie wartości wielomianu jest bardzo ważną operacją w
komputerze, bo wartość każdej funkcji jest liczona jako wartość
wielomianu, np.
cos x = 1 – 0.49670x2 + 0.03705x4.
Wielomian stopnia 2:
w(x) = ax2 + bx + c = a*x*x + b*x + c
3 mnożenia 2 dodawania
w(x) = ax2 + bx + c = (a*x + b)*x + c
2 mnożenia 2 dodawania
Wielomian stopnia 3:
w(x) = ax3 + bx2 + cx + d = ((a*x + b)*x + c)*x + d
3 mnoż. 3 dod.
Wielomian stopnia n:
wn(x) = a0*xn + a1*xn-1 + … + an-1*x + an =
= (a0*xn-1 + a1*xn-2 + … + an-1)*x + an = … =
= ((…((a0*x + a1)*x + a2)*x + … + an-2)*x + an-1)*x + an
informatyka +
11
Obliczanie wartości wielomianu
specyfikacja, algorytm
Specyfikacja problemu –
dokładny opis problemu
Problem Wielomian – Obliczanie wartości wielomianu
Dane: n – nieujemna liczba całkowita
a0, a1, a2, ..., an – n + 1 współczynników wielomianu
z – wartość argumentu – obliczamy wn(z).
Wynik: wn(z) – czyli wartość wielomianu wn(x) w punkcie x = z
Algorytm do obliczania wartości wielomianu:
wn(z) = ((…((a0*z + a1)*z + a2)*z + … + an-2)*z + an-1)*z + an
Schemat Hornera:
y := a0
y := y*z + a1
y := y*z + a2
n mnożeń i n dodawań
y := a0
…..
Nie ma szybszego
y := y*z + ai dla i = 1, 2, …, n
algorytmu !!!
y := y*z + an-1
y := y*z + an
informatyka +
12
Schemat blokowy algorytmu Hornera
Instrukcja warunkowa:
rozgałęzienia algorytmu
i := 0; y := a0
Początkowe wartości
Czy i = n
Czyli, czy wyczerpano
wszystkie współczynniki
Tak
Wyprowadź wartość y
Koniec algorytmu
Nie
i := i + 1
y := y*z + ai
Instrukcja iteracyjna
Ada Augusta, córka Byrona, uznawana
powszechnie za pierwszą programistkę
komputerów, przełomowe znaczenie
maszyny analitycznej Ch. Babbage’a,
pierwowzoru dzisiejszych komputerów,
upatrywała właśnie „w możliwości
wielokrotnego wykonywania przez nią
danego ciągu instrukcji, z liczbą powtórzeń
z góry zadaną lub zależną od wyników
obliczeń”, a więc w iteracji.
informatyka +
13
Pełny
schemat
blokowy
algorytmu
Hornera
informatyka +
14
Algorytm Hornera w postaci programu (Pascal)
program Horner;
var i,n :integer;
a,y,z :real;
begin
read(n); read(z);
read(a);
y:=a;
for i:=1 to n do begin
read(a);
y:=y*z+a
end;
write(y)
end.
informatyka +
nazwa programu
deklaracje, typy zmiennych
blok programu – początek
czytaj n, czytaj z
czytaj pierwszy współczynnik
początkowa wartość wyniku
pętla od 1 do n
czytaj kolejny współczynnik
powiększenie wyniku
iteracja – koniec
pisz wynik
blok programu – koniec
15
Algorytm Hornera – współczynniki w tablicy (Pascal)
Deklaracja tablicy
Program Horner_tablica;
var i,n :integer;
y,z:real;
a:array[0..100] of real {Co najwyzej 100 wspolczynnikow}
begin
Czytanie
read(n);
współczynników
for i:=0 to n do read(a[i]);
writeln(' z
y');
read(z);
while z <> 0 do begin
Instrukcja iteracyjna z warunkiem:
y:=a[0];
Obliczanie wartości tego samego
for i:=1 to n do y:=y*z+a[i];
wielomianu tak długo, jak długo
write('
',y:2:5); writeln;
argument jest różny od zera, czyli
read(z)
z <> 0.
end
end.
informatyka +
16
Zastosowania Algorytmu Hornera
1. Obliczanie wartości wielomianów.
2. Obliczanie wartości dziesiętnej liczb danych w systemie o
podstawie różnej od 10, np. liczb binarnych.
Uwaga: jest to bardzo prosta metoda, np. dla obliczeń na
kalkulatorze bez pamięci.
3. Szybkie potęgowanie (w dalszej części)
To są tylko niektóre zastosowania schematu Hornera.
informatyka +
17
System dziesiętny, system pozycyjny
Liczba dziesiętna: 357 ma wartość (dziesiętną):
357 = 3*100 + 5*10 + 7*1 = 3*102 + 5*101 + 7*100
a zatem liczba:
dn-1 dn-2 … d1 d0
która ma n cyfr
ma wartość:
dn-1*10n-1 + dn-2*10n-2 + … + d1*101 + d0*100
10 – podstawa systemu
{0, 1, 2, 3, …, 8, 9} – cyfry
2, 8, 16 – podstawy systemów używanych w komputerach
podstawa
cyfry
2
0, 1
system binarny
8
0, 1, 2, 3, 4, 5, 6, 7
16
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
60
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, G, …
informatyka +
18
System binarny, przejście 2 → 10
Liczba binarna: 10101 = (10101)2 ma wartość (dziesiętną):
1*24 + 0*23 + 1*22 + 0*21 + 1*20 = 24 + 22 + 1 = 16 + 4 + 1 = 21
(bn-1 bn-2 … b1 b0)2
a zatem liczba binarna:
ma wartość:
Binarne
rozwinięcie
liczby a
która ma n cyfr
Najbardziej
znaczący bit
Najmniej
znaczący bit
a = bn-1*2n-1 + bn-2*2n-2 + … + b1*21 + b0*20
(*)
Jak szybko obliczać wartość dziesiętną binarnego rozwinięcia?
Wzór (*) jest wielomianem, w którym zamiast x jest 2.
A zatem wartość a obliczamy za pomocą schematu Hornera. .
informatyka +
19
Otrzymywanie postaci binarnej liczb, czyli 10 → 2
Szkolna metoda: dzielimy przez dwa tak
długo, jak długo iloraz jest większy od
zera – słupki:
Bardzo prosty program
dzielenie
iloraz
reszta
187|2
93
1
Program Rozwiniecie_binarne;
93|2
46
1
var a:integer;
begin
46|2
23
0
read(a);
23|2
11
1
while a <> 0 do begin
11|2
5
1
write(a mod 2,' ');
a:=a div 2
5|2
2
1
end
2|2
1
0
end.
1|2
0
1
Ciekawe pytanie: jaka jest długość
Reprezentacja od końca reszt:
rozwinięcia binarnego liczby n?
187 = (10111011)2
informatyka +
20
Techniki algorytmiczne – rekurencja
Myślenie rekurencyjne:
–
–
–
–
–
–
przykłady z życia: jedzenie, tańczenie
Wieże Hanoi
liczby Fibonacciego
wyprowadzanie liczb od początku
szybkie potęgowanie
algorytm Euklidesa
Rekurencyjny algorytm:
Rozwiązując problem … odwołuje się do siebie
Korzyści:
Część pracy … zwalamy na komputer!
informatyka +
21
Rekurencja – przykłady z życia
• Jedzenie kaszki z talerza – A. Jerszow
Jedz kaszkę;
jeśli talerz jest pusty to koniec jedzenia
Warunek
w przeciwnym razie
początkowy –
weź łyżkę kaszki;
zatrzymuje
Jedz kaszkę
wywołania
Procedura rekurencyjna
wywołuje siebie
• Taniec
Tańcz;
jeśli nie gra muzyka to koniec tańczenia
w przeciwnym razie
zrób krok;
Tańcz
informatyka +
22
Wieże Hanoi – przekładanie krążków
Opis gry i interaktywna zabawa:
Zasady gry:
• przenosimy po jednym
• nigdy większy na
mniejszym
Algorytm iteracyjny:
• najmniejszy krążek ma
dwie możliwości –
ustalamy, którą
wybieramy
• na dwóch palikach, tylko
jeden krążek można
przenieść i tylko na jedno
miejsce
informatyka +
23
Wieże Hanoi – Rekurencja
Rozwiązanie rekurencyjne: kiedy można przenieść największy
krążek?
Odpowiedź: gdy pozostałe będę na jednym paliku, następnie
możemy je przenieść na największy
Hanoi (n, A, B, C) {z A na B za pomocą C}
if n = 0 then nic nie rób
Procedura rekurencyjna
wywołuje siebie
else begin
Warunek
Hanoi (n – 1, A, C, B);
początkowy –
zatrzymuje
wywołania
Największy krążek z A na B;
Hanoi (n – 1, C, B, A)
end
informatyka +
24
Wieże Hanoi – Rekurencja – liczba przestawień h(n)
h(n) = Hanoi (n, A, B, C)
if n = 0 then nic nie rób
h(0) = 0
else begin
h(n – 1) +
Hanoi (n – 1, A, C, B);
1+
Największy krążek z A na B;
h(n – 1) =
Hanoi (n – 1, C, B, A)
end
h(n) = 2h(n – 1) + 1
informatyka +
25
Wieże Hanoi – Rekurencja – liczba przestawień h(n)
h(n) = 2h(n – 1) + 1 =
z tego samego wzoru: h(n – 1) = 2h(n – 2) + 1
stąd
h(n) = 2[2h(n – 2) + 1] + 1 =
= 22h(n – 2) + 2 + 1 =
podobnie h(n) = 23 h(n – 3) + 22 + 2 + 1 =
…
= h(0) = 0
h(n) = 2nh(n – n) + 2n - 1 + … + 2 + 1 =
ostatecznie
h(n) = 2n – 1
informatyka +
26
Profesor S. bierze jeden lub
dwa schodki – na ile
sposobów wyjdzie na piętro n
Chaotyczny profesor S.
s(n) – liczba sposobów osiągnięcia schodka n

Myśl rekurencyjnie!


n
n–1
n–2
…
s(n) =
s(n –1) + s(n – 2)
dla n > 2
2
1
0
s(1) = 1
s(2) = 2
informatyka +
27
początku jest jedna para
Rekurencja – króliki Fibonacciego Na
królików, która po miesiącu
rodzi kolejną parę. Króliki
nie umierają i po miesiącu,
F(n) – liczba par królików po n miesiącach
co miesiąc rodzą nową parę.
1
2


F(1)=1
F(2)=1
Warunki początkowe
3
n–2


n–1

n

Rekurencja:
Króliki, które
przeżywają
dla n > 2:
F(n) =
Króliki, urodzone
przez pary żyjące
ponad miesiąc
F(n – 1) + F(n – 2)
Liczby Fibonacciego: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
informatyka +
28
Liczby Fibonacciego – rozrzutna rekurencja
F6
F5
F4 3
F3 2
F2 1
F1 1
5
?
F2 1
F2
?
F3
2
1
F1
F4
Powtórne
obliczanie F4
1
Pamiętajmy: Rekurencja – może być bardzo
rozrzutna pod względem liczby
wykonywanych operacji i zajmowanej pamięci
informatyka +
29
Liczby Fibonacciego – oszczędna iteracja
F(n) – liczba par królików po n miesiącach
1

F(1)=1
2

F(2)=1
Warunki początkowe
3

n–2
n–1
n



F(n – 2) +F(n – 1) = F(n)
Rekurencja jako iteracja dla n > 2
F(n) {n-ta liczba Fibonacciego obliczona iteracyjnie}
if (n = 1) lub (n = 2) then F := 1
else begin a := 1; b := 1; {a i b – dwie poprzednie wartości}
for i := 3 to n do begin c := a + b; a := b; b := c end;
F := c
end
30
informatyka +
Rekurencja – wyprowadzanie kolejnych cyfr liczby
Liczbę 3045 drukuj w kolejności cyfr: 3 0 4 5
Algorytm – drukowania cyfr liczby 3045
1. Najpierw drukuj cyfry liczby 304
2. Później drukuj cyfrę 5
Zauważmy: możemy
zastosować ten sam
algorytm ale do liczby 304
– REKURENCJA
Liczba 304 to:
3045 div 10 = 304
Cyfra 5 to reszta:
3045 mod 10 = 5
Potrzebne są dwie operacje:
reszta z dzielenia mod: np. 3045 mod 10 = 5
dzielenie całkowite div: np. 3045 div 10 = 304
informatyka +
31
Rekurencja – wyprowadzanie kolejnych cyfr liczby
KolejnaCyfra (m)
if m < 10 then write (m)
else begin
KolejnaCyfra (m div 10);
Warunek początkowy –
gdy liczba ma jedną cyfrę.
Wywołanie rekurencyjne dla
liczby bez ostatniej cyfry
write (m mod 10)
Drukowanie
ostatniej cyfry
end
Uwagi:
1. Można zastąpić 10 przez 2 i otrzymamy kolejne cyfry
binarne, od najbardziej znaczącej
2. Po zmianie kolejności poleceń – drukowanie cyfr od końca
informatyka +
32
Rekurencja – wyprowadzanie kolejnych cyfr liczby
Wywołania rekurencyjne
KolejnaCyfra (3045)
304 = 3045 div 10
KolejnaCyfra (304) write (3045 mod 10) = 5
KolejnaCyfra (30)
write (304 mod 10)
=4
KolejnaCyfra (3)
write (30 mod 10)
=0
write (3)
=3
Kolejno
drukowane
cyfry
Powrót z wywołań rekurencyjnych
informatyka +
33
Podnoszenie do potęgi, 1
Problem potęgowania
Ważne działanie w kryptografii, gdzie
potęguje się duże liczby, np.
Dane: m – liczba naturalna,
1234567891234567890123456789123456789012
x – liczba rzeczywista
Wynik: y = xm
Przykład: m = 22
Sposób 1.
 Rozłóż m na sumę potęg liczby 2
mamy: 22 = 2 + 4 + 16
 A stąd: x22 = x2+4+16 = x2 *x4 *x16
 Kolejne mnożenia:
x2, x4 = (x2)2, x8 = (x4)2, x16 = (x8)2, y = x2 *x4 = x6, y = y*x16
Liczba mnożeń: 6 (kwadrat to jedno mnożenie)
informatyka +
34
Podnoszenie do potęgi, 2
Sposób 2. (przykład dla m = 22)
 Znajdź rozwinięcie binarne liczby m;
22 = (10110)2
 Przedstaw wykładnik w postaci schematu Hornera;
22 = 1*24 + 0*23 + 1*22 + 1*21 + 0*20 = (((2 + 0)2 + 1)2 + 1)2 +0
 Z postaci wykładnika określ kolejność mnożeń:
x(((2+0)2+1)2+1)2+0 = x(((2+0)2+1)2+1)2 = (x(((2+0)2+1)2+1)2 = (x(((2+0)2+1)2 x)2 =
= (x(((2+0)2+1)2 x)2 = (x(((2+0)2x)2 x)2 = (x(((2+0)2x)2x)2 = (((x2)2x)2x)2 = x22
 Kolejne mnożenia:
x2, x4 = (x2)2, x5 = (x4)x, x10 = (x5)2, x10x = x11, (x11)2 = x22
Liczba mnożeń: 6, jak w Sposobie 1, ale są liczone inne iloczyny.
informatyka +
35
Podnoszenie do potęgi, 3
Algorytm rekurencyjny, korzysta ze spostrzeżenia:
 jeśli m jest parzyste, to xm = (xm/2)2
 jeśli m jest nieparzyste, to xm = (xm –1)x (m – 1 staje się parzyste).
Przykład: m = 22
x22 = (x11)2 = ((x10) x)2 = ((x5)2 x)2 = (((x4)x)2x)2 = (((x2)2x)2x)2 = x22
 Kolejne mnożenia:
x2, x4 = (x2)2, x5 = (x4)x, x10 = (x5)2, x10x = x11, (x11)2 = x22
Liczba mnożeń: 6, jak w Sposobie 1 i 2, liczone jak w Sposobie 2.
Potega (x, n)
{ xn }
Realizacja
if n = 1 then Potega := x
rekurencyjna
else if n – parzyste then
Potega := Potega (x, n/2)^2
{xn = (xn/2)2}
else Potega := Potega (x, n – 1)*x
{xn = (xn–1)x}
informatyka +
36
Algorytm Euklidesa, 1
 Uważany za pierwszy algorytm – powstał 300 p.n.e.
 Chociaż Chińczycy i Hindusi wcześniej tworzyli przepisy
obliczeniowe.
 Przez długie lata był synonimem algorytmu i od niego zaczynały
wszystkie książki akademicki.
 Ma bardzo wiele zastosowań praktycznych i teoretycznych:
 arytmetyka, czyli obliczenia na liczbach całkowitych
 kryptografia – RSA
 łamigłówki
 Przykład: Czy za pomocą naczyń 6 i 10 litrowych można napełnić
pojemnik 15 litrami wody – wodę można dolewać lub pobierać z
pojemnika tylko całymi naczyniami.
informatyka +
37
Algorytm Euklidesa, 2
Problem NWD(m,n) – Największy Wspólny Dzielnik
Dane: m, n – liczby naturalne (można przyjąć, że m ≤ n)
Wynik: NWD(m,n) – Największy wspólny dzielnik liczb m i n.
Przykłady:
NWD(42,14) = 14
NWD(24,16) = 8
NWD(13,21) = 1
NWD(0,31) = 31
13 i 21 są względnie pierwsze
0 jest podzielne przez każdą liczbę
Zasada, wykorzystana w algorytmie – Twierdzenie o ilorazie i reszcie
n = q*m + r, gdzie 0 ≤ r < m
q – iloraz, r – reszta.
informatyka +
38
Algorytm Euklidesa, 3
Wnioski:
1. Jeśli r = 0, to m dzieli n, czyli NWD(m,n) = m
2. Jeśli r ≠ 0, to mamy r = n – qm, czyli każda liczba, która dzieli n oraz
m dzieli również r, w szczególności największa taka liczba.
Stąd mamy:
NWD(m,n) = NWD(r,m)
Przykład: NWD(25,70) = NWD(20,25) = NWD(5,20) = NWD(0,5) = 5
NWD(25,70):
70 = 2*25 + 20
NWD(20,25)
25 = 1*20 + 5
NWD(5,20)
20 = 4*5 + 0
r = 0, więc NWD( , ) = 5
Generowane liczby maleją: 70, 25, 20, 5, 0 więc algorytm jest skończony
informatyka +
39
Algorytm Euklidesa, 4 – dwie realizacje
Realizacja z funkcją:
program Euklides;
var m,n,r:integer;
begin
read(m,n);
while m>0 do begin
r:=n mod m;
n:=m;
m:=r
end;
write(n)
end.
program Euklides_funkcja;
var m,n:integer;
function NWD(m,n:integer):integer;
var r:integer;
begin
while m>0 do begin
r:=n mod m; n:=m; m:=r
Funkcja
end;
NWD:=n
Przypisanie
end;
funkcji wartości
begin
read(m,n);
writeln(NWD(m,n))
end.
informatyka +
Wywołanie
funkcji w
programie
40
Algorytm Euklidesa, 5 – realizacja rekurencyjna
program Euklides_rekurencja;
var m,n:integer;
Funkcja
rekurencyjna
function NWD_rek(m,n:integer):integer;
begin
Wywołania
rekurencyjne
if m>n then NWD_rek:=NWD_rek(n,m)
else if m = 0 then NWD_rek:=n
else NWD_rek:=NWD_rek(n mod m,m)
end;
Reszta z
dzielenia n
przez m
begin
read(m,n);
writeln(NWD_rek(m,n))
End.
informatyka +
41
Algorytm Euklidesa, 6 – zagadki
Przykład 1. Czy za pomocą naczyń 6 i 10 litrowych można napełnić
pojemnik 15 litrami wody – wodę można dolewać lub pobierać z
pojemnika tylko całymi naczyniami.
Jeśli istnieje rozwiązanie, to istnieją takie x i y, że
6x + 10y = 15
Czy istnieją? Uzasadnij odpowiedź.
Rozwiązanie 1. W tym przypadku nie istnieje rozwiązanie. Istnieje, gdy
prawa strona jest wielokrotnością NWD(6,10).
Przykład 2. W jednym pojemniku są klocki o wysokości p, a w drugim – o
wysokości q. Czy zawsze można zbudować wieże z każdego rodzaju
klocków, które mają tę samą wysokość? Jeśli jest to możliwe, to jaka jest
najmniejsza wysokość takich wież?
Rozwiązanie 2. Zawsze możliwe. Najmniejsza wysokość NWW(p,q).
Pytanie 3. Jaki zachodzi związek między NWD(m,n) i NWW(m,n)?
Mamy NWW(m,n) = (m*n)/NWD(m,n)
informatyka +
42
Techniki algorytmiczne
– przybliżone i dokładne – idee
• W wielu sytuacjach postępujemy intuicyjnie, podejmując
decyzje, które wydają się nam najlepsze, chociaż nie
potrafimy tego uzasadnić – podejście zachłanne
• Jednak czasem musimy przejrzeć wszystkie możliwości –
dobrze jest mieć pewność, że przeglądamy (pośrednio lub
bezpośrednio) wszystkie, ale bez powtórzeń – metoda
przeszukiwania z nawrotami
• Stara zasada – korzystać z tego, co już znamy – strategia
dziel i zwyciężaj
• Komputery staramy się używać wtedy, gdy bez niech nie
potrafimy sobie poradzić. A najlepiej, gdyby komputery
wykonywały za nas dużą część roboty. Rekurencja – czyli jak
zwalić robotę na komputer
informatyka +
43
Techniki algorytmiczne
– przybliżone i dokładne
• Podejście zachłanne:
–
–
–
–
wydawanie reszty
zmartwienie napalonego kinomana
pakowanie najcenniejszego plecaka
najdłuższa droga w piramidzie
• Przeszukiwanie z nawrotami
– poszukiwanie wyjścia z labiryntu
– rozmieszczanie hetmanów na szachownicy
• Strategia dziel i zwyciężaj
– poszukiwanie elementów w zbiorze uporządkowanym
informatyka +
44
Metoda zachłanna: wydawanie reszty – problem
Problem Reszty.
Dane: nominały, np. 1 gr, 2 gr, 5 gr, … K – kwota do wydania
Wynik: Utworzyć K z najmniejszej liczby banknotów i monet
Dla sprzedawcy to także
Dyskusja:
dobre kryterium – ma mniej
• jak wydają sprzedawcy?
okazji, by się pomylić
• jaki mamy pomysł?
• czy potrafimy uzasadnić, że nasz pomysł da najlepsze
rozwiązanie?
Konkluzja – algorytm zachłanny:
Wydawaj sukcesywnie, zawsze możliwie największy nominał
banknotu lub monety
informatyka +
45
Metoda zachłanna: wydawanie reszty – w arkuszu
Rozwiązanie w arkuszu –
w arkuszu można również
wykonywać algorytmy
Ćwiczenie na warsztatach:
utworzyć taki arkusz
informatyka +
46
Metoda zachłanna: wydawanie reszty – program
Program Zachlanna_reszta_PL;
var i,ile,kwota_int:integer;
kwota
:real;
Nominały w groszach
nominal:array[1..14] of integer
=(20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1);
reszta :array[1..14] of integer;
begin
write('kwota'); read(kwota);
kwota_int:=round(kwota*100);
Zamiana kwoty na grosze
for i:=1 to 14 do begin
ile:=kwota_int div nominal[i];
Obliczanie wielkości
reszta[i]:=ile;
kolejnych nominałów
kwota_int:=kwota_int-ile*nominal[i]
end;
for i:=1 to 8 do
writeln(nominal[i] div 100,' zl.: ',reszta[i]);
for i:=9 to 14 do
writeln(nominal[i],' gr.: ',reszta[i])
end.
informatyka +
47
Metoda zachłanna: wydawanie reszty – jak dobrze?
Pytanie: jak dobry jest algorytm zachłanny?
Czy zawsze tworzy resztę z najmniejszej
liczby banknotów i monet?
Sytuacje:
• brakuje niektórych nominałów w kasie, np. 5 gr. i 10 gr.
• pojawia się nowa moneta, np. 21 gr.
Fakt:
Istniejące w świecie nominały, gdy tylko jest ich dostatecznie
dużo w kasie, gwarantują, że algorytm zachłanny daje
zawsze najmniejszą liczbę banknotów i monet
informatyka +
48
Metoda zachłanna: zmartwienie kinomana
Sytuacja:
Dane: program filmów w Multikinie na dany dzień
Wynik: Kinoman chce jednego dnia zobaczyć jak najwięcej filmów w
Multikinie
1
X
2
X
X
X
3
X
X
4
X
Strategia: Wybieraj filmy, które kończą się możliwie jak najwcześniej
Uzasadnienie: Pozostaje więcej czasu na następne filmy
Konkluzja: Jest to optymalny algorytm.
informatyka +
49
Metoda zachłanna: pakowanie plecaka
Ogólny problem plecakowy
Dane: n rzeczy (towarów, produktów itp.), w nieograniczonej ilości:
i-ta rzecz waży wi jednostek i ma wartość pi:
W – maksymalna pojemność plecaka.
Wynik: ilości poszczególnych rzeczy (mogą być zerowe), których
całkowita waga nie przekracza W i których sumaryczna
wartość jest największa wśród wypełnień plecaka rzeczami
o wadze nie przekraczającej W.
Decyzyjny problem plecakowy – 0-1 (zero-jedynkowy)
Rzeczy są tylko w pojedynczych ilościach – decyzja: bierzemy
albo nie
informatyka +
50
Metoda zachłanna: pakowanie plecaka
Przykład:
wartość towaru:
waga towaru:
Pojemność
plecaka
Zachłanne kryteria wyboru rzeczy do plecaka:
1. Najcenniejsze najpierw: 7 x nr 5 + 1 x nr 4 = 7x10 + 1x7 = 77
2. Najlżejsze najpierw:
23 x nr 6 = 23x2 = 46
3. Najcenniejsze w stosunku do swojej wagi najpierw, czyli w
kolejności nierosnących wartości ilorazu pi / wi
Kolejność: 7/2, 10/3, 4/2, 2/1, 5/3, 6/6
11 x nr 4 + 1 x nr 6 = 11x7 + 1x2 = 79 NAJLEPSZE
OPTYMALNE: 10 x nr 4 + 1 x nr 4 = 10x7 + 1x10 = 80
Żadne zachłanne nie jest optymalne – na ogół tak jest
informatyka +
51
Metoda zachłanna: najdłuższa droga z piramidy
Dane: Piramida liczb:
3
5
8
4
3
7
2
5
6
Droga z korzenia
5
7
3
5
4
2
Wynik: Znaleźć najdłuższą drogę z korzenia Długość drogi zachłannej:
niebieska: 3+7+5+7+4 = 26
Algorytm zachłanny.
1. Zacznij w korzeniu
2. Wybieraj większą liczbę poniżej.
informatyka +
Długość drogi najdłuższej:
różowa: 3+5+8+5+6 = 27
52
Przeszukiwanie z nawrotami
Opis sytuacji:
• Duża przestrzeń możliwych rozwiązań.
• Nie znamy innej metody znalezienia rozwiązania niż
przeszukanie tej przestrzeni
• Decydujemy się przeszukać całą przestrzeń, ale
–
–
chcemy to zrobić systematycznie
każde rozwiązanie powinno się pojawić, bezpośrednio lub
pośrednio, ale żadne nie więcej niż raz
• Może nas interesować znalezienie wszystkich rozwiązań
Przykłady:
• Wychodzenie z labiryntu – duża liczba możliwych dróg
• Ustawianie figur na szachownicy – duża liczba
możliwych układów
informatyka +
53
Przeszukiwanie z nawrotami:
wychodzenie z labiryntu
Opis sytuacji:
Labirynt: pola = kwadraty, brak zamkniętych komnat
Cel:
znaleźć wyjście z dowolnego pola
Algorytm:
1. Wybieraj kierunki w kolejności: G (do góry), L (w lewo),
P (w prawo), D (do dołu) – patrzymy zawsze przed siebie
2. Jeśli nie ma przejścia – cofnij się na pole, z którego
przyszedłeś.
Nawrót
informatyka +
54
Przeszukiwanie z nawrotami:
wychodzenie z labiryntu
Droga z pola 4a:
G-3a, G-2a, G-1a – do Góry już nie można iść, ale
można iść w Prawo
P-1b – z tego pola nie ma już przejść G, L, P –
cofamy się
B-1a – także nie ma innego przejścia – cofamy się
B-2a – podobnie, cofamy się
B-3a – podobnie, cofamy się – z 3a można iść
jeszcze w Prawo
P-3b – istnieje przejście w Lewo
L-2b – istnieje przejście w Prawo
P-2c – istnieje przejście w Lewo
WYJŚCIE z labiryntu
informatyka +
55
Przeszukiwanie z nawrotami:
rozmieszczanie hetmanów na szachownicy
Opis sytuacji:
Szachownica: n x n, hetman – atakuje po
wszystkich liniach
Cel: ustawić jak największą liczbę nie
atakujących się hetmanów
Algorytm:
Poruszamy się kolumnami, od lewej do
prawej, a w kolumnach od góry.
1. Ustaw hetmana w danej kolumnie na
nie atakowanym polu.
2. Jeśli nie można, to cofnij się do
poprzedniej kolumny i wybierz
Nawrót
następne pole
informatyka +
56
Przeszukiwanie z nawrotami:
rozmieszczanie hetmanów na szachownicy
a4
b2: brak pola w c
nawrót a: a3
b1
nawrót do b: b1
informatyka +
c4
c3: brak pola w d
d2 !!!
57
Przeszukiwanie z nawrotami:
rozmieszczanie hetmanów na szachownicy
Drzewo poszukiwania
ustawień:
Ustawienie
4 hetmanów
Odbicie
symetryczne
rozwiązania
Oś symetrii
drzewa
informatyka +
58
Strategia dziel i zwyciężaj – przykład
– poszukiwanie elem. w zbiorze uporządkowanym
Zgadywana liczba:
Metoda:
Kolejne kroki:
17 w przedziale [1 : 20]
połowienia przedziału
strzałka wskazuje wybór;
kolor czerwony – ciąg do przeszukania:
informatyka +
59
Pokrewne zajęcia w Projekcie Informatyka +
Wykład+Warsztaty (Wszechnica Poranna):
• Wprowadzenie do algorytmiki i programowania – wyszukiwanie i
porządkowanie informacji
• Proste rachunki wykonywane za pomocą komputera.
• Techniki algorytmiczne – przybliżone (heurystyczne) i dokładne.
Wykłady (Wszechnica Popołudniowa):
• Czy wszystko można policzyć na komputerze?
• Porządek wśród informacji kluczem do szybkiego wyszukiwania.
• Dlaczego możemy się czuć bezpieczni w sieci, czyli o szyfrowaniu
informacji.
• Znajdowanie najkrótszych dróg, najniższych drzew, najlepszych
małżeństw
informatyka +
60
Pokrewne zajęcia w Projekcie Informatyka +
Kursy (24 godz.) – Wszechnica na Kołach:
• Algorytmy poszukiwania i porządkowania. Elementy języka
programowania
• Różnorodne algorytmy obliczeń i ich komputerowe realizacje
• Grafy, algorytmy grafowe i ich komputerowe realizacje
Kursy (24 godz.) – Kuźnia Informatycznych Talentów – KIT dla Orłów:
• Przegląd podstawowych algorytmów
• Struktury danych i ich wykorzystanie
• Zaawansowane algorytmy
Tendencje – Wykłady
• Algorytmy w Internecie, K. Diks
• Czy P = NP, czyli jak wygrać milion dolarów w Sudoku, J. Grytczuk
• Między przeszłością a przyszłość informatyki, M.M Sysło
informatyka +
61
Download