Hatékonyság 2. előadás
Alapelv: a tárolt elemek száma vagy egy elemé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) Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 2/31
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..k KF(i) nemkell:=sorból(kf) Sorba(KF,NKF) Ciklus vége Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 3/31
Feladat: Egy nyúlpopuláció adatait a korcsoporteloszlásával tároljuk (X tömb). Ismert: az E éves nyúlnak átlagosan S(E) utódja születik; és H(E) valószínűséggel pusztul el. Adjuk meg az éves korcsoportváltozást! 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):=Összegzés(X(i)*S(i) i=1..n) Y(2..N):=Másolás(X(i)*(1-H(i)) i=1..n-1) X:=Y Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 4/31
b. Változó Y:Tömb(1..N:Egész) Y(1):=X(N)*S(N) Ciklus i=1-től N-1-ig Y(i+1):=X(i)*(1-H(i)); Y(1):=Y(1)+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):=X(i)*(1-H(i)); Y:=Y+X(i)*S(i) Ciklus vége X(1):=Y Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 5/31
2.1.2 Ciklusok összevonása Feladat: Adjuk meg az M mátrix maximális sorösszegű sorát! Megoldások: a. Változó 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,sm:valós sm:=összegzés(m(1,1..n)); ma:=1 Ciklus i=2-től N-i s:=összegzés(m(i,1..n)) Ha s>sm akkor sm:=s; ma:=i Ciklus vége Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 6/31
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énatomok 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) Háromszögmátrix! Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 7/31
c. Változó m:tömb(1..n:tömb(1..4)) [melyik C-atom melyekkel van kötésben] mivel a C-atom kötésszáma 4, ezért legfeljebb 4-elemű dinamikus tömbbel dolgozhatunk. (Db,köt):=Kiválogatás((i,m(i,j)) ahol j=1..hossz(m(i)),i=1..n-1, ElemÉrték(m(i))>i) Szimmetria miatt Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 8/31
d. Változó m:tömb(1..k,1..2:1..n) [kötés: mely párok között] K: egy N db C-atomos molekulában a kötések száma N-1 és 4*N között lehet. Db:=N-1 köt:=másolás(m(i) i=1..k) Lásd még a tömb-ábrázolás témakörben: Ritkamátrixok! Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 9/31
C-atomos példa a 2.1.3-hoz C 1 C 4 C 5 C 3 a. Kötés-mátrix. h h h I h. h h I h h. h I h h h. I i i i i. C 2 b. Kötés-háromszögmátrix c. Kötés-lista d. Atompár-vektor 5 5 5 5 1 2 3 4 1 5 2 5 3 5 4 5 1:5 2:5 3:5 4:5 5:1,2,3,4 (1,5) (2,5) (3,5) (4,5). h h h I.. h h I... h I.... I..... Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 10/31
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:Sorozat(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] Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 11/31
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ületési és túlélési rátái korcsoportonként. Határozzuk meg a következő év korcsoporteloszlását az aktuális alapján. Megoldás: Típus TKorcsop=Tömb(1..N:Valós) TLeslie=Tömb(1..N,1..N:Valós) Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 12/31
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 Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 13/31
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:=E1+LM.s(i)*E(i) E(i):=LM.t(i)*E(i-1) Ciklus vége E(1):=E1 Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 14/31
2.1.5 Adatterület megosztása Feladat: l. a sorozatok ábrázolása témakörben: láncolt ábrázolás, maximált összelemszámú dupla verem Két háromszögmátrix egy mátrixban. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 15/31
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övetkező 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) Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 16/31
2.2.1 Redundáns mezők elhagyása Feladat: Egy személyi adatnyilvántartásban a következő 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 Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 17/31
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(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(szsz[2..3])), HónapNév(Egész(szsz[4..5])), Egész(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 Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 18/31
2.2.2 Az adatelemek kódolása Feladat: Egy személyi adatnyilvántartásban a következő 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 Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 19/31
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, )) 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 Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 20/31
2.3 A programkód méretének csökkentése Alapelv: a józan programépítése elvek betartása. Azaz: A feladat részfeladatainak Eljárásokra / Függvények / -re bontása; ezeknek megfelelő nyelvi implementálás. Ciklusok összevonása általában nem sok tényleges előnnyel jár, ugyanis, ha a ciklusmagok mérete előnyössé tenné, akkor úgyis eljárásban fogalmazódnának meg. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 21/31
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. Tájékoztató: Ki( Ez a program arra jó, ); {és még sok száz hasonló sor, lapozást szervező utasításokkal megtűzdelve} Eljárás vége. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 22/31
b. Tájékoztató: Konstans BekDb=???; STaj:Tömb(1..BekDb,szöveg)= ( Ez a program arra jó,, {és még sok tucat hasonló konstans bekezdés} ); sordb:=0; {kiírt sorok száma} Ciklus i=1-től BekDb-ig Ki: Bekezdés(STaj[i]) Ciklus vége Eljárás vége. 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 ) Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 23/31
3. A bonyolultság csökkentése 3. A bonyolultság csökkentése Kérdés: Mi a bonyolultság? Szerkezeti bonyolultság címen kétféle dologról beszélhetünk: az algoritmus bonyolultságáról, valamint az adatszerkezet bonyolultságáról. Az algoritmus bonyolultsága újabb két tényezőből áll össze: a szerkezet bonyolultságából és a kifejezés bonyolultságából. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 24/31
3. A bonyolultság csökkentése Definíció: Egy programgráf ciklikus bonyolultsága az élei számából kivonva a csúcsai számát. Példa: algoritmus Ha p akkor f 2 Ha p és q akkor f 2 Ha p akkor Ha q akkor f 3 ciklikus bonyolultsága Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 25/31
3. A bonyolultság csökkentése Definíció: Egy programgráf módosított ciklikus bonyolultsága egy számpár: a ciklikus bonyolultsági szám, valamint a ciklikus bonyolultág megnövelve a feltételekben szereplő diszjunkciók és konjunkciók (vagy-műveletek és és-műveletek) számával. Példa: algoritmus ciklikus bonyolultsága Ha p akkor f 2,2 Ha p és q akkor f 2,3 Ha p akkor Ha q akkor f 3,3 De problémás: Ha p és q akkor f 2,3 r:=p és q; Ha r akkor f 2,2 Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 26/31
3. A bonyolultság csökkentése Definíció: Egy programgráf mélységi bonyolultságát a következőképpen számíthatjuk ki: Vegyük a programgráf elemi struktúráit (elágazások, ciklusok), rendeljük hozzájuk azt a kitevőjű kettőhatványt, ahány magasabbrendű struktúra belsejében vannak, majd adjuk össze ezeket a számokat. Definíció: Egy programgráf absztrakciós bonyolultságát a következőképpen számíthatjuk ki: Vegyük az eljárások számát + az egyes eljárások mélységi bonyolultságát! Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 27/31
3. A bonyolultság csökkentése A kifejezés bonyolultságát a programfüggvény, mint kifejezés bonyolultsága, illetve a program szövegében szereplő kifejezések bonyolultsága adhatja meg. A kifejezések bonyolultságát legegyszerűbb esetben a bennük szereplő műveletek számával adhatjuk meg: az aritmetikai és logikai műveletek, a függvényhívások, az értékmozgatások (értékadás, beolvasás, kiírás) és az eljáráshívások. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 28/31
3. A bonyolultság csökkentése 4.1.1. A kivételes eset kiküszöbölése Feladat: Egy szövegben határozzuk meg a szavak számát! Szavak_száma(Mondat,Sdb): Sdb:=0; N:=Hossz(Mondat) Ciklus i=1-től N-1-ig Ha Mondat(i)=" " és Mondat(i+1) " " vagy i=1 és Mondat(i) " " akkor Sdb:=Sdb+1 Ciklus vége Eljárás vége. Kivételes eset: az i=1 csak egyszer lehet igaz, a ciklus első lépésében. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 29/31
3. A bonyolultság csökkentése Szavak_száma(Mondat,Sdb): Mondat:=elejére(" ",Mondat) Sdb:=0; N:=hossz(Mondat) Ciklus i=1-től N-1-ig Ha Mondat(i)=" " és Mondat(i+1) " akkor Sdb:=Sdb+1 Ciklus vége Eljárás vége. A módosított ciklikus bonyolultság csökken! Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 30/31
3. A bonyolultság csökkentése 4.1.2. Funkciók elhagyása Feladat: Rendezett sorozatok összefésülése! Összefuttatás(N,A,M,B,C): A(N+1):=+ ; B(M+1):=+ ; i:=1; j:=1; k:=0 Ciklus amíg i<n+1 vagy j<m+1 k:=k+1 Elágazás A(i)<B(j) esetén C(k):=A(i); i:=i+1 A(i)=B(j) esetén C(k):=A(i); i:=i+1; j:=j+1 A(i)>B(j) esetén C(k):=B(j); j:=j+1 Elágazás vége Ciklus vége Eljárás vége. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 31/31
3. A bonyolultság csökkentése Ha nincs A- és B-beli közötti egyenlőség, akkor az elágazás egyszerűsíthető! Összefuttatás(N,A,M,B,C): A(N+1):=+ ; B(M+1):=+ ; i:=1; j:=1; k:=0 Ciklus amíg i<n+1 vagy j<m+1 k:=k+1 Ha A(i)<B(j) akkor C(k):=A(i); i:=i+1 különben C(k):=B(j); j:=j+1 Ciklus vége Eljárás vége. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 32/31
3. A bonyolultság csökkentése 4.1.3. Funkciók szétválasztása A programozási tételek összeépítését sokszor használjuk futási idő, illetve helyfoglalás csökkentésére. Ez azonban azzal jár, hogy a bonyolultság növekszik, mint pl. a maximumkiválogatásban. Maximumok(N,A,DB,S): MX:=A(1); DB:=1; S(DB):=1 Ciklus i=2-től N-ig Ha A(i)>MX akkor DB:=0; MX:=A(i) Ha A(i)=MX akkor DB:=DB+1; S(DB):=i Ciklus vége Eljárás vége. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 33/31
3. A bonyolultság csökkentése Ha nem vonjuk össze a maximumkiválasztás és a kiválogatás tételeket, akkor egyszerűbb megoldást kapunk: Maximumok(N,A,DB,S): MX:=A(1); DB:=0 Ciklus i=2-től N-ig Ha A(i)>MX akkor MX:=A(i) Ciklus vége Ciklus i=1-től N-ig Ha A(i)=MX akkor DB:=DB+1; S(DB):=i Ciklus vége Eljárás vége. Itt a logikai bonyolultság úgy csökken, hogy a szerkezeti bonyolultság nő. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 34/31
3. A bonyolultság csökkentése 4.1.4. Fiktív kezdőértékadás Algoritmusok egy részének bonyolultságát az okozza, hogy valamely változók kezdőértékét az algoritmus belsejében határozzuk meg. Feltételes mamimumkiválasztásnál az első maximumot kell megkeresni. Keresésnél figyelni kell arra, nehogy a sorozat végén túlmenjünk. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 35/31
3. A bonyolultság csökkentése 4.2. Az adatszerkezet bonyolultsága Az adatszerkezet, az adattípusok bonyolultságát is kétféle szempont szerint vizsgálhatjuk. Egyrészt nézhetjük a struktúra bonyolultságát, másrészt pedig a típus műveleteinek bonyolultságát. Egy adattípus strukturális bonyolultsága a típus definiálásában szereplő típuskonstrukciós eszközök száma. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 36/31
3. A bonyolultság csökkentése Egy adattípus mélységi bonyolultsága a következőképpen számítható ki: Vegyük az adattípus definiáláshoz felhasznált típuskonstrukciós eszközöket, rendeljük hozzájuk azt a kitevőjű kettőhatványt, ahány magasabbrendű struktúra belsejében vannak, majd adjuk össze ezeket a számokat. Egy adattípus absztrakciós bonyolultsága a következőképpen számítható ki: Vegyük a résztípusai számát + az egyes résztípusok mélységi bonyolultságát! Egy adattípus hivatkozási bonyolultsága a leghosszabb hivatkozási mélység, melyet a felhasználónak használnia kell. Egy típus műveleti bonyolultsága a típus független, egymással ki nem fejezhető műveletei száma. Zsakó László: Hatékonyság 2 2019. 03. 26. 7:18 37/31
Hatékonyság 2. előadás vége