algorytmy i struktury danych typy algorytmów
DESCRIPTION
Algorytmy i Struktury Danych Typy algorytmów. Wykład 3 Prowadzący: dr Paweł Drozda. Plan wykładu. Brute force Rekurencje Metoda zachłanna Programowanie dynamiczne. Brute force. Sukcesywne sprawdzanie wszystkich kombinacji, aż do rozwiązania problemu - PowerPoint PPT PresentationTRANSCRIPT
Algorytmy i Struktury Danych
Typy algorytmów
WYKŁAD 3PROWADZĄCY: DR PAWEŁ DROZDA
dr Paweł Drozda
Plan wykładu
Brute forceRekurencjeMetoda zachłannaProgramowanie dynamiczne
dr Paweł Drozda
Brute force
Sukcesywne sprawdzanie wszystkich kombinacji, aż do rozwiązania problemu
Zazwyczaj nieoptymalna, prosta do implementacji
Ogromna złożoność obliczeniowa Przykłady:
Łamanie hasła Znajdowanie pary punktów najmniej odległych Wyszukiwanie wzorca w tekście
dr Paweł Drozda
Wyszukiwanie wzorca w tekście – brute force
ProblemPoszukiwanie wzorca długości M znaków w tekście o
długości N znakówRozwiązanie
Indeksy i, j oznaczają miejsce poruszania się po wzorcu i po tekście
Jeśli znajdziemy początek taki sam porównujemy kolejne znaki, aż do znalezienia znaku niezgodnego – przesunięcie początku przeszukania w tekście o 1, bądź do momentu przejścia całego wzorca – zwrócony zostanie indeks początku wzorca w tekście
Po przejściu całego tekstu bez znalezienia wzorca – zwracany komunikat o niepowodzeniu przeszukania
dr Paweł Drozda
Wyszukiwanie wzorca - implementacja
Szukaj (string wzorzec, string tekst){int i=0, j=0;while (i<strlen(wzorzec) && j<strlen(tekst))
{if wzorzec[i] != tekst[j] {j-=i-1;i=0;}else{j++;i++;}
}if (i==strlen(w)) cout << j-i; else cout << -1;}
dr Paweł Drozda
Rekurencje
Przykład wprowadzającyDziecko rozrzuciło klocki – musi je pozbierać do pudełkazadanie polega na włożeniu po jednym klocku do pudełka
do momentu aż wszystkie klocki znajdą się w pudełku
Cechy algorytmu rekurencyjnego zakończenie algorytmu jasno określone większy problem rozbity na problemy elementarne
dr Paweł Drozda
Rekurencje – ilustracja
Problem Dla tablicy n liczb określić czy istnieje liczba x
Rozwiązanie Weź pierwszy niezbadany element tablicy n-
elementowej Jeśli jest to x wypisz sukces i zakończ W przeciwnym przypadku zbadaj pozostałą część
tablicy Gdy po przejściu całej tablicy nie został znaleziony x
wypisz porażka
dr Paweł Drozda
Rekurencje – przykładowa implementacja
#include <iostream.h>#include <stdlib.h>const n=10;int tab[n]={1,2,3,2,-7,44,5,1,0,-3};void szukaj(int tab[n],int left,int right,int x)// left, right = lewa i prawa granica obszaru
poszukiwań// tab = tablica// x = wartość do odnalezienia{if (left>right) cout << "Element " << x << " nie został
odnaleziony\n"; else
if (tab[left]==x) cout << "Znalazłem szukany element "<< x << endl;
else szukaj(tab,left+1,right,x);
}
int main(){szukaj(tab,0,n-1,7);szukaj(tab,0,n-1,5);}
// wyniki programu:// Element 7 nie został odnaleziony// Znalazłem szukany element
dr Paweł Drozda
Analiza algorytmu
Zakończenie programu Element odnaleziony Przekroczenie zakresu tablicy
Duży problem rozbity na problemy elementarne Z tablicy o wymiarze n schodzimy do tablicy o
wymiarze n-1 Instrukcja porównania
dr Paweł Drozda
Rekurencje - schemat wykonywania
Przykład silnia
unsigned long int silnia(int x){if (x==0)
return 1; else
return x*silnia(x-1);}
X=0?
1
1*0!
2*1!
3*2!
X=0?
X=0?
X=0?
nie
nie
nie
tak
dr Paweł Drozda
Rekurencje – pułapki (1)
Wykonywanie tych samych obliczeń wiele razy Problem ciągu Fibonacciego
f(0)= 1, f(1)=1f(n) = f(n-1) + f(n-2)
f(4)
f(1)f(2)
f(2)f(3)
f(0)f(1)
f(1) f(0)
dr Paweł Drozda
Rekurencje – pułapki (2)
Wywoływanie rekurencji w nieskończonośćint StadDoWiecznosci(int n){if (n==1) return 1; else
if ((n %2) == 0) // n parzystereturn StadDoWiecznosci(n-2)*n;elsereturn StadDoWiecznosci(n-1)*n;
}
Dla parzystych n – odwołania w nieskończoność
Rozwiązywanie rekurencji
Merge Sort
Rozwiązanie
Założenie n jest całkowite T(n) jest stałe dla małych n
1
1
)()2/(2/(
)1()(
n
ndla
nnTnT
OnT
)lg()( nnnT
)()2/(2)( nnTnT
Metoda podstawiania
nnTnT )2/(2)(
)lg()( :zgadujemy nnOnT
)2/lg()2/()2/( nncnT założenie:
ncn
ncnncnncnncnnncn
nnncnT
lg
lg2lglg)2/lg(
)2/lg()2/(2)(
0,lg)( cncnnTczyli:
1 dla c
Metoda podstawiania
warunek brzegowy:
?,1lg)1( ccT
421*2)2( T 531*2)3( T2lg2)2( cT 3lg3)3( cT
2c
Metoda podstawiania
Zamiana zmiennych
)lglg(lg)(
)lg()2()(
)2/(2)(
)2()(
22)2(
2,lg
lg2)(
2/
nnOnT
mmOTmS
mmSmS
TmS
mTT
nnm
nnTnT
m
m
mm
m
Metoda iteracyjna
)64/(2716/94/3
)))64/(316/(34/(3
))16/(34/(3
)4/(3
)4/(3)(
nTnnn
nTnnn
nTnn
nTn
nnTnT
i-ty składnik ciągu:iin 4/3
iterowanie kończymy gdy: ni
nn i
4log
14/ lub 1
Metoda iteracyjna
ii nn 4/4/
)1(364/2716/94/3)( 4log nnnnnnT
szereg geometryczny
)(44/31
1)4/3()4/3()(
0
log
0
4
nOnnnnnTk
in
k
i
Drzewo rekurencji
2)2/(2)( nnTnT
)(nT 2n
)2/(nT )2/(nT
2n
2)2/(n 2)2/(n
)4/(nT )4/(nT)4/(nT )4/(nT
2n
2)2/(n 2)2/(n
2)4/(n 2)4/(n2)4/(n 2)4/(n
2n
2/)2/(2 22 nn
4/)4/(4 22 nn
)()2/1(4/2/ 2
0
2222 nOnnnni
i
Drzewo rekurencji
n
2/n 2/n
4/n 4/n4/n 4/n
nnTnT )2/(2)(
n
n
nnlg
)lg( nnO
Metoda rekurencji uniwersalnej
1,1),()/()( banfbnaTnT
a podproblemówrowiązywanych w czasie n/b
koszt dzielenia/łączenia
))(()( to,1 dla )()/( jesli i
0 dla )( jesli 3)
lg)( to,)( jesli 2)
)( to,0 dla )( jesli 1)
log
loglog
loglog
nfnTcncfbnaf
nnf
nnnTnnf
nnTnOnf
a
aa
aa
b
bb
bb
Metoda rekurencji uniwersalnej
)()( to1), (przypadek 1 dla)()(
)(
)(,3,9
)3/(9)(
22
29loglog 3
nnTnOnf
nnn
nnfba
nnTnT
ab
)(lg)( wiec),()(
1
1)(,2/3,1
1)3/2()(
log
01loglog 2/3
nnTnnf
nnn
nfba
nTnT
a
a
b
b
Metoda rekurencji uniwersalnej
3) (przypadek 2,0 dla )()(
)(
lg)(,4,3
lg)4/(3)(
3log
793,03loglog
4
4
nnf
nOnn
nnnfba
nnnTnT
ab
4/3gdylg)()4/lg()4/(3)/( cncnncfnnbnaf
dla dostatecznie dużych n:
więc: )lg()( nnnT
dr Paweł Drozda
Metoda zachłanna
Główne zastosowanie – problemy optymalizacji
Wybór w danej chwili najkorzystniejszy„Nadzieja” otrzymania globalnie optymalnego
rozwiązaniaPrzykłady zastosowania:
Znajdowanie minimum (maksimum) w tablicy N liczb Ciągły problem plecakowy Kody Huffmana – kompresja danych wykorzystując
tablicę częstości występowania znaków
dr Paweł Drozda
Znajdowanie minimum - implementacja
int min(int tab[]){
int i,minimum=tab[0];for (i=1; i<length(tab);i++)
if (tab[i]<minimum) minimum=tab[i];
return minimum;}
dr Paweł Drozda
Problem plecakowy
Sformułowanie problemuZłodziej rabujący sklep znalazł n przedmiotów. Każdy z
przedmiotów ma pewną wartość i pewną wagę. Problem polega na zmieszczeniu jak najwartościowszego łupu do plecaka mogącego pomieścić pewną liczbę kilogramów
Problem dyskretnyKażdy przedmiot jest kradziony w całości – część
przedmiotu jest bezwartościowa np. księgarnia, sklep monopolowy, skarbiec ze sztabami złota
Problem ciągłyprzedmiot można podzielić – część przedmiotu też ma
wartość np. sklep mięsny, odzież na wagę, skarbiec ze złotym piaskiem
dr Paweł Drozda
Problem plecakowy – przykład (1)
Dyskretny
waga 5kg wartość 60
zł
waga 10kg wartość 100 zł
waga 15kg wartość 120 zł
waga 10kg wartość 100 zł
waga 5kg wartość 60
zł
waga 10kg wartość 100 zł
waga 15kg wartość 120 zł
wartość kg:p1 = 12zł p2=10 zł
p3=8 zł
Metoda
zachłanna
Rozwiązanie optymalne
dr Paweł Drozda
Problem plecakowy – przykład (2)
Ciągły
waga 5kg wartość 60
zł
waga 10kg wartość 100 zł
waga 15kg wartość 120 zł
waga 10kg wartość
80 zł
waga 10kg wartość 100 zł
waga 5kg wartość 60
zł
wartość kg:p1 = 12zł p2=10 zł
p3=8 zł
Metoda zachłanna = rozwiązanie optymalne
dr Paweł Drozda
Programowanie dynamiczne
Główne zastosowanie – problem optymalizacjiPodobne do metody „dziel i zwyciężaj”Stosowane gdy podproblemy nie są
niezależneKażdy podproblem rozwiązywany tylko raz –
wynik rozwiązania zapamiętywany
dr Paweł Drozda
Etapy programowania dynamicznego
Scharakteryzowanie struktury optymalnego rozwiązania
Rekurencyjne zdefiniowanie kosztu optymalnego rozwiązania
Obliczenie optymalnego kosztu metodą wstępującą
Znalezienie optymalnego rozwiązania
dr Paweł Drozda
Przykład – linie montażowe
a1,
1
t2,1
a1,
n
a2,n
a1,
3
a1,
2
a2,3a2,2a2,1
t1,1 t1,2
t2,2e2
e1
x2
x1
Dwie linie montażowe – każda z linii ma n stanowisk Na i-tym stanowisku linii 1 jest wykonywana ta sama czynność co na i-tym stanowisku linii 2Czasy wykonania czynności są różneCzasy e i x są to odpowiednio czas umieszczenia elementu i zdjęcia elementu z liniiCzasy t oznaczają czas potrzebny na przeniesienie elementu z jednej linii na drugą
dr Paweł Drozda
Linie montażowe
Sformułowanie problemuWskazanie stanowisk montażowych na obu liniach tak,
aby czas montażu był jak najkrótszyAlgorytm brute force
Dla każdej możliwej ścieżki obliczany jest czas montażu, a następnie wybór najkrótszego czasu
Nie do przyjęcia – złożoność obliczeniowa jest nie mniejsza od 2n co dla dużych n jest nie do policzenia w zadawalającym czasie
dr Paweł Drozda
Linie montażowe – przykład
7
2
4
7
39
658
2 3
14
2
2
3
4
84
5
1
2
3
2
4
1
Rozwiązanie optymalne:linia 1: stanowiska 1,3,6 linia 2: stanowiska 2,4,5
JAK DO TEGO DOJŚĆ???
dr Paweł Drozda
Rozwiązanie – programowanie dynamiczne(1)
Etap 1 – struktura optymalnego rozwiązaniaNajszybszy sposób montażu do stanowiska i-tego pierwszej linii:
dla i=1 – istnieje tylko jeden sposóbdla i>1 – dwa sposoby:
• przejście ze stanowiska i-1 pierwszej linii – koszt przejścia pomijany
• Przejście ze stanowiska i-1 drugiej linii – koszt równy t2,n-1
Dla stanowisk i-1 koszt przejścia jest optymalny – Własność optymalnej podstruktury
Analogicznie dla stanowiska i-tego drugiej linii
Rozwiązanie problemu dla stanowiska i na każdej z linii
znalezienie rozwiązania podproblemów stanowisk i-1 dla każdej z linii
dr Paweł Drozda
Rozwiązanie – programowanie dynamiczne(2)
Etap 2 – rozwiązanie rekurencyjnef= min(f1[n]+ x1 , f2[n] + x2) – najkrótszy czas montażu
Wartości dla stanowisk 1:f1[1]=e1 + a1,1
f2[1]=e2 + a2,1
Sformułowanie równania dla dowolnego i:f1[i]=min(f1[i-1]+ a1,i, f2[i-1]+ t2,i-1 + a1,i)
f2[i]=min(f2[i-1]+ a2,i, f1[i-1]+ t1,i-1 + a2,i)
dr Paweł Drozda
Rozwiązanie – programowanie dynamiczne(3)
Obliczenia funkcja f oznacza optymalne rozwiązanie tabele s1, s2 dla i-tego stanowiska zawierają numer linii z
której pochodzi i-1 stanowisko w optymalnym rozwiązaniuf1[1]=e1 + a1,1
f2[1]=e2 + a2,1
for i=1 to n
if (f1[i-1]+ a1,i < f2[i-1]+ t2,i-1 + a1,i)
f1[i]=f1[i-1]+ a1,i, s1[i]=1
else f1[i]=f2[i-1]+ t2,i-1 + a1,i, s2[i]=2
analogicznie dla drugiej liniiif (f1[n]+ x1 < f2[n] + x2)
f= f1[n]+ x1, s=1
elsef = f2[n] + x2, s=2
dr Paweł Drozda
Rozwiązanie – programowanie dynamiczne(4)
Etap 4 – optymalne rozwiązanieOdczytanie odpowiednich numerów linii ze zmiennej s oraz
z tablic s1, s2 w kolejności od n-tego do pierwszego stanowiska montażu
dr Paweł Drozda
Problem montażu – rozwiązanie liczbowe
f1[1]=9 f1[2]=min(9+9, 12+2+9)=18, s1[2]=1 f1[3]=20, s1[3]=2
f2[1]=12 f2[2]=min(12+5, 9+2+5)=16, s2[2]=1 f2[3]=22, s2[3]=2
f1[4]=24, s1[4]=1 f1[5]=32, s1[5]=1 f1[6]=35, s1[6]=2
f2[4]=25, s2[4]=1 f2[5]=30, s2[5]=2 f2[6]=37, s2[6]=2
f=38, s=1numery linii dla poszczególnych wierzchołków od końca: 6-1, 5-2, 4-2, 3-
1, 2-2, 1-1
7
2
4
7
39
658
2 3
14
2
2
3
4
84
5
1
2
3
2
4
1