Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Dinamikus programozás Szlávi Péter ELTE IK

Hasonló előadás


Az előadások a következő témára: "Dinamikus programozás Szlávi Péter ELTE IK"— Előadás másolata:

1 Dinamikus programozás Szlávi Péter ELTE IK

2  Szlávi Péter: Dinamikus programozás 2/57 Dinamikus programozás * tartalom 0 Bevezetés 1 Egy gondolatébresztő példa 2 Első példázat * pénzváltás 3 Második példázat * optimális pénzváltás 4 Harmadik példázat * tükörszavak 5 Irodalom

3  Szlávi Péter: Dinamikus programozás 3/57 0Bevezetés A lényeg: A lényeg: Valamilyen probléma (optimális) megoldása úgy, hogy 1. rekurzívan visszavezetjük rész- problémák megoldására, de 2. a rekurzió elkerülését (minimális- ra szorítását) egy táblázat felépíté- sével, és újrahasznosításával érjük el…

4  Szlávi Péter: Dinamikus programozás 4/57 1Egy gondolatébresztő példa 1.1 Az „iskolapélda” – pénzfelválthatóság Bemenete Bemenete: P={p 1,...,p N } pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete: FelválthatóE logikai érték – jelentése = fel- váltható-e az E a P halmazban felsorolt cím- letekkel úgy, hogy minden címletet legfeljebb egyszer használunk fel

5  Szlávi Péter: Dinamikus programozás 5/57 1Egy gondolatébresztő példa 1.2 A példa „ízlelgetése” A felváltás „szerkezetének” elemzése Egy logikus rekurzív kapcsolat: Tfh. felváltható az E, ekkor (1a)E = p i 1 +…+p i k, feltehető: (1b)i 1 <…

6  Szlávi Péter: Dinamikus programozás 6/57 1Egy gondolatébresztő példa Részproblémákra bontás A felhasználható címleteket rögzített sorrendűnek tekintve a {p 1,…,p i } hal- mazt egyértelműen azonosíthatjuk i- vel. Így bármely (rész)probléma azonosítható az (X,i) paraméter-kettőssel, ahol X a felváltandó összeg és i a felváltáshoz felhasználható címletek utol- sójának indexe A feladat: (E,N). A (2)-ben megfogal- mazott részfeladat: (E-p i k,i k -1). (2)

7  Szlávi Péter: Dinamikus programozás 7/57 1Egy gondolatébresztő példa Rekurzív összefüggések a részproblé- mák és megoldásaik között (vázlatosan) FV: N  N  L FV(X,i) = Igaz, ha 1.p i =X, vagy 2.p i

8  Szlávi Péter: Dinamikus programozás 8/57 Rekurzív megoldás egy lehetséges algoritmusa type TCimletek=record db:integer; cimlet: array [1..MaxCimletDb] of integer end; var Cimletek:TCimletek; function FV(const X{ felváltandó }, i{ max.index }:integer):boolean; begin FV:=((i>0) and (Cimletek.cimlet[i]=X)) // i. éppen a kellő címlet FV:=((i>0) and (Cimletek.cimlet[i]=X)) // i. éppen a kellő címlet or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and (Cimletek.cimlet[i] 1) and (Cimletek.cimlet[i]

9  Szlávi Péter: Dinamikus programozás 9/57 Próbák – elemzések: a) a) Kis címletszám (pl. {1,2,5}) mellett „igenlő” a megoldás (pl. 8) – hívás i sorrend „tagadó” a megoldás (pl. 9) – hívási sorrend mindkét végeredményhez olyan ada- tok alapján, amelyben van ismétlődő címlet – hívási sorrend, hívás-szám b) b) Különféle címletszám (pl. 5, 9, 15, …) mellett olyan összeg, amely azért nem váltható fel, mert túl nagy – hívás-szám növekedése Próbáljuk kiPróbáljuk ki és következtessünk! Zip, exeZipexe 1Egy gondolatébresztő példa

10  Szlávi Péter: Dinamikus programozás 10/57 1Egy gondolatébresztő példa … FV:=((i>0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet FV:=((i>0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and (Cimletek.cimlet[i] 1) and (Cimletek.cimlet[i]

11  Szlávi Péter: Dinamikus programozás 11/57 1Egy gondolatébresztő példa … FV:=((i>0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet FV:=((i>0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and (Cimletek.cimlet[i] 1) and (Cimletek.cimlet[i]

12  Szlávi Péter: Dinamikus programozás 12/57 1Egy gondolatébresztő példa Tapasztalatok : A hívások módszeresen következnek egy- másután. Akár iterációval is „utánozhat- nánk”. (Legalábbis az ismétlésmentes esetben.) Az ismétlésmentes esetekben a hívás-szá- mok legfeljebb 1 értékűek, azaz legfeljebb egyszeres számolást jeleznek, ami a haté- konyság szempontjából megnyugtató. A 3. futásnál is még legfeljebb 2 az ismétlődő számítás, de a 4.-nél, ami alig különbözik a 3.-tól, már 4 helyen is „tripletet” látunk. S ez rosszat sejtet. kód

13  Szlávi Péter: Dinamikus programozás 13/57 1Egy gondolatébresztő példa A hívások során egy bináris fát „járunk be”. Pl. a „9 összeg {1,2,5} címletekkel” futáshoz tartozó bináris fa. kód … FV:=((i>0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet FV:=((i>0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and (Cimletek.cimlet[i] 1) and (Cimletek.cimlet[i]

14  Szlávi Péter: Dinamikus programozás 14/57 1Egy gondolatébresztő példa b)tesztek

15  Szlávi Péter: Dinamikus programozás 15/57 1Egy gondolatébresztő példa Újabb tapasztalatok :. Durván növekszik a hívás-szám (mindkét) paraméter növekedtével. A legrosszabb (negatív végeredményű) esetekben a hívás-számokra „gyanús” értékeket kaptunk. Állítás: Ha RekHDb(X,i) az X összeg felbonthatósá- gához szükségez rekurzív hívások számát jelenti (i. címlettel bezárólag), akkor legked- vezőtlenebb esetben a szükséges rekurzív hívások száma: RekHDb(X,i) = 2 i –1 A hívás-szám maximumát igenlő esetben is elérhetjük. Példát erre láss itt! A hívás-szám maximumát igenlő esetben is elérhetjük. Példát erre láss itt!itt

16  Szlávi Péter: Dinamikus programozás 16/57 1Egy gondolatébresztő példa A dinamikus programozásos megoldás Táblázatba gyűjtjük a részproblé- mákra adott válaszokat. A táblázat sorai az egyes X összegek- hez, oszlopai az egyes p i címletekhez rendeli az FV(X,i) értékeket. Éppúgy, ahogy az előbbi programnál tettünk, csakhogy ott tisztán adminisztratív, működés- megértési céllal. A táblázatkitöltést a kis értékek felöl kezdjük: hiszen az FV(X,i) rekurzió- jában FV(X,i–1) és FV(X–p i,i–1) szere- pel. Röviden: DP.

17  Szlávi Péter: Dinamikus programozás 17/57 1Egy gondolatébresztő példa A megoldó kód vázlata: Az sgRekTab jelenti most a táblázatot: function PenzValtas_DinProg:boolean; begin Tablafeltoltes(Felvaltando,Cimletek.db); PenzValtas_DinProg:=sgRekTab.Cells[Cimletek.db+1, Felvaltando+2]='+'; end;

18  Szlávi Péter: Dinamikus programozás 18/57 1Egy gondolatébresztő példa procedure Tablafeltoltes (const E{felváltandó}, N{max.index}:integer); var i,x:integer; begin with fmPenzValtas do begin for x:=1 to E do begin sgRekTab.Cells[2,x+2]:='-'; //első oszlop (=2 indexű) Hamis end;//for x //kivéve az 1. cimletnél: if Cimletek.cimlet[1]<=E then //van még cimlet[1]-dik sor? begin sgRekTab.Cells[2,Cimletek.cimlet[1]+2]:='+'; end;//if …

19  Szlávi Péter: Dinamikus programozás 19/57 1Egy gondolatébresztő példa … for i:=2 to N do //az i. oszlop számítása begin for x:=1 to E do begin if (Cimletek.cimlet[i]=x) or (sgRekTab.Cells[i,x+2]='+') or ((Cimletek.cimlet[i]0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet FV:=((i>0) and (Cimletek.cimlet[i]=X)) //i. éppen a kellő címlet or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and FV(X,i-1)); //nem az, de i-1.-ig felváltható or ((i>1) and (Cimletek.cimlet[i] 1) and (Cimletek.cimlet[i]

20  Szlávi Péter: Dinamikus programozás 20/57 1Egy gondolatébresztő példa Összehasonlító futás: Próbáljuk kiPróbáljuk ki és következtessünk! Zip, exeZipexe

21  Szlávi Péter: Dinamikus programozás 21/57 1Egy gondolatébresztő példa Megjegyzések: A rekurzív megoldás fajlagos ismétlési száma: /  41. A rekurzív megoldás fajlagos ismétlési száma: /  41. A DP darab táblaelemet szá- mol ki, de csak egyszer. A DP darab táblaelemet szá- mol ki, de csak egyszer. A fajlagos sebesség növekedés: /  4,7. A fajlagos sebesség növekedés: /  4,7. A „feleslegesen” kiszámolt táblaelem szám: ( – ) =  7,8 szorosa a szükségesnek. A „feleslegesen” kiszámolt táblaelem szám: ( – ) =  7,8 szorosa a szükségesnek.

22  Szlávi Péter: Dinamikus programozás 22/57 1Egy gondolatébresztő példa Egy „okosabb” DP megoldás Ötlet: ötvözni a rekurzív megoldás célratörését, azaz „ csak azt kiszámol- ni, amit muszáj ” elvét a DP megoldás „ mindent csak egyszer kiszámolni ” elvével. Tehát a számítás logikája rekurzív marad, de mielőtt egy rekurzív hívást kezdeményeznénk, megnézzük, nem lett-e már kiszámolva.

23  Szlávi Péter: Dinamikus programozás 23/57 1Egy gondolatébresztő példa function FV(const X,i:integer):boolean; begin if (fmPenzValtas.sgRekTab.Cells[i+1,X+2]='+') then begin FV:=true end else if (fmPenzValtas.sgRekTab.Cells[i+1,X+2]='-') then begin FV:=false end else begin FV:=((i>0) and (Cimletek.cimlet[i]=X)) or ((i>1) and FV(X,i-1)) or ((i>1) and (Cimletek.cimlet[i]

24  Szlávi Péter: Dinamikus programozás 24/57 1Egy gondolatébresztő példa Összehasonlító futás: Próbáljuk kiPróbáljuk ki és következtessünk! Zip, exeZipexe

25  Szlávi Péter: Dinamikus programozás 25/57 1Egy gondolatébresztő példa 1.3 A DP módszerének váza 1. A megoldás szerkezetének tanulmányozása – részproblémákra bontás megsejtése 2. Részproblémákra és összetevőkre bontás – részproblémák és paramétereik körvonala- zása: a rekurzió előkészítése 3. Részproblémák megoldásának kifejezése rekurzívan az összetevők megoldásaiból – formalizálás: függvény­definíció 4. Részproblémák megoldásának kiszámítása – a táblaszámítás algoritmizálása 1. kiszámítási sorrend meghatározása: minden részprob- léma minden összetevője előbb szerepeljen a felsorolás- ban 2. az „alulról-felfelé” haladó számítás 5. A megoldás előállítása a 4. lépésben előállított táblázat segítségével – a megoldás algoritmizálása

26  Szlávi Péter: Dinamikus programozás 26/57 2Első példázat – pénzváltás 2.1 A feladat Bemenete Bemenete: P={p 1,...,p N } pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete: S  P – a felváltásban szereplő pénzcímletek; az S halmazban felsorolt címleteket legfeljebb egyszer használhatjuk fel

27  Szlávi Péter: Dinamikus programozás 27/ A megoldás A megoldás szerkezetének tanulmányozása Ua. mint korábban… korábban 2Első példázat – pénzváltás

28  Szlávi Péter: Dinamikus programozás 28/ Részproblémákra és összetevők- re bontás A részproblémák a korábbiakhoz hason- lóan fogalmazhatók meg. Az FV(X,i) jelentése viszont más: a legna- gyobb P-beli elem indexe, amely még előfordul az X felváltásában. Pl.: P={2,4,5}  N=3; X=7, akkor S={2,5} FV(7,3)= 3, mert p 3 =5, FV(7-p 3, 3 -1)=FV(7-5, 3 -1)= 1, mert p 1 =2, FV(2-p 1, 1 -1)=FV(2-2, 1 -1)=FV(0, 0 ). 2Első példázat – pénzváltás

29  Szlávi Péter: Dinamikus programozás 29/ Részproblémák megoldásának kifejezése Vegyük észre, hogy akkor N+1 az ered- mény, ha nincs megoldás, s o, ha már nem kell folytatni. 2Első példázat – pénzváltás

30  Szlávi Péter: Dinamikus programozás 30/57 2Első példázat – pénzváltás Részproblémák megoldásának kiszámítása A FV definíciójából látszik: csökkenő pa - raméterekhez nyúl vissza, így a táblaki- töltő számítás kis értékektől indulhat a nagyobbak felé…

31  Szlávi Péter: Dinamikus programozás 31/57 2Első példázat – pénzváltás A megoldás előállítása A megoldás meghatározása most bonyodalmasabb, mint volt korábban: hiszen most egy index et kapunk a függvény ér- tékeként (k 1 =FV(E,N)). A táblá- zatból kiolvasható a követke- zőé (k 2 =FV(E–p k 1,k 1 –1)), majd az azt követőé éít. Amíg a fel- váltandó összegparaméter 0-ra nem csökken. Rekurzív megoldás esetén persze ez a visszalépdelés is rekurzívan történne.

32  Szlávi Péter: Dinamikus programozás 32/57 2Első példázat – pénzváltás begin //PenzValtas_DinProg Tablafeltoltes(Felvaltando,Cimletek.db); KiCimletek.db:=0; if strToInt(sgRekTab.Cells[Cimletek.db+1,Felvaltando+2])<= Cimletek.db then begin kX:=Felvaltando; k:=Cimletek.db; while kX>0 do begin k:=strToInt(sgRekTab.Cells[k+1,kX+2]); inc(KiCimletek.db); KiCimletek.cimlet[KiCimletek.db]:=Cimletek.cimlet[k]; kX:=kX-Cimletek.cimlet[k]; dec(k); end; //while end; //if end; //PenzValtas_DinProg k. címlet már nem lehet, legfeljebb kisebb indexű kX felváltásához szükséges legnagyobb címlet indexe: k kX: a maradék összeg van megoldás: leg- alább egy címlet Az sgRekTab-ban az FV- értékek; a KiCimletek-ben képződik az eredmény

33  Szlávi Péter: Dinamikus programozás 33/57 DP 2Első példázat – pénzváltás Összehasonlító futás: Próbáljuk ki és következtessünk! Rekurzív: Zip, exe; DP: Zip, exe; „okos” DP: Zip, exe.ZipexeZipexeZipexe Rekurzív „okos” DP

34  Szlávi Péter: Dinamikus programozás 34/57 3Második példázat – optimális pénzváltás 3.1 A feladat Bemenete Bemenete: P={p 1,...,p N } pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete: S  P – a felváltásban szereplő pénzcímletek; az S halmazban felsorolt címleteket legfeljebb egyszer használhatjuk fel; S a lehető legkisebb elemszámú

35  Szlávi Péter: Dinamikus programozás 35/ A megoldás … és nem lehetne „mohóskodni”… ? A problémánkhoz illeszkedő mohó választás: a még választhatók közül a legnagyobb címlet. Egy ellenpélda: P={5,4,4,1,1,1} és E=8; a mohó megoldás: 8= , ennél jobb: 8=4+4. 3Második példázat – optimális pénzváltás

36  Szlávi Péter: Dinamikus programozás 36/ A megoldás szerkezetének tanulmányozása Ua. mint korábban… korábban 3Második példázat – optimális pénzváltás

37  Szlávi Péter: Dinamikus programozás 37/ Részproblémákra és összetevők- re bontás A részproblémák a korábbiakhoz hason- lóan fogalmazhatók meg. Két lépésben oldjuk meg a feladatot. 1. Az Opt(X,i) jelentése: X felváltásához szükséges (első i közül választható) címletek száma. 2. Az FV(X,i) jelentése: a legnagyobb P- beli elem indexe (  i), amely még elő- fordul a X felváltásában. (Építünk az Opt-ra.) 3Második példázat – optimális pénzváltás

38  Szlávi Péter: Dinamikus programozás 38/57 3Második példázat – optimális pénzváltás Részproblémák megoldásának kifejezése Vegyük észre, hogy akkor N+1 az ered- mény, ha nincs megoldás; 0, ha célhoz értünk.

39  Szlávi Péter: Dinamikus programozás 39/57 Egy váratlan probléma: A futás adminisztrálását végző táblapár nincs szinkron- ban. Bajt okoz, hogy a bal-felső tábla (1,2) eleme üres. Pedig az alkalmazás foglalkozott vele, hiszen a bal-alsó tábla (1,2) cellája helyesen 1 értéket tartalmaz. 3Második példázat – optimális pénzváltás FV Opt

40  Szlávi Péter: Dinamikus programozás 40/57 3Második példázat – optimális pénzváltás A probléma magyarázata: Az FV definíciójának optimumra hivatko- zó rekurzív (3.) ágánál tartunk, „készen kapja” a döntéséhez szükséges informá- ciót. Ezért nem bontogatja le sem az (X– p i,i–1), sem az (X,i–1) részproblémákra; 3. így a megoldás alapjául szolgáló, admi- nisztratív táblázat ezen elemei kitöltet- lenek maradnak; és a címleteket összeszedő részben katasz- trófát okoz.

41  Szlávi Péter: Dinamikus programozás 41/57 3Második példázat – optimális pénzváltás A probléma megoldása: Az optimum kiszámításra többlet admi- nisztrációt kell bízni: feljegyzi az FV- hez tartozó táblázatba az általa e pil- lanatban még ismert információt, hogy hányadik címlet szerepel a felbontás- ban.

42  Szlávi Péter: Dinamikus programozás 42/57 3Második példázat – optimális pénzváltás Részproblémák megoldásának kiszámítása A táblázatgenerálás sorrendje: A címletek szerint „alulról fölfelé” halad- va, de az érték szerint fordítva. A fordított irány magyarázatául: az optimumot kiszámoló függvényhez tar- tozó táblázatot megspórolhatjuk ( nincs szükség rá a végeredmény generálásához ); az optimumot kiszámoló függvényhez tar- tozó táblázatot megspórolhatjuk ( nincs szükség rá a végeredmény generálásához ); mivel csak az előző címlet oszlop ára hivat- kozik, elegendő azt és az éppen számítás alatt állót megtartani, sőt mivel csak az előző címlet oszlop ára hivat- kozik, elegendő azt és az éppen számítás alatt állót megtartani, sőt egyetlen oszlop is elegendő (lenne:-), ha a kiszámítás sorrendjét megfordítjuk. egyetlen oszlop is elegendő (lenne:-), ha a kiszámítás sorrendjét megfordítjuk.

43  Szlávi Péter: Dinamikus programozás 43/57 3 Második példázat – optimális pénzváltás A megoldás előállítása A megoldás meghatározása most az előző- vel megegyező módon történik. előző

44  Szlávi Péter: Dinamikus programozás 44/57 3Második példázat – optimális pénzváltás az „okos” DP szokásos jelzője A puding próbája: Az alábbi táblázat összefoglalja a re- kurzív és a memorizálós DP alkal- mazás rekurzív hívásainak számát az {1,2,5,10,20,50,100,200,500,1000,1,2, 5,10,20,50,100,200,500,1000} címletek esetén: FV + Opt FVOpt E

45  Szlávi Péter: Dinamikus programozás 45/57 3Második példázat – optimális pénzváltás A nem optimális, rekurzív megoldás Összehasonlító futás: Próbáljuk ki és elemezzük! Rekurzív: Zip, exe; DP: Zip, exe; „okos” DP: Zip, exe.ZipexeZipexeZipexe Az optimális, rekurzív megoldás

46  Szlávi Péter: Dinamikus programozás 46/57 3Második példázat – optimális pénzváltás Megjegyzések: Kitöltött táblaelemek száma kicsivel több, mint a nem optimális megoldást kereső esetében. ( Mindkét táblát figyelem- be véve valamivel több, mint kétszerese. ) Kitöltött táblaelemek száma kicsivel több, mint a nem optimális megoldást kereső esetében. ( Mindkét táblát figyelem- be véve valamivel több, mint kétszerese. ) FV rekurzív hívások száma minimális. Az FV-hez tartozó táblázat kitöltését döntően az Opt függvény végzi. FV rekurzív hívások száma minimális. Az FV-hez tartozó táblázat kitöltését döntően az Opt függvény végzi. A rekurzív hívások száma kisebb az optimumra nem törekvőénél. A rekurzív hívások száma kisebb az optimumra nem törekvőénél. Sokkal kevésbé nő az össz rekurzív hívások száma az előbbinél. Sokkal kevésbé nő az össz rekurzív hívások száma az előbbinél.

47  Szlávi Péter: Dinamikus programozás 47/57 4Harmadik példázat – tükörszavak 4.1 A feladat Bemenete Bemenete: szó={b 1,...,b N } szó – jelek sorozataKimenete: bj természetes szám – minimálisan ennyi jel beillesztésével tehető a szó palindrommá (tükörszóvá).

48  Szlávi Péter: Dinamikus programozás 48/57 4Harmadik példázat – tükörszavak 4.2 A megoldás A megoldás szerkezetének tanulmányozása TSz(S): az a szöveg, amely minimális számú jel beillesztésével képződik az S-ből. Ilyen biztosan van: S&S’, ahol S’ az S megfordítása.

49  Szlávi Péter: Dinamikus programozás 49/57 Esetek: Ha S= , akkor TSz(S)=  =S. Ha S= , akkor TSz(S)=  =S. Ha S egy jelből áll, akkor maga is tükörszó, azaz TSz(S)=S. Ha S egy jelből áll, akkor maga is tükörszó, azaz TSz(S)=S. Legyen S=x&R&y, ahol x, y az S első és utolsó jele, és R akár üres is lehet. Legyen S=x&R&y, ahol x, y az S első és utolsó jele, és R akár üres is lehet. Ha x=y, akkor TSz(S)=x&TSz(R)&y. Ha x=y, akkor TSz(S)=x&TSz(R)&y.… 4Harmadik példázat – tükörszavak

50  Szlávi Péter: Dinamikus programozás 50/57 4Harmadik példázat – tükörszavak … Ha x  y, akkor TSz(S) első és utolsó jele vagy x vagy y. Ha x  y, akkor TSz(S) első és utolsó jele vagy x vagy y. Ha TSz(S)=x&U&x, ekkor x-et szúr- tunk be a végére, azaz U=TSz(R&y). Ha TSz(S)=x&U&x, ekkor x-et szúr- tunk be a végére, azaz U=TSz(R&y). Ha TSz(S)=y&U&y, ekkor y-t szúrtunk be az elejére, azaz U=TSz(x&R). Ha TSz(S)=y&U&y, ekkor y-t szúrtunk be az elejére, azaz U=TSz(x&R). Vagyis U gyanánt (ami eggyel rövidebb S-nél) a TSz(R&y) és a TSz(x&R) közül azt kell választani, amely kevesebb beszúrással kapható meg.

51  Szlávi Péter: Dinamikus programozás 51/57 4Harmadik példázat – tükörszavak Részproblémákra és összetevők- re bontás Jelölések: MSz(i,j) – a minimális jel-beillesztések száma, és szó(i..j) – a szó szöveg i. és j. jele kö- zötti része szó(i):=szó(i..i) – a szó i. jele.

52  Szlávi Péter: Dinamikus programozás 52/57 4Harmadik példázat – tükörszavak Kapcsolatok: Ha i  j, akkor nincs mit tenni. Ha i

53  Szlávi Péter: Dinamikus programozás 53/ Részproblémák megoldásának kifejezése 4Harmadik példázat – tükörszavak

54  Szlávi Péter: Dinamikus programozás 54/ Részproblémák megoldásának kiszámítása A táblázat generálás sorrendje: Az (i,j)-vel azonosított részprobléma az (i+1,j–1), az (i+1,j) és az (i,j–1) rész- problémáktól függ. Tehát a kiszámítási sorrend i-értelemben fogyó, j-értelem- ben növekvő lehet. Mivel a rekurzió során csak a közvetlen szomszédra van szükség ezért elegendő egyetlen oszlop ot tárolni. 4Harmadik példázat – tükörszavak

55  Szlávi Péter: Dinamikus programozás 55/57 4Harmadik példázat – tükörszavak A kód lényegi része: function TukorSzo(const s:string):integer; var T:array [1..MaxN] of integer; i,j,ment,menti:integer; begin T[1]:=0; for j:=2 to N do begin T[j]:=0; menti:=0; for i:=j-1 downto 1 do begin ment:=T[i] if s[i]=s[j] then T[i]:=menti else T[i]:=1+Min(T[i],T[i+1]); menti:=ment; end;//for i end;//for j TukorSzo:=T[1] end;//TukorSzo MSz(1,1)  0 MSz(j,j)  0 T(i)  MSz(i,j) MSz(i,j)  MSz(i+1,j-1) MSz(i,j)  1+Min(MSz(i,j-1),MSz(i+1,j)) TukorSzo  Msz(1,N) MSz

56  Szlávi Péter: Dinamikus programozás 56/57 4Harmadik példázat – tükörszavak A megoldás előállítása … nem nagy kaland: a tábla (1,Hossz(szó)) eleme, amelyet az algoritmusbeli T vektor első eleme tartalmaz.

57  Szlávi Péter: Dinamikus programozás 57/57 5Irodalom [HGy] Horváth Gyula: „ Tehetséggondozó Program – Dinamikus programozás ”, NJSzT, 2005 [RISz] Rónyai L.,Ivanyos G.,Szabó R.: Algoritmusok, TYPOTEX, 1999 [SzP] Szlávi Péter: „ Dinamikus programozás ”, kézirat DinamikusProgramozas.pdf SzP [SzP2] Szlávi Péter et al.: „ További példák a dinamikus programozáshoz ”, kézirat PrM4felev/DinaProg/ SzP2


Letölteni ppt "Dinamikus programozás Szlávi Péter ELTE IK"

Hasonló előadás


Google Hirdetések