Algorytmy i struktury danych
This presentation is the property of its rightful owner.
Sponsored Links
1 / 22

ALGORYTMY I STRUKTURY DANYCH PowerPoint PPT Presentation


  • 76 Views
  • Uploaded on
  • Presentation posted in: General

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.

Download Presentation

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


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

Plan wykładu

  • Kody Huffmana

  • Mnożenie macierzy

  • Najdłuższy wspólny podciąg

G. Mirkowska, ASD_13 Progamowanie dynamiczne


Problem kodowania

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

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


Drzewo kodowe 1

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


Drzewo kodowe 2

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


Konstrukcja kodu huffmana

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


Przyk ad

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

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

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

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

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

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


Algorytmy i struktury danych

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

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


Najd u szy wsp lny podci g

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

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

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)

elseZ1 := 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


Jak wyliczy d ugo nwp x y

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


Algorytm

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


Wypisanie nwp

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) = „\” thencall drukuj(b,i-1,j-1);write(x(i)) else if b(i,j) = „ ” thencall drukuj(b,i-1,j) elsecall drukuj (b,i,j-1) fi fi

end

0

1

1

2

2

3

3

4

4

G. Mirkowska, ASD_13 Progamowanie dynamiczne


  • Login