220 likes | 426 Views
ALGORYTMY I STRUKTURY DANYCH. WYKŁAD 13 Techniki konstruowania algorytmów – przykłady Grażyna Mirkowska PJWSTK, 2002/2003. Plan wykładu. Kody Huffmana Mnożenie macierzy Najdłuższy wspólny podciąg. Problem kodowania.
E N D
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 13 Techniki konstruowania algorytmów – przykłady Grażyna Mirkowska PJWSTK, 2002/2003
Plan wykładu • Kody Huffmana • Mnożenie macierzy • Najdłuższy wspólny podciąg G. Mirkowska, ASD_13 Progamowanie dynamiczne
Problem kodowania Dany jest ciąg znaków. Chcemy tak zapisać ten ciąg, by zajmował jak najmniej miejsca i by dało się go potem łatwo odtworzyć. 100 000 znaków zajmuje 800 000 bitów. Znak = liczba 0-255, czyli 8 bitów 100 000 znaków zajmuje 300 000 bitów. Jeśli w naszych danych występuje tylko 6 różnych znaków, to 3 bity wystarczą do ich zakodowania, np.: 000,001,010,011,100,101 G. Mirkowska, ASD_13 Progamowanie dynamiczne
Kody stałej i zmiennej długości Kody o stałej długości -- wszystkie słowa kodowe mają tę samą długość Kody o zmiennej długości -- długość słowa kodowego zależy od częstości występowania danego znaku w ciągu danych. Znaki występujące często mają kod możliwie krótki. Przykład Używając kodua= 0, b= 101,c= 100, d=111, e=1101, f=1100 nasz tekst można zakodować na 224000bitach. Niech będzie tekst 100000 znakowy, w którym występują tylko litery a,b,c,d,e,f i a-45tys razy, b-13tys., c-12tys., d-16tys., e - 9tys., f-5tys. razy. G. Mirkowska, ASD_13 Progamowanie dynamiczne
Kody prefiksowe tzn,. Nie istnieją takie dwa słowa a i b a=(a1,...an) i b=(b1,b2...,bm) n<m , że a1=b1, a2= b2... ai = bi dla i=1...n. ZASADA Żadne słowo kodowe nie jest prefiksem żadnego innego słowa kodowego. Twierdzenie Jeśli istnieje optymalne kodowanie, to zawsze można znaleźć kod prefiksowy, który go realizuje. Chodzi o to by można było jednoznacznie odczytać zakodowany tekst. G. Mirkowska, ASD_13 Progamowanie dynamiczne
100 86 14 58 28 14 B:13 C:12 D:16 E:9 F:5 Drzewo kodowe (1) Każda ścieżka odpowiada jednemu słowu kodowemu. W lewo = 0 w prawo = 1 A:45 F ma kod 101 Kod stałej długości Znak + częstość występowania G. Mirkowska, ASD_13 Progamowanie dynamiczne
100 A:45 55 30 25 C:12 B:13 14 D:16 F:5 E:9 Drzewo kodowe(2) Optymalny kod zawsze jest reprezentowany przez lokalnie pełne drzewo binarne. A 0B 101C 100D 111E 1101F 1100 Ciąg: 0100110110101100 Odczytujemy jako:ACEBAF Kod zmiennej długości G. Mirkowska, ASD_13 Progamowanie dynamiczne
f lewy prawy Konstrukcja kodu Huffmana liść 1.Utworzyć kolejkę priorytetową PQ zawierającą wszystkie znaki alfabetu wraz z ich częstością wystąpienia Znakf 2. For i :=1 to n-1 do a := min(PQ); PQ := delmin(PQ); b := min(PQ); PQ := delmin(PQ); z := New node (a,b); z.f := a.f + b.f; PA := insert(PQ, z); od; return min (PQ); Wierzchołek wewnętrzny Koszt O(n lgn) Algorytm zachłanny G. Mirkowska, ASD_13 Progamowanie dynamiczne
0 1 1 0 25 A:45 25 30 0 1 0 1 14 C:12 C:12 B:13 B:13 14 D:16 A:45 14 14 D:16 25 D:16 A:45 0 1 F: 5 E: 9 C:12 B:13 D:16 A:45 F: 5 E: 9 F: 5 E: 9 F: 5 C:12 E: 9 B:13 Przykład 100 A:45 55 Konstrukcja kodu Huffmana 30 G. Mirkowska, ASD_13 Progamowanie dynamiczne
Mnożenie macierzy Dany jest ciąg macierzy A1, A2,...,An. Obliczyć iloczyn A1 A2... An tak by koszt mnożenia był najmniejszy. Uwaga: Możemy pomnożyć macierz A1 przez A2 wttwgdy A1 ma tyle kolumn ile A2 wierszy .Koszt = A1 .w *A1 .k*A2 .k Przykład Obliczyć A B C. A(10 100) B(100 5) C(5 50) (A B) C = A ( B C) Koszt prawej strony = (100 *5*5 0) + (10*100*50) = 75000 mnożeń skalarnych Koszt lewej strony = (10 *100*5 ) + (10*5*50)= 7500 mnożeń skalarnych G. Mirkowska, ASD_13 Progamowanie dynamiczne
Prosty Algorytm? n-1- sza liczba Catalana(4n/n 3/2) Rozważyć wszystkie możliwe ustawienia nawiasów w ciągu, a potem wykonać mnożenia zgodnie z ustawieniem nawiasów. Za każdym razem wyliczyć koszt mnożenia przy danym ustawieniu nawiasów i wybrać to ustawienie, które ma koszt najmniejszy. Za duży koszt! Pomysł A ile jest możliwych ustawień nawiasów? (A1,..., Ak) ( Ak+1..,An) Niech P(n) będzie liczbą ustawień nawiasów w ciągu n elementowym. G. Mirkowska, ASD_13 Progamowanie dynamiczne
Paradygmat programowania dynamicznego 1. Scharakteryzować strukturę rozwiązania optymalnego. W naszym przykładzie: dla pewnego k, policzymy najpierw optymalne ustawienie nawiasów dla iloczynu (A1,..., Ak) potem optymalne ustawienie nawiasów dla iloczynu (Ak+1..,An), a potem dodamy do tego koszt mnożenia 2 macierzy. Rozwiązanie optymalne zawiera w sobie optymalne rozwiązania dla podproblemów. 2. Zdefiniować rekurencyjnie wartość rozwiązania optymalnego, jako funkcję rozwiązań optymalnych dla podproblemów. G. Mirkowska, ASD_13 Progamowanie dynamiczne
Liczymy minimalny koszt Niech m[i,j] będzie minimalną liczbą mnożeń skalarnych potrzebnych do policzenia iloczynu ( Ai..,Aj), oraz macierz Ai ma wymiar (p i-1 pi). Przecież można zapamiętywać policzone wcześniej wartości m[i,j]! Niech s[i,j] = to k, które realizuje minimum dla m[i,j]. Rekurencyjny algorytm obliczania m[i,j] nie jest możliwy, bo jego koszt jest wykładniczy, ale... G. Mirkowska, ASD_13 Progamowanie dynamiczne
Algorytm MCM Ustawienie początkowej wartości elementów tablicy m. for i :=1 to n do m[i,i] :=0; od;for x := 2 to n do for i := 1 to n-x+1 do j := i+x-1 m[i,j] := +; for k := i to j-1do q := m[i,k]+m[k+1,j] + pi-1*pk *pj; if q < m[i,j] then m[i,j] := q; s[i,j] :=k fi od ododreturn m,s; Dwie pętle odpowiedzialne za wypełnienie wszystkich elementów m[i,j]. Wyszukiwanie minimum Koszt O(n3) G. Mirkowska, ASD_13 Progamowanie dynamiczne
6 1 15125 5 2 11875 10500 4 3 9375 7125 5375 3 4 7875 4375 2500 3500 2 5 15750 2625 750 1000 5000 1 6 6 1 0 0 0 0 0 0 3 5 2 3 3 4 3 3 3 3 3 4 1 3 3 5 2 5 1 2 3 4 5 6 m[2,5]= min {m[2,2] + m[3,5] + p1*p2*p5,,m[2,3] + m[4,5] + p1*p3*p5,m[2,4] + m[5,5] + p1*p4*p5 } Tablica s A1 A2 A3 A4 A5 A6 Tablica m G. Mirkowska, ASD_13 Progamowanie dynamiczne
W jakiej kolejności mnożyć? Zasada 3 paradygmatu programowania dynamicznego: Skonstruować rozwiązanie problemu na bzie wyliczonych wielkości. W naszym przykładzie :|Mnóż (A,s,1,6) daje : (A1(A2 A3))((A4A5) A6) mnóż(A,s,i,j){ If j>i then X := Mnóż(A,s,i,s[i,j]); Y:= mnóż(A,s,s[i,j]+1,j); return wynik mnożenia macierzy (XY) else return Ai} Algorytm G. Mirkowska, ASD_13 Progamowanie dynamiczne
Najdłuższy wspólny podciąg Dane są dwa ciągi znaków X i Y X=(x1,…xm) Y = (y1,…,yn) Znaleźć ciąg Z=(z1,…zk) taki, że Z jest najdłuższym podciągiem zarówno ciągu X jak i Y, ozn. Z = nwp(X,Y) Problem Ale to zbyt dużo kosztujeO(2m) • Wygenerować wszystkie podciągi ciągu X. • Dla każdego z tych ciągów sprawdzić czy występuje w Y, zapamiętując jednocześnie najdłuższy z takich ciągów. Algorytm naiwny Przykład X = aawbbsccpddolnY = xxwsyyypozzlny nwp(X,Y) = wspólny G. Mirkowska, ASD_13 Progamowanie dynamiczne
Analiza zadania Niech X= (x1,…xm) Y= (y1,…,yn) oraz nwp(X,Y) = Z , gdzie Z=(z1,…zk).Jeżeli xm=yn, wtedy zc=xm=yn oraz Z k-1= nwp(Xm-1, Yn-1),Jeżeli xm yn, wtedy Z = nwp(Xm-1,Y), gdy zk xmoraz Z = nwp(X,Yn-1), gdy zk yn. Twierdzenie Oznaczenie: Xi =(x1,…xi) G. Mirkowska, ASD_13 Progamowanie dynamiczne
Algorytm2 konkatenacja Function nwp(X,Y :string) : string;begin if x(m)=y(n) then Z := nwp(X m-1 1, Y n-1)o x(m) else Z1 := nwp(X m-1, Y); Z2 := nwp(X,Y n-1); Z := dluższy z ciągów Z1 i Z2; fi end; Koszt tego algorytmu będzie w najgorszym razie wykładniczy. G. Mirkowska, ASD_13 Progamowanie dynamiczne
Przykład 1 2 3 4 5 6 B D C A B A 1 A 0 0 0 1 1 22 B 1 1 1 1 2 23 C 1 1 2 2 2 2 Jak wyliczyć długość nwp(X,Y)? długość najdłuższego wspólnego podciągu ciągów X,Y. d(X,Y) = d( X m-1 ,Y n-1 ) +1, gdy xm=yn d(X,Y) = max (d(X m-1 ,Y),d(X ,Y n-1 ), gdy xmyn Koszt Koszt obliczenia d(X,Y) wynosi card(X) * card(Y)porównań. 0 1 1 G. Mirkowska, ASD_13 Progamowanie dynamiczne
Algorytm Begin for i :=1 to m do d(i,0):=0 od;for j :=0 to n do d(0,j) := 0 od; for i :=1 to m dofor j :=1 to n do if x(i)=y(j) then d(i,j) := d(i-1,j-1) +1; b(i,j) := „\” else if d(i-1,j) d(i,j-1) then d(i,j) := d(i-1,j); b(i,j) := „” else d(i,j) := d(i,j-1); b(i,j) := „ ” fi fiod od end Po przekątnej zadanie, które trzeba rozwiązać,żeby otrzymać optymalny wynik. „w górę” zadanie, które trzeba rozwiązać, żeby otrzymać optymalny wynik „w lewo” zadanie, które trzeba rozwiązać, żeby otrzymać optymalny wynik G. Mirkowska, ASD_13 Progamowanie dynamiczne
Przykład b(i,j) 1 2 3 4 5 6 B D C A B A 0 0 0 0 0 01 A 0 0 0 0 1 1 22 B 0 1 1 1 1 2 23 C 0 1 1 2 2 2 24 B 0 1 1 2 2 3 35 D 0 1 2 2 2 3 36 A 0 2 2 3 3 4 47 B 0 1 2 2 3 4 4 Wypisanie nwp Procedure Drukuj(b,i,j);begin if i=0 or j=0 then return fi; if b(i,j) = „\” then call drukuj(b,i-1,j-1); write(x(i)) else if b(i,j) = „ ” then call drukuj(b,i-1,j) else call drukuj (b,i,j-1) fi fi end 0 1 1 2 2 3 3 4 4 G. Mirkowska, ASD_13 Progamowanie dynamiczne