0. Bevezető megjegyzések Ez a köyv bevezetést szádékozik adi az adatstruktúrák és algoritmusok világába. Témája egyeteme oktatott taayag. Az, hogy bevezetés jellegű, sekit e tévessze meg és az olvasó e godoljo laza elegaciával arra, hogy akkor semmilye előismeretekkel em kell redelkezie. Kell. Igyekeztük ahogy a közmodás modja a lehetőségekhez képest egyszerűe ismerteti a témakört, de attól em egyszerűbbe. Az olvasót em fotelba ülve óhajtjuk kiszolgáli lesve a kíváságait, haem egy előírt talá kellőe szép és izgalmas program szerit a témá kívájuk végigkalauzoli. Eközbe elvárjuk tőle az aktivitást, az együtt godolkodást, valamit az öálló, kellemese elfárasztó mukát is. Az erre való buzdítás jelei az ayagba előforduló bizoyítsuk be, lássuk be, igazoljuk, miért és a többi hasoló kezdetű szövegek. Törekszük arra, hogy a mukája e végkimerítő, lidércyomásos hajsza legye. Eek azért persze előfeltétele egy bizoyos ismeretayag magabiztos birtoklása. Ebbe a fejezetbe eze előfeltételezett ismeretayagból villatuk föl éháy agyo fotos témakört, téyt és szóluk egy pár szót a szemléletmódról is. Néháy szó defiíciókról, tételekről és bizoyításokról A köyvek a modaivalója részbe absztrakt, sok bee a matematikai jellegű téma és tárgyalásmódja is ikább matematikai, mit elmesélő. Eek megfelelőe törekedi foguk a viszoylag tömör leírásokra és jelölésekre. Ezek haszálata megszokást és kellő elmélyülést kívá. Amit cserébe kapuk: a precizitás, a higiéikus godolkodás. Elkerülhetjük ezáltal a maapság a mideapi életbe oly divatos csúsztatásokat, helytele következtetéseket, a em midig hátsó szádék élküli iformáció visszatartást, félrevezetéseket. A matematikai szemléletmód következméye lesz a halmazelméleti alapokhoz törtéő igazodás, ezt tükrözik majd a jelölések és a fogalmak. A haszált matematikai jelölések táblázatába [A. Függelék] felsorolt jelekről feltesszük, hogy ismertek és haszálatukba az olvasó kellő jártasságra tett szert. (Nem papírja va róla, haem gyakorlottsága!) A kiemelt formulákat számozi fogjuk. Mide fejezetbe és alfejezetbe a számozás elölről kezdődik. Formulára törtéő hivatkozásál csak a formula számát adjuk meg, ha a formula ugyaazo fejezetbe (alfejezetbe) található. Ha a hivatkozott formula másik fejezetbe (alfejezetbe) va, akkor a teljes fejezetsorszámot és a pottal hozzákapcsolt formulaszámot adjuk meg. Ugyaez a helyzet a tételek és a példák számozásáál. A tárgyalás alapját a defiíció, tétel, bizoyítás hármas alkotja. A defiíciók (meghatározások) precíz és aktív ismerete megkerülhetetle, hisze általuk építjük fel a fogalomredszerüket. A termius techicus-ok (szakkifejezések) ismerete és helyes haszálata is ide tartozik. E élkül em tuduk dolgozi, mert em egedhető meg, hogy valamilye megevezés, fogalom e mideki számára ugyaazt jeletse. A viccbeli két bombázó sem teljese ugyaarra godolt, amikor a belvárosba sétálva és a kirakatokat ézegetve az egyikük bizalmasa odasúgta a másikak, hogy: Nem vetted észre, hogy a mögöttük álló férfi követ? Mire a másik visszasúgta: Dehogyem vettem észre! Mi az, hogy követ! Nagykövet! Itt a félreértés oka yílvávalóa a követ fogalom eltérő értelmezése a két szereplő részéről. Perdötőek leszek a tételek (bizoyított állítások), amelyek a fogalmak közötti fotos összefüggésekre világítaak rá. Ezekre a tételekre azutá a későbbiekbe redre hívatkozi foguk. A tételek továbbá kijelölik a témák tárgyalásáak meetét. A tételek egymásra épülek. Bármelyik csak akkor igaz, ha az összes megelőző is igaz. Ha csak egy állítás is hamis lee, akkor az elméletük is elletmodásos lee. A bizoyítások azért fotosak, mert általuk meggyőződhetük, hogy a tétel (az állítás) valóba igazat mod. További hasza a bizoyításak, hogy megtaít higiéikusa, tisztességese godolkodi és érveli, valamit kifejleszti az emberbe azt az igéyt, hogy csak a kellőe alátámasztott és bebizoyított állításokat fogadja el, e higgyje el midet csak azért, mert aki modta, az
Adatstruktúrák, algoritmusok - 2 - magas polco ül és/vagy hatalommal redelkezik. A bizoyítások végét a jel jelzi. Sajos em foguk mi sem mide tételt bebizoyítai, mivel kevés az idő és a hely, de a bebizoyítottak elegedő öbizalmat és megalapozott hitet adak arra, hogy a többit elfogadjuk már csak azért is, mivel a bizoyítások a szakirodalomba elérhetők. A tételek általába egyiráyúak és szerkezetük Ha A, akkor B alakú, ahol A és B állítások (ítéletek). Az állítás pedig olya kijelető modat, amely vagy csak igaz lehet, vagy pedig csak hamis. Eze két egymást kölcsööse kizáró esete kívül mide más lehetőség em megegedett. Az esik az eső állítás, mert lehet igaz, vagy pedig lehet hamis. Ugyaez a helyzet a edves a járda kijeletéssel. Példa em állításra (em ítéletre) a következő kijeletés. Ez a modatom hazugság. (Lássuk be, hogy sem az igaz, sem a hamis miősítés em kapcsolható a modathoz!) A Ha A, akkor B tétel értelmezése pedig az, hogy ha az A állítás teljesül (igaz), akkor a B állítás is igaz. Például: Ha esik az eső, akkor edves a járda. Itt az A állítás az esik az eső, a B állítás pedig a edves a járda. Azt modjuk, hogy az A állítás a B-ek elégséges feltétele, a B állítás pedig az A-ak szükséges feltétele. Az esik az eső elégséges feltétele aak, hogy edves a járda. A járda edves állapotához elegedő az, hogy esse az eső. A edves a járda szükséges feltétele aak, hogy esik az eső. Amikor esik az eső, akkor szükségképpe edves lesz a járda. A Ha A, akkor B úgy is megfogalmazható, hogy Csak akkor A, ha B. Csak akkor esik az eső, ha edves a járda. Egy tételbe az állítások sorredje általába em megfordítható. A példákba a megfordítás Ha edves a járda, akkor esik az eső - em igaz. Lehet a járda úgy is edves, hogy em esik az eső, például, mert éppe apsütésbe mossák a járdát. Vaak olya tételek, amelyekek a megfordítása is igaz. Ezeket az A akkor és csak akkor, ha B alakba szoktuk megfogalmazi. Ilyekor azt modjuk, hogy az A és B két állítás ekvivales egymással. Azt is szoktuk modai, hogy az A a B-ek (vagy a B az A-ak) szükséges és elégséges feltétele. Gyakra elkövetett hiba egy tétel megfordításáak és a tagadásáak az összekeverése. A tétel megfordítása, mit láttuk, em midig igaz. A tagadott alak így hagozhat a feti példába: Ha em vizes a járda, akkor em esik az eső. A helytele változat pedig az szokott lei, hogy Ha em esik az eső, akkor em vizes a járda, ami, mit láttuk em igaz. A sémák: Az eredeti tétel A tétel megfordítása A tétel tagadása A tétel helytele tagadása (a megfordítás tagadása) Ha A, akkor B Ha B, akkor A Ha em B, akkor em A Ha em A, akkor em B A tételek bizoyításáak egy speciális módszere a teljes idukció, amely a matematikába az aritmetika Peao féle axiómaredszeréek az egyik axiómája. A teljes idukció axiómája így szól: Ha valamely állítás be va bizoyítva az 1-es számra és ha abból a feltételezésből, hogy az állítás igaz az -re, mit természetes számra következik, hogy akkor az állítás igaz az -re rákövetkező számra is (+1-re is), akkor az az állítás igaz az összes természetes számra is. 1. példa: a teljes idukció alkalmazása bizoyításba: 1. Tétel: Az első k darab páratla természetes szám összege. Az első k darab páratla természetes szám összege éppe k 2. Tömörebbe a tétel egy formula alakjába írható fel: 2 ( 2k 1) = 1+ 3 + 5 + K + k, ahol k =1,2,3, K természetes szám lehet. (1)
Adatstruktúrák, algoritmusok - 3 - Még tömörebbe írható a Σ szumma jel (a görög ábécé agy szigma betűje) haszálatával: k i= 1 2 ( 2i 1) = k, k N (2) Bizoyítás A k=1 esetre a tétel igaz, mert akkor az összeg egyetle tagból áll és 1=1 2. (Láthatóa igaz az is, hogy például 1+3=2 2, 1+3+5=3 2.) Tegyük fel, hogy a tétel igaz k=-re is, azaz az idukciós feltételezésük az lesz, hogy 1+3+5+ +(2-1) = 2. Megmutatjuk, hogy akkor a tétel igaz k=+1-re is, azaz az 1+3+5+ +(2-1)+(2+1)= (+1) 2 összefüggést kellee belátuk. Ebbe a formulába a baloldalo az utolsó tag kivételével az összeg éppe 2 az idukciós feltételezésük alapjá. Ebből a baloldalo kapjuk, hogy 2 +(2+1), ami éppe a bizoyítadó (+1) 2. Az idukciós feltételezésük helyes volt és így a teljes idukció axiómáját alkalmazva a tételük igaz bármely k természetes számra. 2.példa: a teljes idukció helytele haszálata: 2. Tétel: A lovak szíéről. (kivoat [2]-ből) Mide ló azoos szíű Bizoyítás Teljes idukcióval bizoyítuk. Egy ló azoos szíű, ez triviálisa teljesül. Tegyük fel, hogy a tétel igaz ló esetére is, azaz ló azoos szíű. Megmutatjuk, hogy akkor a tétel igaz +1 lóra is. Vegyük +1 lovat. Ha most egyet közülük kiveszük, akkor az idukciós feltétel szerit a megmaradtak azoos szíűek, mivel ló marad. Visszatéve a kivett lovat, majd kivéve egy másikat újra ló marad és így megit azoos szíűeket kapuk az idukciós feltételezés szerit. Az eljárást folytathatjuk tovább a kivett ló visszaadásával és egy újabb kiválasztásával. Mivel midig azoos szíűeket kaptuk és mide lovat már kiválasztottuk, ezért az +1 ló is azoos szíű. Alkalmazva a teljes idukció axiómáját, kapjuk, hogy bárháy ló is azoos szíű, tehát az összes ló is az, hisze csak véges számú ló létezik a valóságba. (Hol a hiba?) A halmazelmélet fotos lesz a tárgyalásmódba. Többször kell beláti, hogy két halmaz megegyezik. Eek belátása általába em úgy törtéik, hogy az elemeiket felsoroljuk és párbaállítva belátjuk az azoosságot. Ez a módszer csak a véges sok elemű halmazokál működik és ott is lehet kéyelmetle. A halmazok gyakra em véges sok eleműek. Véges halmazról beszélük, ha a halmazak ics vele ekvivales valódi részhalmaza. (Ekvivales részhalmazról beszélük, ha a halmaz és a részhalmaz elemei között létezik egy-egy értelmű megfeleltetés.) Két halmazt azoosak tekitük, ha midkettő a másik részhalmaza. A B A B és B A. Néháy érdekes függvéy és művelet Az ayagba foguk függvéyeket haszáli. A szokváyos függvéyek mellett meg kell barátkozi az egészrész függvéyekkel, a törtrész függvéyel és a kerekítő függvéyel. Ne tévessze meg sekit, hogy ezek a függvéyek hasolítai fogak a programozási yelvekbe
Adatstruktúrák, algoritmusok - 4 - előforduló hasoló evű függvéyekhez, mert em biztos, hogy teljese azoosak azokkal. Az egyes programozási yelvek em midig kozekvesek. Az ugyaolya evű függvéy a külöböző yelvekbe émileg eltérő módo viselkedhet. Érdemes taulmáyozi a yelvi leírást, specifikációt. Defiíció: Az alsó egészrész függvéy Az alsó egészrész függvéy mide valós számhoz egy egész számot redel hozzá, éppe azt, amely a tőle em agyobb egészek közül a legagyobb. Az alsó egészrész függvéy jele: x, ahol x valós szám. Tömöre: x = max k k k Z x (3) Más szavakkal formálisa: x = k, ahol k olya egész szám, hogy k x < k+1. 3. példa: x 5, 2 5 5 5, 2 x 6 5 5 5 Defiíció: A felső egészrész függvéy A felső egészrész függvéy mide valós számhoz egy egész számot redel hozzá, éppe azt, amely a tőle em kisebb egészek közül a legkisebb. A felső egészrész függvéy jele: x, ahol x valós szám. Tömöre: x = mi k k Z x k (4) Más szavakkal formálisa: x = k, ahol k olya egész szám, hogy k-1 < x k. 4. példa: x 5, 2 5 5 5, 2 x 5 5 5 6 Az alsó és felső egészrész függvéyek fotos tulajdoságait az alábbi táblázatba foglaljuk össze: (Lássuk be, hogy ezek valóba teljesülek!) 1. Ha a egész szám, akkor a = a, a = a, 2. Ha x valós, a egész szám, akkor x ± a = x ± a, x ± a = x ± a, 3. Ha x és y valós számok, akkor x ± y x ± y, x y x ± y 4. Ha x valós szám, akkor x = x, x = x, 5. Ha x y valós számok, akkor x y, x y ±, Defiíció: A kerekítő függvéy A kerekítő függvéy mide valós számhoz a hozzá legközelebb eső egész számot redeli hozzá. Ha a legközelebbi egész szám em egyértelmű, akkor a agyobbat választja. A kerekítő függvéy jele: Roud(x), ahol x valós szám.
Adatstruktúrák, algoritmusok - 5-1 Roud ( x) = x + (5) 2 A legközelebbi egészre kerekít. Pozitív számok eseté, ha a tizedesrész 5/10, vagy aál agyobb, akkor felfelé, kisebb esetbe lefelé kerekít. Negatív számok eseté ha a tízes számredszer szeriti felírásba a tizedesrész kisebb, mit 5/10, vagy egyelő vele, akkor felfelé, egyébkét lefelé kerekít. 5. példa: x 6 5, 8 5, 5 5, 2 5 5 5, 2 5, 5 5, 8 6 Roud (x) 6 6 5 5 5 5 5 6 6 6 Defiíció: A törtrész függvéy A törtrész függvéy mide valós számhoz azt a számot redeli hozzá, amely azt mutatja meg, hogy a szám meyivel agyobb az alsó egészrészéél. A törtrész függvéy jele: {, ahol x valós szám. Tömöre: x} { x} x x Midig feáll a 0 { x } < 1 egyelőtleség. =. (6) 6. példa: x 5, 8 5, 2 5 5 5, 2 5, 8 x 0,2 0, 8 0 0 0, 2 0, 8 {} Felhívjuk a figyelmet két műveletre: Defiíció: Az egész háyados képzése, a div művelet Legye a és b egész szám, b 0. Defiíció szerit az egész osztás műveleté az a/b osztás eredméyéek alsó egész részét értjük. Tömöre: 7. példa: 9 div 4 = 3, 9 div 4 = 2 Defiíció: Az egész maradék képzése, a mod művelet Legye a és b egész szám. Defiíció szerit a div b = a / b (7) def a mod b = a a, a / b b = a ( a divb) b, ha ha b = 0 b 0 (8) 8. példa: 9 mod 4 = 3, 9 mod 4 = 1, 9 mod ( 4) = 1, 9 mod ( 4) = 3 Speciális jeletése va az a mod 1 az a valós szám törtrésze, azaz jelölések. Ezt mide valós a-ra értelmezzük és jeletése def {} a a mod 1 = (9)
Adatstruktúrák, algoritmusok - 6 - Rövid betekités a számredszerekbe Szükségük lesz számok külöböző alapú számredszerbe törtéő felírására. Egy szám lejegyzésekor a haszált számredszer alapszámát midig tizes számredszerbe adjuk meg és a szám jobb alsó sarkához írjuk idexkét. Ha a számredszer alapja a b 2 egész szám, akkor az x pozitív egész szám számjegyei: c, c K c c 1,, 1, 0 (10) ahol 0 c k < b, k = 0,1, K, és az x szám értéke ezekkel a számjegyekkel és az alappal kifejezve: x = c b 1 1 0 + c 1 b + K + c1 b + c0 b (11) Az értékét úgy határozzuk meg, hogy c 0 legye, és mide ck = 0, ha k >. Ha a számredszer alapszáma tízél agyobb, akkor a 0,1,2,...,9 számjegyek mellett új számjegyeket kell bevezeti a tíz, tizeegy,..., b 1 számértékekre. Kéyelmi és yomdatechikai okok miatt a lati ábécé agybetűit haszáljuk eze célra. Ilye módo tehát az A=10, B=11, C=12,..., Z=36 jelek haszálatosak. (Lehet találkozi vegyes jelöléssel is, ahol a számjegyeket tizes számredszerbe jegyzik le. Mi em fogjuk ezt alkalmazi.) 9. példa: 2006 számjegyei tizes számredszerbe c 3 = 2, c 2 = 0, c1 = 0, c 0 = 6. Itt =3 és 3 2 1 0 2006 = 2 10 + 0 10 + 0 10 + 6 10. Nyílvávalóa: c 0 x mod b 1K 2 1 = x div b számjegyek egymást követő fordított iráyú előhozására: x b x = x div b c x mod = 1 0 b x 2 = x1 div b c1 = x1 mod b xk = xk 1 div b c = k 1 xk 1 mod b x = x 1 div b c 1 = x 1 mod b 0 c = x mod b. A következő séma alkalmas a (12) 10. példa: Írjuk fel a 2006-ot kettes (= biáris) számredszerbe és 16-os (= hexadecimális) számredszerbe. 2006 2 2006 16 Tehát 2006 10 =11111010010 2 =7D6 16 1003 0 125 6 501 1 7 13=D 16 250 0 0 7 125 0 62 1 31 0 15 1 7 1
Adatstruktúrák, algoritmusok - 7-3 1 1 1 0 1 Átírás tizes alapra a (11) formula átredezésével törtéik az úgyevezett Horer séma szerit. ( (( c ) b + c 1) b + + c1 ) b + c0 x = K K (13) Ezzel azt érjük el, hogy kevés műveletet kell haszáli, a műveletek azoos jellegűek, másrészt a műveleteket végezhetjük tizes számredszerbe. 11. példa: 7D6 16 =((7) 16+13) 16+6=2006 11111010010 2 =((((((((((1) 2+1) 2+1) 2+1) 2+1) 2+0) 2+1) 2+0) 2+0) 2+1) 2+0 2006 10 =(((2) 10+0) 10+0) 10+6 Kellemes az átváltás a két számredszerbeli ábrázolás között, ha törtéetese a biáris és a hexadecimális számredszerről va szó. Ekkor hexadecimális alakról biárisra törtéő átírás eseté mide hexadecimális jegyet a jegy biáris megfelelőjével helyettesítük. Biárisról hexadecimálisra törtéő átírásál pedig a törtvesszőtől jobbra is és balra is égyes csoportokra osztva a biáris szám számjegyeit mide csoportot helyettesítük a hexadecimális megfelelőjével. A megfeleltetés a hexadecimális számjegyek és a biáris égyjegyű csoportok között az alábbi táblázatba látható: 0000 0 0100 4 1000 8 1100 C 0001 1 0101 5 1001 9 1101 D 0010 2 0110 6 1010 A 1110 E 0011 3 0111 7 1011 B 1111 F (Lássuk be, hogy a javasolt módszer helyes eredméyre vezet!) Módszerükkel kikerüljük egyrészt a tizes számredszerre törtéő átmeeti átalakítást, másrészt em kell em tizes alapú számredszerbe műveleteket végezi Pozitív egész szám b alapú logaritmusa és a szám b alapú számredszerbeli számjegyei számáak a kapcsolatát világítja meg az alábbi tétel. 3. Tétel: A számjegyek számáról Pozitív x egész szám számjegyeiek a száma b alapú számredszerbe eggyel több, mit a szám b alapú logaritmusáak az alsó egészrésze, azaz ha a szám számjegyei c, c, K, c c, akkor a jegyek száma 1 1, 0 Bizoyítás x = c = b = b b logb 1 + 1 = x + ( c + c b + K 1 + c / b + c / b ) y + c 1 b 1 1 0 + K+ c b + c b = 1 / 1 0 1444444 2 = y 1 = 444444 3 Világos, hogy 1 c y < b. Ie az y logaritmusára kapjuk, hogy 0 (14) (15)
Adatstruktúrák, algoritmusok - 8 - (15)-ből logaritmálással adódik. Azaz log b 0 logb y < 1 (16) x = log b + log y = + log y (17) b b b + log y = log x (18) (18) midkét oldalá az alsó egészrészt véve logb x b b = adódik, mivel egész szám és (16) feáll. Egyet hozzáadva midkét oldalhoz kapjuk az állításukat. Az előzőek megvalósításáról Általába em fog miket érdekeli, hogy a taulmáyuk tárgyai, objektumai hogya valósíthatók meg fizikailag (hogya realizálhatók). Eek elleére em árt egy kis kitekités a számítástechikára. Az egyik fotos dolog, hogy a számok hogya kerülek tárolásra a számítógép memóriájába. A memóriát úgy lehet elképzeli, mit egymás mellett lieárisa felsorakoztatott tárolórekeszek sorozata. A rekeszeket egymástól a sorba elfoglalt helyük külöbözteti meg, amit egy idexszel (címmel) íruk le. A rekesz fogalom szemléletes, de fizikailag em potos. A fizikai rekesz ma a byte (= 8 bit). A byte a memória legkisebb fizikailag címezhető egysége. A memóriából kiolvasi, vagy oda beíri egy byte-ál kevesebb adatmeyiséget em lehet. Ha csak egy bitet akaruk megváltoztati, akkor is ki kell olvasi az őt tartalmazó byte-ot, a kívát bitet átíri, majd a byte-ot visszaíri a memóriába. A byte tartalmát a jobb áttekithetőség miatt hexadecimális számredszerbe szoktuk megadi. Például az 11001001 2 tartalmú byte hexadecimális alakba C9 16. A byte bitjeit jobbról balra idexeljük. A jobbszélső bit a ullás idexű bit (a legkevésbé szigifikás bit, Least Sigificat Bit, LSB), tőle balra áll az egyes idexű bit, és így tovább. A byte balszélé áll a hetes bit (a legszigifikásabb bit, a legagyobb helyiértékű bit, Most Sigificat Bit, MSB). MSB LSB bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 bitidex 7 6 5 4 3 2 1 0 Byte és bitjei Már egyetle byte is alkalmas szám tárolására csak a számtartomáy kicsi. A yolc bit midegyike lehet zérus, vagy egy. Eek megfelelőe 2 8 = 256 egymástól külöböző byte létezhet. Mide ilye bitvariációhoz hozzáredelük egy számot. Természetes módo kíálkozott és a gyakorlat is ezt részesítette előybe, hogy előjel élküli (emegatív) illetve előjeles számokat külöböztessük meg. A byte tartalmát aszerit iterpretáljuk, hogy milye típusú adatot akaruk bee láti. Előjel élküli esetbe a hozzáredelés a byte tartalomhoz a bitsorozat kettes számredszerbe leírt számkét való értelmezése. Ekkor a legkisebb szám a zérus lesz (tiszta zérus bitek), a legagyobb a 255 (tiszta egyes bitek). Ha előjeles számokat szereték tároli, akkor az úgyevezett kettes komplemes ábrázolást szokás előyei miatt alkalmazi. Ekkor az előjeles egész szám hozzáredelése úgy törtéik, hogy ha a MSB=0, akkor a byte tartalmat az előjelmetes esetek megfelelőe értelmezzük. Ha MSB=1, akkor ayival kell többet teük, hogy a kapott előjelmetes számból kivojuk a 2 8 = 256 számot, ami biztosa egatív lesz. Eze a módo a legkisebb szám 128 lesz (MSB=1, a többi bit
Adatstruktúrák, algoritmusok - 9 - zérus), a legagyobb szám 127 lesz (MSB=0, a többi bit egyes). Egy adott bitmitázathoz tartozó kettes komplemesek a meghatározására egy egyszerű szabály a következő: a mitázat jobbvégétől balfelé haladva leírjuk az összes bitet változatlaul az elsőkét előforduló egyes bittel bezárólag, majd ezutá mide további bitet elletétesre változtatuk. (Lássuk be, hogy a módszer valóba helyes! Va-e olya bitmitázat, amelyek a kettes komplemese saját maga, és ha va, akkor háy va és melyek ezek?) Egy byte tartalmát értelmezhetjük azoba karakterkét is. A karakter gyűjtőfogalom, a betű, számjegy, írásjel, vezérlőjel összefoglaló eve. Ha egy byte tartalmát karakterkét kívájuk iterpretáli, akkor haszálhatjuk a szabváyos és elterjedt ASCII kódtáblázatot, amely a C. Függelékbe megtalálható. Nem céluk most itt belemei eek az egyszerű dologak a gyakorlat által törtéő elbarokkosításába, amikoris a karakter milyesége függhet az eszköztől, amire azt kiküldjük (képeryő, yomtató, stb.), a yelvi megállapodástól stb. Bármilye meglepő ezekutá, egy byte-ot yolc bitek is lehet iterpretáli, amikor az egyes bitekek más és más a jeletése. Ilyekor jelzőbitekről (flag-ek) beszélük. Az egyes bitek szemafor szerepet játszaak, pillaatyi értéküktől függőe dötük. Visszatérve az egész számok ábrázolására azoal látszik, hogy az egyetle byte agyo szűk mozgásteret eged, kicsi az átfogott számtartomáy. A fizikai eszközeik (a hardware) lehetőséget biztosítaak több byte összekapcsolására. Ez azoba a software útjá is megvalósítható, csak az kevésbé hatékoy. Két byte már 16 bitet ad, ami 2 16 =65536 külöböző szám megadhatóságát jeleti. A byte-párt szóak (word) evezik. A szóba a MSB a szó balszélé a 15-ös idexű bit. MSB LSB bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8 bit 7 bit 6 bit 5 bit 4 bit 3 Bit 2 bit 1 bit 0 Magas helyiértékű byte Alacsoy helyiértékű byte Szó és bitjei Előjel élküli számok eseté a legkisebb érték 0 (16 zérus bit) a legagyobb szám 2 16-1 = 65535 (16 egyes bit). Előjeles számok eseté ha MSB=1, akkor kivoi a 2 16 =65536-ot kell. A legkisebb szám -2 15 = -32768 (MSB=1, a többi bit zérus), a legagyobb 2 15-1 = 32767 (MSB=0, a többi bit egyes). Mód va égy byte összekapcsolására. Ez a dupla szó (double word). A dupla szóba a MSB bit idexe 31. MSB LSB 31 24 23 16 15 8 7 0 3. byte 2. byte 1. byte 0. byte Duplaszó byte-jai és bitjei A lehetőségek száma 2 32 = 4294967296. Előjel élküli számok eseté a legkisebb szám a zérus, a legagyobb 2 32-1 = 4294967295. Előjeles esetbe ha MSB=1, akkor kivoi a 2 32 = 4294967296 számot kell. A legkisebb szám a -2 31 = -2147483648, a legagyobb 2 31-1 = 2147483647. Ha a byte-okat az egyik számítógépről valamely másikra visszük át, akkor em léyegtele, hogy az összekapcsolt byte-ok eseté mi a helyes byte-sorred. Az Itel processzorok az összekapcsolt byte-okat fordított sorredbe rakják le egymás utá a memóriába, ami azt jeleti, hogy elöl a legalacsoyabb helyiértékeket tartalmazó byte áll, majd azt követik az egyre magasabb helyiértékeket adó byte-ok. (A Motorola processzorok az egyees sorred hívei, először a legmagasabb helyiértékű byte, majd a csökkeő helyiérték szeritiek következek.) Szó byte-jai Duplaszó byte-jai memória...... 0. byte 1. byte...... 0. byte 1. byte 2. byte 3. byte...... Itel byte sorred övekvő byte címek Szó byte-jai Duplaszó byte-jai
Adatstruktúrák, algoritmusok - 10 - memória...... 1. byte 0. byte...... 3. byte 2. byte 1. byte 0. byte...... Motorola byte sorred övekvő byte címek Az egész számokkal végzett műveletek potos eredméyt adak, ha az eredméy az ábrázolási tartomáyba esik. Összefoglalva a számtartomáyokat: előjel élküli szám előjeles szám legkisebb legagyobb legkisebb legagyobb byte 0 2 8-1 -2 7 2 7-1 szó 0 2 16-1 -2 15 2 15-1 dupla szó 0 2 32-1 -2 31 2 31-1 Más a helyzet a valós számokkal. Eze a tére ma már szabváy létezik, az IEEE 754-es szabváy, amely 1985 óta érvéyes és William Kaha a Berkeley egyetem professzora evéhez fűződik. A szabváy potos előírásokat ad a valós számok ábrázolására. Potosabba em is valós számokak evezik az ílymódo kezelhetö számokat, haem lebegőpotos számokak. Eze ábrázolási formát em tárgyaljuk teljes részletezettséggel, de a két együtt ismertethető esetről - az egyszeres potosság és a dupla potosság esete - szóluk éháy szót. Előtte azoba meg kell ismerkedi egy a tizedes törteket más alapú számredszerbe törtéő lehetséges átírási módszerrel. Tekitsük egy szám törtrészéek a tizes számredszerbeli felírását. A szám legye 0, c K 1c2c3 alakú, ahol c 1, c 2, c 3 K a törtrész egymást követő tizedesjegyei. Ha 10-zel szorzuk, akkor az első tizedesjegy kicsúszik az egészek helyére, amit levághatuk. További szorzásokkal a többi jegy is előjö egymás utá. Ha miket egy b alapú számredszerbeli felírás jegyei érdekelek, akkor világos, hugy a 10 helyett b -vel kell szorozgati. A tevékeység egy sémába foglalható, a számjegyek egyees sorredbe keletkezek: c b c = x b c k x x 1 x1 = ( b) mod1 2 = x 1 b x2 = ( x1 b) mod1 xk = 1 b x ( x b k = k 1 ) mod1 A visszaalakítás pedig törtéhet szité egy Horeres séma szerit. Az értelmezése ugyais x = 0, c c c K 1 2 3 c szám x / 2 3 = c1 / b + c2 / b + c3 / b + K + c b (19) Ez úgy is számolható, hogy x ( ((( c )/ b + c )/ b + c )/ b + c b =... 2 1 / 1 K ) (20) A séma kéyelmes, felváltva kell számjegyekét osztást és összeadást végezi. 12. példa: Írjuk fel a 0,52734375-öt kettes (= biáris) számredszerbe és 16-os (= hexadecimális) számredszerbe. 2 0,52734375 16 0,52734375 Tehát 0,52734375 10 =0,10000111 2 =0,87 16
Adatstruktúrák, algoritmusok - 11-1 0,0546875 8 0,4375 0 0,109375 7 0,0 0 0,21875 0 0,4375 0 0,875 1 0,75 1 0,5 1 0,0 13. példa: Visszaírás tizes számredszerre: 0,87 16 =0+((7)/16+8)/16=0,52734375 0,10000111 2 =0+((((((((1)/2+1)/2+0)/2+0)/2+0)/2+0)/2+1)/2 0,52734375 10 =0+((((((((5)/10+7)/10+3)/10+4)/10+3)/10+7)/10+2)/10+5)/10 A tizedes törtek átalakításáak va egy a számítógép oldaláról tekitve kellemetle oldala. Az ugyais, hogy ami véges tizedes tört az egyik alap mellett, az em biztos, hogy szité véges lesz a másik alap mellett. Például 0,1 10 biárisa végtele sok törtjegyet tartalmaz. (Elleőrizzük!) Tároli viszot midig csak véges sok bitet tuduk. Valahol a végtele sorozatot el kell vági. Ez azt jeleti, hogy az átalakított szám már em fog megegyezi értékét tekitve az eredetivel. Tehát például, ha egy program bekér egy lebegőpotos számot és 0,1-et billeytűzük be, akkor az kettes számredszerbelivé átalakítva értékét tekitve em fog megegyezi az eredeti tízes számredszerbeli 0,1-gyel. Ha egy törtjegyeket tartalmazó számak az egészek helyé álló része em zérus, akkor először átalakítjuk az egészek részét, majd a törtrészt és a kettőt egy törtvesszővel elválasztva egymás mellé helyezzük. 1 10 2 16 4. példa: 2006,52734375 =11111010010,10000111 =7D6,87 A szabváy szeriti lebegőpotos számábrázolás égy byte-o törtéik egyszeres potosság eseté és yolc byte-o dupla potosság eseté. A kettő között eltérés igazá csak a potosságba és az átfogott számtartomáyba va, az ábrázolás elve azoos. Tekitsük először a ormalizált szám esetét. Legye a szám emzérus. Ekkor a biárisa felírt számot átalakítjuk olya formára, hogy a törtvesszőt a legelső egyes jegyet közvetleül követőe helyezzük el és megjegyezzük, hogy eze művelethez a törtvesszőt háy bitpozícióval kellett balra mozgati. Ez a szám balra mozgásál pozitív, jobbra mozgásál egatív lesz és azt mutatja, hogy az átalakítás utái számot a 2 milye kitevőjű hatváyával kell megszorozi, hogy a kiiduló számot megkapjuk. A törtvesszőt követő bitek sorozatáak eve: szigifikás. Eze iformációkat kell elhelyezük a redelkezésre álló égy illetve yolc byte-o. A bitek kiosztása az egyszeres potosság eseté: előjelb it kitev ő 8 bite szigifikás 23 bite 3. byte 2. byte 1. byte 0. byte Egyszeres potosságú lebegőpotos szám Az előjelbit pozitív szám eseté zérus, egatív szám eseté 1. A kitevő részére fetartott 8 bites mezőbe a kitevő 127-tel megövelt (eltolt) értékét helyezzük el előjel élküli egész számkét. A szigifikás (a vezető egyes élkül, implicit egyes bit) kerül a hátramaradt 23 bites mezőbe. 15. példa:példa: 2006,52734375 hogya éz ki egyszeres potosságú lebegőpotos számkét? A szám biárisa, ahogy már kiszámoltuk: 11111010010,10000111 2. Normalizált alakba: 1,111101001010000111 ahol a kitevő decimálisa 10. Ez eltolva 10+127=137=10001010 2. (Negatív kitevőt 8 bite kettes komplemes módo tároluk, majd
Adatstruktúrák, algoritmusok - 12 - így adjuk hozzá a 127-et.) A szigifikás 23 bitre zérusokkal kiegészítve: 11110100101000011100000. Végül a 32 bit 0100 0101 0111 1010 0101 0000 1110 0000, vagy hexadecimálisa 45 7A 50 E0. A szám ebbe a formába törtéő ábrázolása csak akkor megegedett, ha az eltolt kitevő em zérus és em 255. Ez a két szélső eset más célra va fetartva. A tiszta zérus biteket tartalmazó kitevő mező és a zérus szigifikás együtt zéruskét va defiiálva. Va pozitív zérus és egatív zérus az előjeltől függőe, de valójába a processzor ezeket azooskét kezeli. Ha a kitevő mező zérus, de a szigifikás mező em zérus, akkor em ormalizált (deormalizált) lebegőpotos számról beszélük. Ekkor az implicit egyes bit is tárolásra kerül, mit a szigifikás része, mivel ő a törtvessző mögé kerül. Deormalizált tárolásál komoly jegyveszteségre lehet számítai! Például a 2-126 még ormalizált módo tárolódik, de a tőle kisebb kitevőjűekél már az eddig elhagyott egyes bitet is tároljuk. Az alábbi táblázat illusztrál éháy esetet. Szám Byte-ok biárisa Byte-ok hexába 2-126 0000 0000 1000 0000 0000 0000 0000 0000 00 80 00 00 2-127 0000 0000 0100 0000 0000 0000 0000 0000 00 40 00 00-128 2 0000 0000 0010 0000 0000 0000 0000 0000 00 20 00 00 2-149 0000 0000 0000 0000 0000 0000 0000 0001 00 00 00 01 A kitevő mező legmagasabb értékéhez szité két eset tartozik. Ha a szigifikás mező zérus, akkor a tárolt iformáció előjeles végtelekét va defiiálva. Szimbólum Byte-ok biárisa Byte-ok hexába + 0111 1111 1000 0000 0000 0000 0000 0000 7F 80 00 00-1111 1111 1000 0000 0000 0000 0000 0000 FF 80 00 00 A végtele kezelése sorá a processzor a végteleel végezhető műveletek tulajdoságait megtartja. Például végtele plusz véges eredméye végtele, vagy véges osztva végteleel zérust ad. Ha a szigifikás rész em zérus, akkor ezt a szituációt em számkét defiiálták (NaN=Not a Number). Szimbólum NaN NaN Byte-ok biárisa 0111 1111 1xxx xxxx xxxx xxxx xxxx xxxx 1111 1111 1xxx xxxx xxxx xxxx xxxx xxxx A sémába az x-szel jelölt bitek em lehetek egyszerre mid zérusok. Ilye eset (NaN) lehet például a végtele osztva végteleel művelet eredméye. Azok a számok, értékek, állapotok, amelyek a feti sémába em férek bele, em ábrázolhatók, velük közvetle módo számoli em tuduk. A dupla potosságú esetbe a yolc byte-ba a kitevő mező 11 bites, a szigifikás mező 52 bites. A kitevő eltolás mértéke 1023. A kitevő mező két kitütetett értéke a zérus és az 2047. Egy táblázatba mellékeljük a lebegőpotos aritmetika lehetőségeit, korlátait: Jellemzők Egyszeres potosság Dupla potosság Előjelbitek száma 1 1 Kitevő bitek száma 8 11 Törtrész bitek száma 23 52
Adatstruktúrák, algoritmusok - 13 - Összes bitek száma 32 64 Kitevő ábrázolása 127-es eltolás 1023-as eltolás Kitevő tartomáya -126 - +127-1022 - +1023 Legkisebb ormalizált szám 2-126 2-1022 Legagyobb ormalizált szám kb. 2 128 kb. 2 1024 Decimális számtartomáy 38 kb. 10-38 - 10 308 kb. 10-308 - 10 Legkisebb em ormalizált szám kb. 10-45 kb. 10-324 A memória kiválóa alkalmas olya matematikai objektumok tárolására, mit a vektor vagy a mátrix. Ahogya a vektor koordiátáit egymást követőe soroljuk fel, úgy ezeket a számokat a memóriába is tárolhatjuk azoos tulajdoságú egymást követő rekeszekbe. A vektor miket érdeklő koordiátájára az idexe alapjá hívatkozuk. Az idex és a vektor kezdő eleméek címe alapjá a keresett idexű elem címe meghatározható. Ha a a vektor kezdőcíme, k a keresett elem idexe és h a rekeszméret byte-ba, akkor a keresett elem címe ( k ) h a + 1. (21) Itt hallgatólagosa feltettük, hogy a kezdőelem idexe 1. Mátrixokat úgy szokás tároli, hogy vagy a sorait (sorfolytoos tárolási mód), vagy az oszlopait (oszlopfolytoos tárolási mód) helyezzük egymás utá. Legye a mátrix mérete m (m sor és oszlop) és az (1,1) idexű elem (bal-felső sarokelem) címe legye a. Sorfolytoos tárolási módot választva ekkor az (i,j) idexű elem címe a memóriába [( i ) + j ] h Ugyaez oszlopfolytoos tárolási mód mellett: a + 1 1. (22) [( j ) m + i ] h a + 1 1. (23) A számítógépes programozás területéről több fogalomra lesz szükségük aak elleére, hogy igazá egyetle programozási yelv mellett sem kötelezzük el magukat. A számításaik, adatoko végzett tevékeységeik elvégzéséhez gépi utasítások, paracsok sorozatára lesz szükségük. Ezeket összefogva programak fogjuk evezi. A programot valamilye magas szitű programozási yelve (az ember godolkodásmódjához közel álló yelve) írjuk meg, majd azt a gép yelvére egy fordítóprogram (compiler) segítségével fordítjuk le (remélhetőe jól). Ha va iterpreter program, akkor azzal is megoldható a feladatvégzések a gépre törtéő átvitele. A programok általába procedúrák (eljárások) sokaságát tartalmazzák. Ezek a zárt programegységek egy-egy kisebb feladat elvégzésére specializáltak. A program többi részével csak a paramétereik révé tartják a kapcsolatot. Fekete dobozak kell őket tekiteük. A dobozra rá va írva, hogy miből mit csiál. Vaak (lehetek) bemeő (iput) és vaak (lehetek) kimeő (output) paraméterei. A bemeetet alakítják át a kimeetté. Ha ismerjük a procedúra belső szerkezetét mert modjuk mi készítettük, akkor fehér doboz a eve, ha em ismerjük mert em vagyuk kívácsiak rá, vagy másoktól kaptuk, akkor fekete doboz szerkezet a eve. Például készíthetük olya procedúrát, amely bekéri (iput) az a, b, c három valós számot, melyeket egy ax 2 +bx+c kifejezés (itt x valós szám, változó) kostas együtthatóiak tekit, majd eredméyül (output) meghatározza a kifejezés valós gyökeiek a számát és ha va(ak) gyök(ök), akkor az(oka)t is megadja. Példa egy lehetséges másik procedúrára: egy file evéek ismeretébe a procedúra a file rekordjait valamilye szempot szerit megfelelő sorredbe rakja (redezi). A procedúrák által haszált memóriarekeszek a paramétereket kivéve a zártságak köszöhetőe lokálisak a procedúrára ézve. Csak addig foglaltak, míg a procedúra dolgozik, aktív. A procedúrát
Adatstruktúrák, algoritmusok - 14 - mukára fogi az aktivizáló utasítással lehet. Ezt eljáráshívásak is evezik. Az aktivizált procedúra lehet saját maga az aktivizáló is, ekkor rekurzív hívásról beszélük, a procedúrát pedig rekurzív procedúráak evezzük. A procedúra mukája végé a vezérlés visszaadódik az aktivizáló utasítást követő utasításra. Ezt a mechaizmust a verem (stack) révé valósítjuk meg. A verem a memória egy erre a célra kiválasztott része. A procedúra aktivizálásakor ide kerülek beírásra a procedúra paraméterei és a visszatérési cím (az aktivizáló utasítást követő utasítás címe). A procedúrából való visszatéréskor eze cím és iformációk alapjá tudjuk folytati a mukát, a programot. A visszatéréskor a veremből az aktivizálási iformációk törlődek. Ha a procedúra aktivizál egy másik procedúrát, akkor a verembe a korábbiakat követőe az új aktivizálási iformációk is bekerülek, azt modjuk, hogy a verem mélyül. A veremmélység szitszáma eggyel ő. Kezdetbe a verem üres, a szitszám zérus, procedúrahíváskor a szitszám ő eggyel, visszatéréskor csökke eggyel. A dolog pikatériájához tartozik, hogy a procedúra a lokális változóit is a verembe szokta helyezi, csak ezt közvetleül em érzékeljük, mivel a visszatéréskor ezek oa törlődek, a helyük felszabadul. Időkét azoba a hatás sajálatosa látváyos, amikor verem túlcsordulás (stack overflow) miatt hibajelzést kapuk és a program futása, a feladat megoldásáak meete megszakad. Adódhat azoba úgy is, hogy mideféle hibajelzés élkül lefagy a gép. A veremek a valóságba va egy felső mérethatára, amelyet agyo em taácsos túllépi. Nézzük egy példát a veremhaszálatra. Tegyük fel, hogy va még olya elvetemült ( +1) iformatikus, aki em tudja, hogy 1+ 2 + 3+ K + =, és ezért egy kis procedúrát ír 2 eek kiszámítására. Ameyibe az illető a fet említett hibája mellett teljese ormális, akkor ige agy eséllyel az alábbi módo oldja meg a problémát. A procedúra eve legye Summa és legye egy paramétere az, hogy 1-től kezdve meddig törtéje az összeadás. Feltételezzük a procedúra jóhiszemű haszálatát és így az pozitív egész szám kell legye. (Nem írjuk meg a procedúrát első lépésbe még bolodbiztosra.) Kirészletezzük egy kissé a procedúra teedőit. Szükség lesz egy gyűjtőrekeszre, ahol az összeget fogjuk tároli és képezi. Legye eek a eve s. A procedúra mukájáak végé ez lesz a végeredméy, ezt kapjuk vissza, ez lesz a procedúra output paramétere. Szükség lesz továbbá egy számlálóra, legye a eve k, amellyel egytől egyesével elszámoluk -ig és mide egyes értékét az s-hez a számlálás közbe hozzáadjuk. Az s-et a muka kezdeté természetese ki kell ullázi, hisze em tudjuk, hogy mi va bee az iduláskor. Ezek utá a kósza meggodolások utá egy kissé redezettebb alakba is írjuk le a teedőket. Összefoglaló adatok a procedúráról: A Summa procedúra leírása A procedúra eve: Bemeő paraméter: Kijövő paraméter: Lokális változó Summa., megadja, hogy meddig kell az összeadást elvégezi. s, tartalmazza az összeget a végé. k, számláló, amely egytől elszámol -ig egyesével. A procedúra tevékeysége: 1. lépés: s kiullázása 2. lépés: k beállítása 1-re, ie idul a számlálás 3. lépés: s megövelése k-val (s-hez hozzáadjuk a k-t és az eredméy s-be marad. 4. lépés: eggyel megöveljük a k számláló értékét 5. lépés: Elleőrizzük, hogy a k számláló em lépett-e túl az -e, a végértéke. Ha még em, akkor folytatjuk a mukát a 3. lépésél.
Adatstruktúrák, algoritmusok - 15 - Ha ige, akkor pedig a 6. lépéshez megyük. 6. lépés: Késze vagyuk, az eredméy az s-be található. Ezutá ha szükségük va, modjuk, 1-től 5-ig a számok összegére, akkor csak leírjuk, hogy Summa(Iput:5, Output s). Esetleg függvéyes alakot haszálva az s=summa(5) is írható. Az aktivizálás hatására a verembe bekerül az 5-ös szám, valamit az s rekesz memóriabeli címe és a visszatérési cím, hogy a procedúra mukája utá hol kell folytati a tevékeységet. Miutá most ics több teedő, ezért ez a cím olya lesz, amelyből ez a téy kiderül. Jelezhetjük ezt formálisa modjuk egy STOP-pal. Valahogy így éz ki a verem formálisa: 5 s címe STOP Kezdetbe üres volt a verem, most egy szit került bele bejegyzésre. Amikor a procedúra mukája véget ér, akkor ez a bejegyzés a veremből törlődik, így az újra üres lesz. (Tulajdoképpe a számláló számára lefoglalt helyet is fel kellett vola tüteti a bejegyzésbe, de ez a számukra most em fotos.) Mide agyo szép, mide agyo jó, mideel meg vagyuk elégedve, és akkor jö egy rekurzióval megfertőzött agyú ember, aki így godolkodik. Egytől -ig összeadi a számokat az ugyaaz, mit az egytől -1-ig összeadott számok összegéhez az -et hozzáadi. A feladatot visszavezettük saját magára, csak kisebb méretbe. Egytől -1-ig persze megit úgy aduk össze, hogy az -2-ig képezett összeghez adjuk az -1-et. Ez a rekurzió. Arra kell vigyázi, hogy valahol eek a visszavezetések véget kell veti. Amikor már csak egytől egyig kell az összeget képezi, akkor azt már em vezetjük vissza tovább, haem ott már tudjuk az eredméyt, hisze az triviálisa éppe egy. Tehát a rekurzív agyú ember egy függvéyt alkot, modjuk RekurzívSumma éve, és az alábbi módo defiiálja azt: R ekurzívsumma ( ) 1, = RekurzívSumma ( 1) +, ha = 1 ha > 1 (24) Ha most leirjuk, hogy s=rekurzívsumma(5), akkor ezt úgy kell kiszámoli, hogy: s =RekurzívSumma(5) = RekurzívSumma(4)+5 =(RekurzívSumma(3)+4)+5 =((RekurzívSumma(2)+3)+4)+5 =(((RekurzívSumma(1)+2)+3)+4)+5 =((1+2)+3)+4)+ 5 =((3+3)+4) +5 =(6+4)+ 5 =10+ 5 =15 Lássuk ezekutá hogya alakul a verem törtéete. A RekurzívSumma(5) hatására az üres verembe egy bejegyzés kerül: 5 eredméy Az eredméy s-be írási címe A továbbiakba pedig a verem az egyes rekurzív hívások hatására a következőképpe alakul: RekurzívSumma(5): 5 eredméy Az eredméy s-be RekurzívSumma(4): 4 eredméy Összeadás helye írási címe
Adatstruktúrák, algoritmusok - 16 - RekurzívSumma(3): 3 eredméy Összeadás helye RekurzívSumma(2): 2 eredméy Összeadás helye RekurzívSumma(1): 1 eredméy Összeadás helye Itt a rekurzió megakad, további rekurzív hívás már em lesz, a végleges veremmélység 5, a rekurzív hívások száma 4 (a legelső aktivizálás még em rekurzív hívás). A legutolsó hívás már tud számoli, és az eredméy 1 lesz, ami a verembe meg is jeleik: RekurzívSumma(5): 5 eredméy Az eredméy s-be RekurzívSumma(4): 4 eredméy Összeadás helye RekurzívSumma(3): 3 eredméy Összeadás helye RekurzívSumma(2): 2 eredméy Összeadás helye RekurzívSumma(1): 1 1 Összeadás helye írási címe Ezutá az utolsó előtti hívásbeli összeadás (1+2) elvégezhető, a hívás befejeződik és a veremből a legutolsó bejegyzés törlődik. A továbbiakba redre az alábbi veremállapotok állak elő: RekurzívSumma(5): 5 eredméy Az eredméy s-be RekurzívSumma(4): 4 eredméy Összeadás helye RekurzívSumma(3): 3 eredméy Összeadás helye RekurzívSumma(2): 2 3 Összeadás helye írási címe RekurzívSumma(5): 5 eredméy Az eredméy s-be írási címe RekurzívSumma(4): 4 eredméy Összeadás helye RekurzívSumma(3): 3 6 Összeadás helye RekurzívSumma(5): 5 eredméy Az eredméy s-be írási címe RekurzívSumma(4): 4 10 Összeadás helye RekurzívSumma(5): 5 15 Az eredméy s-be írási címe Ie a visszatérés az értékadáshoz, az s-be törtéő eredméy elhelyezéshez törtéik, miáltal a verem kiürül. Az elmodottak alapjá látszik, hogy a feladat elvégzéséhez szükséges maximális veremmélység 5 és összese 4 rekurzív hívás törtét. Itt akár fel is lélegezheték, de ekkor egy újabb, még súlyosabb állapotba lévő fazo jeleik meg, aki azt modja, hogy lehet ezt még szebbe is csiáli. Ő a rekurziót arra építi, hogy az összeg képezhető úgy is, hogy az összeadadó számok halmaza első feléek összegéhez hozzáadja a halmaz második feléek összegét. A felezést további felezéssel számolja, mígcsak az aprózódás révé el em jut egytagú ősszegekig. Rövide és tömöre ő egy másik függvéyt defiiál, amely kétváltozós, eve RekSum(m,), és m-től -ig adja össze a számokat. Ezzel az általáosabb függvéyel egytől -ig összeadi RekSum(1,)-el lehet. Speciálisa a mi feti problémák esetébe : RekSum(1;5) számoladó. Az ő defiíciója így éz ki: RekSum m, ha m =, = m + m + RekSum m, + + < RekSum 1,, ha m (25) 2 2 ( m ) Nézzük csak esetükbe? hogya is számol ez a ravasz mődszer a mi speciális s=reksum(1;5)
Adatstruktúrák, algoritmusok - 17 - s =RekSum(1;5) =RekSum(1;3) + RekSum(4;5) =(RekSum(1;2) + RekSum(3;3)) + (RekSum(4;4) + RekSum(5;5)) =((RekSum(1;1) + RekSum(2;2)) + 3) + (4 + 5)) =((1 + 2) + 3) + (4 + 5)) =(3 + 3) + (4 + 5) =(6 + 9) =15 Hogya alakul a verem sorsa ebbe az esetbe? Az első aktivizáló hívás utá a verem: 1 5 eredméy Az eredméy s-be írási címe Ezutá következik a RekSum(1;3) hívás. A hatása: 1 5 eredméy Az eredméy s-be írási címe 1 3 eredméy Összeadásjel Most jö a RekSum(1;2) hívás a RekSum(1;3)-o belül. A hatás: 1 5 eredméy Az eredméy s-be írási címe 1 3 eredméy Összeadásjel 1 2 eredméy Összeadásjel Ez megit em számolható közvetleül, tehát jö a RekSum(1;1), mire a verem új képe: 1 5 eredméy Az eredméy s-be írási címe 1 3 eredméy Összeadásjel 1 2 eredméy Összeadásjel 1 1 eredméy Összeadásjel Itt már va eredméy, átmeetileg ics több rekurzív hívás. Az eredméy 1. 1 5 eredméy Az eredméy s-be írási címe 1 3 eredméy Összeadásjel 1 2 eredméy Összeadásjel 1 1 1 Összeadásjel A hívás befejezte utá a veremből kiürül a legutolsó bejegyzés, visszatérük az összeadásjelhez, amely utá azoba egy újabb rekurzív hívás keletkezik, a RekSum(2;2). hatására a verem képe: 1 5 eredméy Az eredméy s-be írási címe 1 3 eredméy Összeadásjel 1 2 eredméy Összeadásjel 2 2 eredméy Összeadás befejezése Az ie törtéő visszatérés utá a verem képe: 1 5 eredméy Az eredméy s-be írási címe 1 3 eredméy Összeadásjel
Adatstruktúrák, algoritmusok - 18-1 2 3 Összeadásjel Az összeadás elvégzéséhez itt azoba egy újabb rekurzív hívás szükséges, a RekSum(3;3). Ie 1 5 eredméy Az eredméy s-be írási címe 1 3 eredméy Összeadásjel 3 3 eredméy Összeadás befejezése 1 5 eredméy Az eredméy s-be írási címe 1 3 6 Összeadásjel következik, majd pedig egy újabb hívás, a RekSum(4;5). A veremállapot: 1 5 eredméy Az eredméy s-be írási címe 4 5 eredméy Összeadásjel Újabb hívás szükséges a RekSum(4;4). A veremállapot: 1 5 eredméy Az eredméy s-be írási címe 4 5 eredméy Összeadás vége 4 4 eredméy Összeadásjel Eek befejezte utá és a veremből törtéő törlést követőe még kell egy hívásak leie, ez pedig a RekSum(4;4). A veremállapot: 1 5 eredméy Az eredméy s-be írási címe 4 5 eredméy Összeadás vége 5 5 eredméy Összeadás vége Ietől kezdve a verem már csak ürül, további rekurzív hívásokra ics szükség. A feladat elvégzéséhez kevesebb szitből álló verem is elég volt, mit az előző esetbe, most a maximális veremmélység csak 4 volt. A rekurzív hívások száma azoba megőtt, összese yolc rekurzív hívás volt. Ebbe a rekurzióba mide hívás, kivéve a legalsóbb szite levőket két újabbat eredméyezett, de ezek a veremek ugyaazo szitjét haszálták. A hívások szerkezetét egy úgyevezett hívási fa sémával tudjuk ábrázoli, melybe csak a paraméter értékeket tütetjük fel. Íme:
Adatstruktúrák, algoritmusok - 19 - (1,5) (1,3) (4,5) (1,2) (3,3) (4,4) (5,5) Az ábrá jól látszik a verem égy szitje. A legfelső szit kivételével a többi szite lévő hívások rekurzívak. Az azoos szite lévő hívások a verem azoos szitjét haszálják csak eltérő időbe. (1,1) (2,2) A tárgyról Eze tömör összefoglaló utá egy pár szót érdemes szóli az adatstruktúrák, algoritmusok témájáak a helyéről az iformatikába. Egy iformatikai alkalmazási redszer kifejlesztése sorá három fő szitet szokás megkülöbözteti., amit egy helyjegyfoglalási redszer példájával illusztráluk. Modjuk az IterCity voatjáratra akaruk helyjegyet vei. Sematikusa az alábbi táblázattal lehete jellemezi a három fő szitet. A középső szit az, amivel a jele köyvbe foglalkozuk. A szit eve A szit jellemzése A szit fogalomredszere Felső szit Alkalmazói szit, modellalkotás útvoalak, szerelvéyek, dátumok, helyfoglalások Középső szit Modellezési szit, algoritmizálás file-ok, táblázatok, listák, adatrekordok, strigek, fák Alsó szit Csupasz gépszit objektumok, műveletek, gépi reprezetálásuk, bitek, byte-ok A felső szit az alkalmazó területe. Ő tudja, eki va meg, hogy milye útvoalako, mely apoko közlekedtet szerelvéyeket, és milye eze szerelvéyek összetétele a helyfoglalás szempotjából. A helyfoglalási redszer kereteit eki kell kijelöli, ő kell, hogy megmodja, hogy mi a fotos a redszerébe, mi az el em hagyható téy és mi az ami elhayagolható. Tudjo-e majd a redszer modjuk olya igéyt is kielégítei, hogy ablakál akar üli az utas de csak a meetiráyal azoos iráyba, e háttal. Az alkalmazó a valóságak egy modelljéhez a kereteket alkotja meg. A későbbi üzemelő redszer paramétereit, képességeit, rugalmasságát és haszálhatóságát ez a szit dötőe meghatározza. A középső szite a modell gyakorlati megvalósítása következik, amely már az egyes adatkezelési, számítási, tárolási módszereket is magába foglalja. Itt tisztázódik a file-ok redszere. Rögzítik a haszáladó táblázatokat, listákat és azok szerkezetét, az adatrekordok felépítését. Az egyes esetekbe haszált keresési módszerek, az adatmódosítások módszerei is kialakításra kerülek, miutá eldötötték, hogy mit és hogya tárolak. Az alsó szit a gépek, beredezések szitje, amelyek fizikailag meg is tudják valósítai, amit a középső szite elterveztek. Eze a szite ics modell, ics szerelvéy, dátum, útvoal. Az adatok, a tárolási szerkezetek és a rajtuk végzett műveletsorok bitek és byte-ok özöekét és átalakításaikét jeleek meg. Itt már mide a biteke, a byte-oko múlik. Azo, hogy az egyes adataikat milye elvek alapjá traszformáltuk bitekké és byte-okká, hogy ezek majd akár a legfelső szit fogalomredszere alapjá is értelmezhetők legyeek. Nem kevésbé fotos az esetleg egymástól térbe és időbe is agy távolságra lévő eszközök között a kommuikáció lehetőség e, téye és milyesége.
Adatstruktúrák, algoritmusok - 20 - Tekitsük most egy elemi problémát és aak megoldásait. Legye adott egy fős társaság. Az egyes tagok időkét pézt kérek kölcsö egymástól. Mideki felírja, hogy kitől meyit kért kölcsö, amikor kölcsökér és kiek meyit adott kölcsö, amikor kölcsö ad. A társaság tagjai időről-időre összejöek az összegy űlt tartozásokat kiegyelítei. Mideki összegyűjti a saját listájá midekivel kapcsolatba, hogy kiek meyivel tartozik. Ezutá émi kavarodást okozva mideki megkeres midekit, hogy kifizesse a tartozását, ami em kis időbe telik, ha a társaság létszáma em lebecsüledő. Ha összegyűjteék egy táblázatba a tartozik-követel összesítéseket, akkor egy ilye tábla valahogy így ézhete ki modjuk 5 személy eseté, akiket redre Aladárak, Béláak, Cecilek, Dávidak és Edéek-ek hívak. Tartozik Kiek tábla Aladár Béla Cecil Dávid Ede Aladár 5 3 1 2 Béla 1 2 3 4 Ki Cecil 5 1 1 2 Dávid 2 3 4 6 Ede 5 5 1 4 Ha eél a tábláál maraduk, akkor eek tárolására fő eseté - rekesz szükséges, miutá mideki kigyűjtötte a saját yilvátartásából a többiekkel kapcsolatos meglévő tartozását. A kölcsöök kiegyelítésére pedig (-1)/ 2 találkozót k ell létrehozi, ahol a két fél kölcsööse kiegyelíti az egymással szembei adósságát. Mi d a két formulába szerepel egy égyzetes tag, ami arra utal, hogy h a a társa ság mérete mod juk 10-szeresre ő, akkor a vele kapcsolatos szervezési és tárolási muka egyarát körülbelül 100-szorosra emelkedik. Nem éppe bíztató következtetés. Va azo ba jobb mego ldás is. Ne m kell mide alkalommal mide kiek feljegyezi, hogy kitől meyit kért, vagy kiek meyit adott. Elegedő, ha mideki csak egyetle számot tárol és azt módosítja kölcsözés eseté, ez pedig az éppe aktuális össztartoz ása a többiek felé. Eek a tárigéye rekesz és a kigyűjtés sem szükséges. A feti táblázatból ez a következő módo kapható meg. A sorokba is és az oszlopokba is képezzük az összegeket, majd midekiél kivojuk a tartozásból (sorösszeg) a követel (oszlopösszeg) értékeket: Tartozik Kiek Tábla Aladár Béla Cecil Dávid Ede Össztartozás Aladár 5 3 1 2 11 11-13 = -2 Béla 1 2 3 4 10 10-14 = -4 Ki Cecil 5 1 1 2 9 9-10 = -1 Dávid 2 3 4 6 15 15-9 = 6 Ede 5 5 1 4 15 15-14 = 1 13 14 10 9 14 Tároli csak az össztartozás oszlopot kell, ami szám. A tartozások kiegyelítéséhez szükséges találkozók száma is drasztikusa csökkethető. A példáál maradva Aladárak tartozak 2-vel, ezt Béla megadja Aladárak. Mostmár Béláak tartozak 6-tal, azt Cecil adja meg Béláak. Cecilek tartozak 7-tel, amit megad eki Dávid, igy Dávidak lesz 1 hiáya, ami t pedig Ede éppe meg tud adi. Ha fő va, akkor a szükséges találkozók száma legfeljebb -1. Eél a megoldásál em árt, ha Béla és Cecil redelkezek émi plusz pézzel, hogy fizeti tudjaak az elejé. Ez elkerülhető azzal, hogy akik tartozak (Dávid és Ede), azok midegyike modjuk Aladárak adja oda a tartozását és ebből a pézből Aladár egyelíti ki a hiáyt azokál, akik pézre várak ( Aladár, Béla, Cecil). Itt tehát ha a méretek 10-szeresre őek, akkor a tárolás és a tartozás kiegyelítéssel kapcsolatos szervezési muka