1 / 22

ALGORYTMY I STRUKTURY DANYCH

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.

arden
Télécharger la présentation

ALGORYTMY I STRUKTURY DANYCH

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ALGORYTMY I STRUKTURY DANYCH WYKŁAD 13 Techniki konstruowania algorytmów – przykłady Grażyna Mirkowska PJWSTK, 2002/2003

  2. Plan wykładu • Kody Huffmana • Mnożenie macierzy • Najdłuższy wspólny podciąg G. Mirkowska, ASD_13 Progamowanie dynamiczne

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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 (XY) else return Ai} Algorytm G. Mirkowska, ASD_13 Progamowanie dynamiczne

  17. 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

  18. 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

  19. 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

  20. 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 xmyn Koszt Koszt obliczenia d(X,Y) wynosi card(X) * card(Y)porównań. 0 1 1 G. Mirkowska, ASD_13 Progamowanie dynamiczne

  21. 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

  22. 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

More Related