Hatékonyság 2. Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék szlavip@elte.hu http://digo.inf.elte.hu/~szlavi Copyright, 1999 © Szlávi Péter
Tartalom Bevezetés I. rész: globális hatékonyság A. Általánosságok B. Előzetes példák I. rész: globális hatékonyság 1. A végrehajtási idő csökkentése 1.1 A ciklus lépés-számának csökkentése 1.2 A ciklus egyszeri végrehajtási idejének csökkentése 2. A helyfoglalás csökkentése 2.1 A sorozatok elemszámának csökkentése 2.2 A sorozatelem helyfoglalásának csökkentése 2.3 A programkód méretének csökkentése 2019.01.13. Hatékonyság 2
Tartalom II. rész: lokális hatékonyság 3. Bonyolultság csökkentése 1. A végrehajtási idő csökkentése 2. A helyfoglalás csökkentése 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése Alapelv: a tárolt elemek száma vagy egy ele- mének mérete kevesebb legyen! Helyfoglalás= memória (kód+adat) + háttértár (kód+adat) 2.1 Sorozatok hosszcsökkentése 2.1.1 Sorozat kiküszöbölése Feladat: Az N. K-Fibonacci szám előállítása. Megoldások: a. Változó KF:Tömb(1..N:Egész) KF(1..N):=…az első N előállítása… NKF:=KF(N) Fordítóprogramon mú- lik; legfeljebb lokális… HáttértárMemória Helycsere: idő… Különlges fordítási tech- nika: overlay 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) b. Változó KF:SorTömb(K,Egész)[K-elemű!] KF:=…az első K előállítása… Ciklus i=K+1-től N-ig NKF:=i=1..KKF(i) nemKell:=Sorból(KF) Sorba(KF,NKF) Ciklus vége 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Feladat: Egy nyúlpopuláció adatait a korcsoportelosz- lásával tároljuk. Ismert: az E éves nyúlnak átlago- san S(E) utódja születik; és H(E) valószínűséggel pusztul el. Adjuk meg az éves korcsoportváltozást! Megoldások: Változó S,H:Tömb(1..N:Valós) X:Tömb(1..N:Egész) a. Y:Tömb(1..N:Egész) S:Valós [az összegzéshez] Y(1):=Egész(Összegzés(X(i)*S(i) i=1..N) Y(2..N):=Másolás(Egész(X(i)*(1-H(i))) i=1..N-1) X:=Y Születési, halálozási ráták Korcsoporteloszlás N: a korcsoportok száma =N*Méret(Egész)+1*Méret(Valós) 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Probléma: egészben valós összegzés!!! b. Változó Y:Tömb(1..N:Egész) Y(1):=Egész(X(N)*S(N)) Ciklus i=1-től N-1-ig Y(i+1):=Egész(X(i)*(1-H(i))) Y(1):+Egész(X(i)*S(i)) Ciklus vége X:=Y c. Változó Y:Valós Y:=X(N)*S(N) Ciklus i=N-1-től 1-ig -1-esével X(i+1):=Egész(X(i)*(1-H(i))) Y:+X(i)*S(i) Ciklus vége X(1):=Egész(Y) Kódrövidítés (l. 2.1.2) =N*Méret(Egész) Kivételes eset: X(N)-„be”-számítása =1*Méret(Valós) „Problémás” eset: X(i) fordított kiszá-mítása (:=f(X(i-1)) 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) 2.1.2 Ciklusok összevonása Feladat: Adjuk meg az M mátrix maximális sor- összegű sorát! Megoldások: Változó m:Tömb(1..N,1..N:Valós) a. s:Tömb(1..N:Valós) s(1..N):=Másolás( Összegzés(M(i,1..N)) i=1..N) maxi:=MaxKiválasztás(s,) b. Változó s:Valós [összegzéshez] maxi:=MaxKiválasztás(i i=1..N,) Az „1.2.5 Sorozatok előfeldolgozása” módszer ellentéte. :INxINIL, rendezés (i,j):=Összegzés(Xi) Összegzés(Xj) 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Output: melyik melyikkel 2.1.3 Hézagosan kitöltött struktúrák Feladat: Egy N-atomos szénhidrogén molekulát vizsgálunk. Adjuk meg, mely szén atomok melyekkel vannak kötésben! Megoldások: Változó Db:Egész köt:Tömb(1..MaxN,1..2:Egész) a. Változó m:Tömb(1..N,1..N:Logikai) (Db,köt):=Kiválogatás((i,j) i=1..N-1,j=i+1..N, m(·)=Igaz) b. Változó m:Tömb(1..N*(N+1) Div 2: Logikai) [azaz -mátrixként ábrázolni] Szénatom Szénhidrogén molekula N2*Méret(Logikai) Ritkamátrix: Méret(Logikai)* *N*(N+1) Div 2 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Szénhidrogén molekula c. Változó m:Tömb(1..N:Lista(1..N)) [melyik C-atom melyekkel van kötésben] mivel a C-atom kötésszáma4, ezért a listák legfeljebb 4-eleműek. (Db,köt):=Kiválogatás( (i,ElemÉrték(m(i),j)) j=1..Hossz(m(i)),i=1..N-1, ElemÉrték(m(i))>i) Az ElemÉrték(m(i),j) az m(i) lista j. elemét szimbolizálja. =N*Méret(Lista(1..N)) N*(Méret(Fej)+4*(Méret(Egész)+ Méret(Mutató))) [láncolt] N*4*Méret(Egész) [folytonos] Szimmetria miatt 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) d. Változó m:Tömb(1..K,1..2:1..N) [kötés: mely párok között] Db:=N-1 köt:=Másolás(m(i) i=1..K) L. még a tömb-ábrázolás témakörben: „Ritkamátrixok” ~N*2*Méret(1..N) K: egy N db C-atomos molekulában a kötések száma N-1 és 4*N között lehet. 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Feladat: Képek raszteres ábrázolása… Megoldások: a. Típus TKép=Tömb(1..MaxX,1..MaxY:TSzín) b. Típus TKép=Tömb(1..MaxY:Lista(TPászta)) TPászta=Rekord(szín:TSzín, hossz:Egész) [k:TKép i[1..MaxY]:MaxX=k(i)-beli pászták összege] 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) 2.1.4 Speciális szerkezetű sorozatok Feladat: … l. a „tömb-ábrázolás” témakörben: „speciális szerkezetű mátrixok”… (Diagonális, háromszög, tridiagonális, Hänkel-, Toeplitz- stb.- mátrixok.) Feladat: Leslie-mátrix az alábbi probléma szokásos leírását jelenti. Adott egy pl. egérpopuláció szüle- tési és túlélési rátái korcsoportonként. Határozzuk meg a köv. év korcsoporteloszlását az akt. alapján. Megoldás: Típus TKorcsop=Tömb(1..N:Valós) TLeslie=Tömb(1..N,1..N:Valós) s1 s2 s3 … sn-1 sn t2 0 0 … 0 0 0 t3 0 … 0 0 … … … … … … 0 0 0 … tn 0 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Változó E:Tkorcsop [kezdő korcsoporteloszlás] a. Változó LM:TLeslie U:TKorcsop U:=LM*E [mátrix-vektor szorzás] E:=U b. Típus TLeslie=Rekord( s:Tömb(1..N:Valós), t:Tömb(2..N:Valós)) Változó LM:TLeslie U:TKorcsop S:Valós [összegzéshez] U(1):=Összegzés(LM.s(i)*E(i) i=1..N) U(2..N):=Másolás(LM.t(i)*E(i-1) i=2..N) E:=U =N2*Méret(Valós) =N*Méret(Valós) =(N+N-1)*Méret(Valós) =N*Méret(Valós) =1*Méret(Valós) 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) =(N+N-1)*Méret(Valós) c. Változó LM:TLeslie E1:Valós E1:=LM.s(1)*E(1) Ciklus i=N-től 2-ig -1-esével E1:+LM.s(i)*E(i) E(i):=LM.t(i)*E(i-1) Ciklus vége E(1):=E1 =1*Méret(Valós) 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) 2.1.5 Adatterület megosztása Feladat: … l. a „sorozatok ábrázolása” témakörben: láncolt ábrázolás, maximált össz-elemszámú dupla verem… 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) 2.2 A sorozat egy elemének méretcsökkentése Alapelv: alkalmasan szűk reprezentáció… 2.2.1 Redundáns mezők elhagyása Feladat: Egy személyi adatnyilvántartásban a követ- kező adatokat tároljuk: név, személyiszám, születé- si idő (év, hó, nap). Listázzuk ki a nyilvántartást! Megoldások: a. Típus TSzemély=Rekord(név:Szöveg(30) szsz:Szöveg(11) szül:TDátum) TDátum=Rekord(év:Egész hó:Szöveg(10) nap:Egész) … Ciklus amíg nem Vége?(f) Olvas(f,szem); Ki:szem Ciklus vége … Méret(TSzemély)=31+12+15=58 Méret(TDátum)=2*2+11=15 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) b. Típus TSzemély=Rekord(név:Szöveg(30) szsz:Szöveg(11)) TDátum=Rekord(év:Egész hó:Szöveg(10) nap:Egész) Függvény szül(Konstans szsz:Szöveg(11)): TDátum Konstans HónapNév:Tömb(1..12:Szöveg(10) (’Január’,’Február’,…) szül:=TDátum(Egész(Része(szsz,2,3)), HónapNév(Egész(Része(szsz,4,5))), Egész(Része(szsz,6,7))) Függvény vége. … Ciklus amíg nem Vége?(f) Olvas(f,szem) Ki: szem.név, szem.szsz, szül(szem.szsz) Ciklus vége … Méret(TSzemély)=31+12=43 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) 2.2.2 Az adatelemek kódolása Feladat: Egy személyi adatnyilvántartásban a követ- kező adatokat tároljuk: név, születési idő (év, hó, nap). Listázzuk ki a nyilvántartást! Megoldások: a. Típus TSzemély=Rekord(név:Szöveg(30) szül:TDátum) TDátum=Rekord(év:Egész hó:Szöveg(10) nap:Egész) … Ciklus amíg nem Vége?(f) Olvas(f,szem) Ki:szem Ciklus vége … Méret(TSzemély)=31+15=46 Méret(TDátum)=2*2+11=15 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) b. Típus TSzemély=Rekord(név:Szöveg(30) szül:TDátum) TDátum=Rekord(év,hó,nap:Egész) Konstans HónapNév:Tömb(1..12:Szöveg(10) (’Január’,’Február’,…) Méret(TSzemély)=31+6=37 Méret(TDátum)=3*2=6 … Ciklus amíg nem Vége?(f) Olvas(f,szem) Ki: szem.név, szem.szül.év, HónapNév(szem.szül.hó), szem.szül.nap Ciklus vége … 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) c. Típus TSzemély=Rekord(név:Szöveg(30) szül:TTDátum) TTDátum=TömörRekord(év:1900..2027, hó:1..12, nap:1..31) Konstans HónapNév:Tömb(1..12:Szöveg(10) (’Január’,’Február’,…) Függvény TTDátum2TDátum (Konstans d:TTDátum):TDátum TTDátum2TDátum:=… Függvény vége. Méret(TSzemély)=31+2=33 Méret(TTDátum)=7+4+5=16 bit … Ciklus amíg nem Vége?(f) Olvas(f,szem); tszül:=TTDátum2TDátum(szem.szül) Ki: szem.név, tszül.év, HónapNév(tszül.hó), tszül.nap Ciklus vége … 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Feladat: … l. még a „Szövegfeldolgozás” témakörbeli tömörábrázolás rész feladatait. 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) 2.3 A programkód méretének csökkentése Alapelv: a „józan” programépítése elvek be- tartása. Azaz: A feladat részfeladatainak Eljárásokra / Függ- vények /…-re bontása; ezeknek megfelelő nyel- vi implementálás. Ciklusok összevonása – általában nem sok tényleges előnnyel jár,ui. ha a ciklusmagok mérete előnyössé tenné, ak- kor úgyis eljárásban fogalmazódnának meg. 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Programkód adattá transzformálása – a sok, „konstanson” alapuló tevékenységlánc (pl. tá- jékoztató, menü) konstans adatokká és rajtuk operáló kevésszámú műveletté „tipizálása”. Feladat: Többlapos tájékoztató kiírása. Megoldások: a. Procedure Tajekoztato; Var c:Char; Begin Writeln(’Ez a program arra jó,’); … {és még sok száz hasonló sor, lapozást szervező ReadKey-ekkel megtűzdelve} End; 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) b. Procedure Tajekoztato; Const BekDb=???; STaj:Array[1..BekDb] of String= (’Ez a program arra jó,…’, {és még sok tucat hasonló konstans bekezdés} …); Var c:Char; sorDb,i:Integer; Procedure KiBekezdes(Const b:String); Begin {… b kiírása + lapozás …} End; Begin sorDb:=0; {kiírt sorok száma} For i:=1 to BekDb do Begin KiBekezdés(STaj[i]); End; End; További előnyök: Bonyolultság csökkenés Biztonságosság Könnyű javíthatóság (pl. képsorméret-, szövegmó-dosulás…) 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Változások c. Procedure Tajekoztato; Const tajFNev=???; Var t:Text; {szövegfile-ban a tájékoz- tató szövege} Var c:Char; sorDb,i:Integer; siker:Boolean; Procedure KiBekezdes(Const b:String); Begin {… b kiírása + lapozás …} End; Begin sorDb:=0; siker:=FileNyitás(f,tajFNev); If siker then Begin While not Eof(f) do Begin Readln(f,sor); KiBekezdés(sor); End; End; Egyébként is meglevő eljárás További előny: Univerzalitás 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Feladat: Ablakozás… Megoldások: a. … Window(4,4,46,16); SetBkColor(Black); ClrScr; Window(5,5,45,15); SetBkColor(White); SetColor(4); ClrScr; Writeln(’Ablakcím’:24); {… ablakhasználat …} {ahány ablak, annyi efféle sok sor} Keretszín Ablak-koordináták ((45-5) Div 2)+(címhossz Div 2) Lapszín 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) b. Type TSzin=?; TMem=?; TAblak=Record bfx,bfy,jax,jay:Integer; cim:String[30]; kszin,bszin,lszin:TSzin; mentes:^TMem; kx,ky:Byte; End; Procedure AblakNyit(Var a:TAblak); Begin {… háttérmentés …} With a do Begin Window(bfx,bfy,jax,jay); SetBkColor(kszin); ClrScr; Writeln(cim:…); End;… Akt. ablak kurzor Ablakmérettől függő formula 2019.01.13. Hatékonyság 2
2. A helyfoglalás csökkentése (folytatás) Procedure AblakZar(Const a:TAblak); Begin {… háttér visszaírása …} End; Procedure ABlakbaIr(Var a:TAblak; Const s:String); Begin {… ablakhasználat; kx,ky …} End; {ahány ablak, annyi efféle sok sor:} Const a1:TAblak=( bfx:=?;bfy:=?;jax:=?;jay:=?; cim:?;kszin:?;bszin:?; lszin:?;kx:1;ky:1); Egy próba. (LZW) Letöltés. 2019.01.13. Hatékonyság 2