Anda di halaman 1dari 114

ALGORITMIZLS ALAPJAI

Algoritmizls alapjai
1. Bevezets....................................................................................................................... 6 2. Lecke: Algoritmusok jellemzi s lersuk ................................................................ 9 3. Lecke: Adatok, adatszerkezetek ............................................................................... 24 4. Lecke: Adatsorhoz egy adatot rendel eljrsok 1. ................................................ 36 5. Lecke: Adatsorhoz egy adatot rendel eljrsok 1. Keressek ........................... 49 6. Lecke: Adatsorhoz adatsort rendel eljrsok 1..................................................... 56 7. Lecke: Adatsorhoz adatsort rendel eljrsok 2. Rendez eljrsok................. 61 8. Lecke: Pldk az eljrsok alkalmazsra .............................................................. 69 9. Lecke: Algoritmusok hatkonysga ......................................................................... 96 10. Lecke: Alprogramok ............................................................................................... 100 11. Lecke: Dinamikus adatszerkezetek ........................................................................ 106 12. sszefoglals ............................................................................................................ 115 13. Kiegsztsek ........................................................................................................... 118 14. Tesztek ....................................................................... Hiba! A knyvjelz nem ltezik.

ALGORITMIZLS ALAPJAI

1. BEVEZETS
Az algoritmizls alapjai cm kurzusban elemi algoritmusokkal, azok jellemzivel s lehetsges felhasznlsi terleteikkel ismerkednk meg. Algoritmusok segtsgvel egyszerbb s bonyolultabb problmkat oldhatunk meg. Htkznapi szavakkal az algoritmus valamilyen problma vagy feladat megoldsnak lpseit hatrozza meg. Ha ezeket a lpseket a megfelel sorrendben hajtjuk vgre, azzal megadjuk egy problma vagy feladat egy lehetsges megoldst. Az algoritmus kifejezst rtelmezhetjk gy is, hogy egy olyan szmtsi eljrs, amely valamilyen bemenetbl (bemen adatbl vagy bemen adatok sorozatbl) a lpsek vgrehajtsval valamilyen kimenetet llt el. Sokan tvesen hiszik azt, hogy az algoritmizls s a programozs kifejezsek lnyegben azonos tevkenysgeket jellnek. Ktsgtelen, hogy helyes programok ksztshez ltalban ismernnk kell klnfle algoritmusokat. Azonban egyrszt algoritmusokat konkrt programozsi nyelv ismerete nlkl is megadhatunk. Gondoljunk elemi matematikai feladatokra: pl. ismerjk egy skidom oldalainak hosszt, s szeretnnk kiszmtani a kerlett s terlett. Bemen adatok az oldalak hosszsgai, kimen adatok a skidom kerlete s terlete. A megoldshoz bizonyos skidomok esetben egyszer kpleteket alkalmazhatunk, nha azonban, pldul a terlet kiszmtsa csak tbb lpsen keresztl valsthat meg (pl. egy sokszget elszr hromszgekre bontunk, s a hromszgek terletnek sszegt kiszmtva kapjuk meg a skidom terlett.) Msrszt lteznek olyan programozsi nyelvek is, amelyek hasznlatakor a programoznak nem kell ismernie a feladat megoldsnak lpseit, vagyis a megolds algoritmust. Ezekben a nyelvekben a megoldst maga a programozsi nyelv keresi meg. Az ilyen nyelveket deklaratv programozsi nyelveknek nevezzk. Deklaratv nyelveket hasznlva a programoznak azt kell megadnia, hogy mit szeretne megoldani, s nem azt, hogy hogyan. Ezzel szemben az imperatv nyelvekben a programoz a feladat megoldsnak algoritmust lteti t az adott programozsi nyelvbe, figyelembe vve a nyelv szintaxist s eszkzrendszert. A programoz vltozkat hasznl. Ezek segtsgvel elri s mdostani tudja a memriban trolt adatokat, a problma megoldsnak algoritmust adja meg. Az imperatv nyelveket szoks procedurlis nyelveknek is nevezni. Az algoritmus teht tbbfle mdon is rtelmezhet s megadhat: absztrakt mdon (pl. matematikai eszkzkkel), szmtgpes programknt, stb. Aki algoritmusokkal foglalkozik, az egyben adatokkal, adatszerkezetekkel is foglakozik. Ez az algoritmus kifejezs fenti rtelmezsbl is addik, hiszen az algoritmus a fentiek szerint egy olyan szmtsi eljrs, amely bemen adatokbl kimen adatokat llt el. A kurzus msik clja, hogy a klnbz problmk megadshoz hasznlhat adatok s adatszerkezetek jellemzit is bemutassa. Kijelenthetjk teht, hogy ha valaki programozssal, vagy az informatika sok ms terletvel (pl. adatbzis-kezels, szmtgp-hlzatok, trinformatika, kriptogrfia, stb.) kvn foglalkozni, szksge lesz alapvet algoritmizlsi ismeretekre is.

ALGORITMIZLS ALAPJAI

1.1

CLKITZS (KURZUSRA)

A kurzus clja az algoritmusokkal, illetve adatokkal, adatszerkezetekkel kapcsolatos alapvet ismeretek bemutatsa, s felhasznlsi lehetsgeik ttekintse. Az algoritmizls nll tudomny. A jegyzet azonban olyan hallgatk szmra kszlt, akik csak rintlegesen foglalkoznak ezzel a trggyal, ezrt a jegyzet elksztsekor nem volt clunk, hogy algoritmuselmleti s -helyessgi krdsekkel is foglalkozzunk. A jegyzet csak elemi algoritmusok bemutatst s felhasznlsuk lehetsges mdjait trgyalja.

1.2 A KURZUS TARTALMA


1. Bevezets 2. Algoritmusok jellemzi, algoritmusokkal szemben tmasztott kvetelmnyek. A 3. 4. 5. 6. 7. 8. 9. 10.

BhmJacopini-ttel, vezrlsi szerkezetek az algoritmusokban Algoritmusok megadsnak eszkzei Adatok s adatszerkezetek jellemzi Adatsorhoz egy adatot rendel algoritmusok Adatsorhoz adatsort rendel algoritmusok Rendez algoritmusok Alprogramok Dinamikus adatszerkezetek Feladatok s megoldsaik

1.3 A KURZUS TMR KIFEJTSE


A kurzusban elemi algoritmusokkal, n. programozsi ttelekkel ismerkednk meg. Ahogyan a bevezetbl mr kiderlt, az algoritmusok megadsa s a programozs kifejezsek klnbz tevkenysgeket jellnek, de az algoritmusok legfbb alkalmazsi terlete az informatikban a programozs. Emiatt szksges, hogy az elemi algoritmusokon tl megsmerkedjnk nhny programozsi nyelv alapvet jellemzivel is, hogy a klnbz eszkzkkel felrt algoritmusokat a gyakorlatban is ki tudjuk prblni. Ehhez nyjt segtsget a 10. fejezet. Hangslyozzuk azonban, hogy nem clunk a programozsi nyelvek teljes eszkzrendszernek bemutatsa, hiszen ez nem egy programozs tanknyv. 1.4

KOMPETENCIK S KVETELMNYEK

A kurzus teljestshez elfelttelknt alapvet informatikai ismeretek tudsa szksges. A tananyag megrtshez ismerni kell a Neumann-elv alapvet pontjait, a processzor s a memria szerept, illetve az adattrols alapjait.

ALGORITMIZLS ALAPJAI

1.5 TANULSI TANCSOK, TUDNIVALK


A tananyag megrtshez felttlenl szksges a defincik pontos ismerete. Nagyon fontos, hogy megrtse a msodik s harmadik fejezet minden rszt, s csak ezutn kezdjen a konkrt algoritmusok tanulmnyozshoz.

ALGORITMIZLS ALAPJAI

2. LECKE: ALGORITMUSOK JELLEMZI S LERSUK


2.1

CLKITZS

Ebben a fejezetben az algoritmusokkal s algoritmizlssal, algoritmusksztssel kapcsolatos alapvet fogalmakkal ismerkednk meg. Megismerjk az algoritmus sz rtelmezst, az algoritmusokkal szemben tmasztott kvetelmnyeket, s az algoritmusok pontos megadsnak klnbz eszkzeit.

2.2 TARTALOM
Az algoritmus kifejezs rtelmezse Algoritmusok jellemzi s algoritmusokkal szemben tmasztott kvetelmnyek Algoritmusler eszkzk s jellemzik 2.3

A TANANYAG KIFEJTSE

Ebben a fejezetben az algoritmizls alapjainak trgyalshoz szksges fogalmakkal s eszkzkkel ismerkednk meg. 2.3.1 Az algoritmus

A kznyelvben az algoritmus sz valamilyen mveletsort, tevkenysget jelent, amellyel egy problma megoldst adjuk meg. Lnyegben minden tevkenysgnkkel algoritmusokat kvetnk: minden mozdulatsorunk, de mg a gondolkodsunk is algoritmizlhat. Ahhoz, hogy valamit megoldjunk, algoritmust hasznlunk, legyen az munka, jtk, hobbi, sport vagy brmi. Algoritmust kvetnk egy tel ksztsekor (recept), egy lapraszerelt btor sszeraksakor (tmutat rajz), vagy ha szeretnnk hibt bejelenteni vagy informcihoz jutni valamilyen kzzemi szolgltatnl (krem, telefonja billentyzete segtsgvel vlasszon az albbi menbl), hogy csak nhny gyakori pldt emltsnk. A tovbbiakban az algoritmust olyan szmtsi mveletknt rtelmezzk, amely valamilyen bemeneti (input) adatbl vagy adatsorbl egy vagy tbb kimeneti (output) adatot llt el. Egy algoritmus elemi lpsek meghatrozott sorrend vges sorozata. Ez a megfogalmazs matematikai szempontbl nem kellen pontos. Megjegyzsknt emltjk meg, hogy egy absztraktabb rtelmezs szerint az algoritmus egy Turing-gpre rt program.A Turing-gp egy absztrakt automata, teht nem egy vals, fizikai gpre kell gondolnuk, hanem egy matematikai mdszerre, a vals digitlis szmtgpek egy nagyon leegyszerstett modelljre. 1. kp A Turing-gp vzlata

A Turing-gp vzlatosan egy olyan gp, amelyhez egy vgtelen hosszsg paprszalag tartozik. Ezen a szalagon cellkban jeleket tallunk, minden cellban 1-1 jelet. A Turing-gp nyilvntartja az aktulis cella pozcijt. Minden lpsben lehetsg van beolvasni az aktulis cella tartalmt, lehetsg van az elz s a kvetkez pozcira 9

ALGORITMIZLS ALAPJAI lptetni az olvasfejet, lehetsg van az aktulis cella tartalmt egy msik jelre vltoztatni. A gp minden lpsnl valamilyen bels llapotban van (a bels llapotok szma vges sok), az egyes cellk rtkei ezeket a bels llapotokat megvltoztathatjk. A gp teht minden lpsben beolvassa az aktulis cella tartalmt, megvltoztat(hat)ja bels llapott, aztn elmozdul(hat). Ez a folyamat ktfle kimenetet eredmnyezhet: a gp terminlis (lell) bels llapotba kerl s megll (ez a szablyos lefuts), sosem kerl stop llapotba, vgtelen ideig fut. A bels llapotok megvltoztatsa a gp vezrlegysgnek feladata. Az, hogy egy llapotbl milyen llapotba vlthat a gp, egyrszt fgg a szalagon tallhat jelektl, msrszt attl, hogy az automata mkdse milyen utastsokkal van lerva. A Turing-gp fogalmnak bevezetsvel absztrakt definci adhat az algoritmusra: Egy problma megoldsra adott utastsok sorozata akkor algoritmus, ha ltezik olyan vele ekvivalens Turing-gp, amely minden megoldhat bemenet esetn megll. A Turing-gp megalkotsa Alan Turing (19121954) brit matematikus nevhez fzdik. A gp fogalmt egy 1936-ban megjelent cikkben vezeti be. Turing bebizonytotta, hogy minden specilis automata lerhat vges hosszsg utastssorozattal. Ez az eredmny Neumann Jnos (19031957) munkssgra, illetve a mai korszer digitlis szmtgpek fejldsre is nagy hatssal volt. 2. kp Alan Turing

3. kp 2.3.2 Mit jelent az, hogy elemi lps?

Neumann Jnos

Erre a krdsre tbbfle dolog hatrozhatja meg a vlaszt. Ha abbl indulunk ki, hogy azrt adunk meg egy feladathoz algoritmust, hogy abbl azutn szmtgpes programot ksztsnk, az elemi lpsek nagysgt meghatrozhatja az adott programozsi nyelv eszkzrendszere. Kztudott, hogy a futtatott program utastsait a memria trolja, a futshoz szksges adatokkal egytt. A program utastsait a processzor hajtja vgre. A processzor csak egyfle programot tud vgrehajtani, olyat, amelyet az sajt utastskszletn rtak. Minden processzortpusnak egyedi jellemzi vannak, gy egyedi a klnbz processzorok utastskszlete is. A processzorok sajt utastskszletn rott programokat nvezzk gpi kdnak. A gpi kd lnyegben binris szmjegyek sorozataknt rhat fel, egy-egy utasts egy 8, 16, 24 stb. jegy binris jelsorozat. Egy ilyen gpi kd utasts nmagban ltalban nem tl ltvnyos hatst eredmnyez (pl. ber egy memriaterletre egy 1 bjtos szmot, vagy nveli/cskkenti egy memriacellban tallhat szm rtkt, stb.), fleg, ha n. magasszint programozsi nyelvek utastsaihoz hasonltjuk ket. A gpi kd programozs teht azrt nehz, mert nagyon elemi szint utastsok llnak csak rendelkezsnkre, msrszt pedig az emberi szem szmra lnyegben olvashatatlan egy ilyen kd: kevs olyan ember van, aki szmra egy tbbezer binris szmjegybl ll sorozatot gpi kdknt azonnal meg tud rteni. A szmtstechnika hskorban azonban ez volt az egyetlen lehetsges programozsi mdszer.

10

ALGORITMIZLS ALAPJAI

Az els eszkz, amely kicsit bartsgosabb tette a programozst, az assembly nyelv volt. Ez lnyegben a gpi kd egy olvashatbb jellsmdjt jelenti, ahol az utastsokat binris szmjegyek helyett 2-3 bets szavak, rvidtsek, n. mnemonikok jellik. Lssunk egy pldt: gpi kd 10110000 01100001 assembly MOV AL, 061h Az utasts jelentse: tedd a hexadecimlis 61 rtket a processzor AL regiszterbe! A processzorok azonban kzvetlenl az assembly nyelvet sem rtik, ahhoz teht, hogy egy ilyen nyelven rott programot futtatni tudjunk, az assembly nyelv kdot gpi kdra kell fordtani. Az ilyen fordtprogramokat nevezzk assemblernek. Az 1950-es vektl kezdtek megjelenni az n. magas szint programozsi nyelvek1. Ezek kzs jellemzje, hogy kzelebb llnak az ember beszlte (ltalban angol) nyelvhez, mint a gpi kdhoz. Magas szint programozsi nyelven val programozshoz nem (felttlenl) szksges ismernnk a szmtgp hardvernek (elssorban a processzor s a memria) felptst, st, sok magas szint programozsi nyelvben nincs is eszkznk arra, hogy hogy kzvetlenl nyljunk a memrihoz vagy a processzorhoz. A magas szint programozsi nyelvekben klnbz adattpusokat s adatszerkezeteket, illetve sszetett hats utastsokat hasznlhatunk. (A nagysgrend rzkeltetshez: gpi kdban egy utastssal berhatunk egy adatot egy bizonyos memriacmre, mg egy erre alkalmas magas szint programozsi nyelvben pldul egyetlen utasts segtsgvel a kperny felbontshoz igaztva s a videokrtya sajtossgait figyelembe vve lejtszhatunk egy videollomnyt.) Kiss pontatlanul tehetjk az albbi megllaptsokat: mivel a magas szint programozsi nyelvek sokkal tbb ksz eszkzt adnak a programoz kezbe, a magas szint programozsi nyelveken egyszerbb a programozs; mivel gpi kdban a programoz kzvetlenl programozza a processzort, sokkal hatkonyabb kdok rhatk gpi kdban, mint amilyen gpi kdot a magas szint programozsi nyelvek fordtprogramjai lltanak el. Mindkt lltsban van igazsg, de ennl azrt lnyegesen sszetettebb krdsrl van sz. A laikus szmra egy magas szint programozsi nyelven rott kd is lehet ppen annyira rtelmezhetetlen, mint egy gpi kd, msrszt a programozsi nyelvek fordtprogramjai egyre fejlettebbek, s az j fordtk kpesek lehetnek kzel olyan hatkonysg gpi kd ellltsra, mint amilyet egy gpi kdban jrtas programoz kszt.
1

Az els magas szint nyelv a FORTRAN volt, melynek lerst 1954-ben tette kzz az IBM. Az els gyakorlatban hasznlt programozsi nyelv tz vvel korbban kszlt, Konrad Zuse ksztette 1944-ben Plankalkl nven a Z4 jel szmtgphez.

11

ALGORITMIZLS ALAPJAI sszefoglalva: az elemi lps pontos meghatrozsa tbbfle tnyeztl fgghet. ltalban elmondhatjuk, hogy elvrjuk az elemi lpsektl, hogy fggetlenek legyenek, vagyis egy elemi lps ne legyen felrhat ms elemi lpsek sorozataknt, a problma szempontjbl legyenek fontosak, clszerek s hatkonyak (relevancia). 2.3.3 Algoritmusok jellemzi

A 2.3.1 fejezetben kijelentettk, hogy az algoritmus elemi lpsek meghatrozott sorrend vges sorozataknt rtelmezhet. Az elemi lpsek nagysga az elz rszben rottak alapjn fgghet pldul attl, hogy milyen programozsi nyelven akarjuk implementlni a kdot. Lssunk egy pldt: a tanknyvekbl unsig ismert htkznapi algoritmus a teafzs algoritmusa. Ha a teafzs algoritmust gpi kdra akarjuk alkalmazni, kpletesen szksgnk lesz kt hidrogn- s egy oxignatomra, amelyekbl nmi munkval vizet hozhatunk ltre. Hasonlkpp szksgnk lesz msfle atomokra s molekulkra, amelyekbl teafvet, cukrot, citromlevet, stb. ksztnk. Az sszetevkbl azutn energia kzlsvel (melegts) s keverssel elllthat a kvnt ital. Ezzel szemben a mai modern magas szint, pl. objektumorientlt programozsi nyelvek mindegyikben (kpletesen) ltezik tea objektum, amelyet a programoznak nem kell ltrehoznia, mert kszen kapja azt, ha szksge van r. (A teafzs telefonls, levl feladsa postn, bevsrls, stb. algoritmusnak megadsa a legtbb, kezdknek szl algoritmizls-tankny kedvelt bevezet pldja: rjuk le egy htkznapi tevkenysg pl. teafzs, telefonls stb. , algoritmust!. Az ilyen feladatokra azonban nem lehet algoritmust adni, ugyanis nem egyrtelmek. Nem tudjuk, hogy otthon a konyhban vagy a Mount Everesten llunk-e ppen. Nem tudjuk, hogy milyen eszkzk llnak rendelkezsnkre a teafzshez, illetve van-e nlunk mobiltelefon, vagy flkt kell keresnnk, s ha igen, merre induljunk. Nem tudjuk, hny fnek kszl a tea, s gy tovbb. sszefoglalva: nyitott feladatok megoldsra nem lehet algoritmust adni. Az egyrtelmsg elengedhetetlen: amg nem tudjuk pontosan megfogalmazni, mi a feladat, addig a megoldst sem tudjuk megadni.) Az elemi lpsek meghatrozott sorrendjre vonatkoz kvetelmny nem ignyel magyarzatot. Egy feladatot csak gy tudunk megoldani, ha a lpseket a megfelel sorrendben hajtjuk vgre. A vgessg is nyilvnval kvetelmny. Az ltalunk trgyalt algoritmusok lpseinek elemszma mindig vges. (Megjegyzs: a vgessg tbbfle mdon rtelmezhet. Jegyzetnkben a lpsek lersra vonatkozik a vgessg ez az n. statikus vgessg , s nem a vgrehajtsukra. Ha egy algoritmus t egyms utni utastsbl ll, s az tdik utasts az, hogy ugorj vissza az 1. utastsra, akkor az algoritmus vges szm lpsbl ll, teht statikusan vges, hiszen t lpst definiltunk, a vgrehajts viszont vgtelen.) Egy algoritmust terminltnak nevezzk, ha ugyanazon bemenetek esetn ugyanazt a kimenetet lltja el (azonos kezdllapotok mellett).

12

ALGORITMIZLS ALAPJAI

2.3.4

Algoritmusok megadsa

2.3.4.1 LNKO
Tekintsnk egy egyszer pldt, a legnagyobb kzs oszt (LNKO) kiszmtsnak egy lehetsges algoritmust. ltalnos iskolban gy tanultuk, hogy az a s b termszetes szmok legnagyobb kzs osztja az a c termszetes szm, amely osztja a-nak s b-nek is, s az ilyen szmok kzl a legnagyobb. A c nem felttlenl klnbzik a-tl s/vagy btl: LNKO(6;12) = 6, LNKO(25;25) = 25. Az LNKO kiszmtsra az iskolban azt a mdszert tanultuk, hogy megkeressk a s b prmtnyezit, majd azokat a prmtnyezket, amelyek mindkt szm felbontsban megtallhatk, a legkisebb hatvnyon sszeszorozzuk. Ennl a mdszernl van egy lnyegesen egyszerbb, br kevsb hatkony megolds. Ehhez csak a kivons mvelett kell ismernnk, s meg kell tudnunk hatrozni kt szm kztti relcikat (<, =). Az eljrs lnyege az, hogy a kt szm kzl a kisebbiket addig vonjuk ki nagyobbikbl, mg vgl a kt szm egyenl nem lesz2. Lssunk egy pldt: Legyen a = 42, b = 30. Ksztsnk egy tblzatot, melyben nyomon kvethet a mveletsorozat! a b mvelet 42 30 a = a b (mivel a a nagyobb, azt cskkentjk b-vel) 12 30 b=ba 12 18 b=ba 12 6 a=ab 6 6 A mveletsorozat vgn a = b = 6 lett az eredmny, ezrt LNKO(42;30) = 6. Prbljuk meg lerni, mit csinltunk! 1. Add meg a kt szmot! 2. Ha a egyenl b-vel, akkor megvan az LNKO, megllhatsz. 3. Klnben, ha a nagyobb, mint b, akkor cskkentsd a rtkt b-vel. Ha pedig b nagyobb, mint a, akkor b rtkt cskkentsd a-val! 4. Menj vissza a 2. pontra. Ez a lers nagy vonalakban megfelel, de azrt vannak vele problmk. Egyrszt terjengs, msrszt csak azok rtik, akik beszlnek magyarul, s nem is teljesen egyrtelm. (A 3. pontban a Ha pedig rthet gy is, hogy abban az esetben, ha 3. pont els mondata nem volt igaz, de gy is, ha igaz volt.) Adjuk meg ennl pontosabban az algoritmust!

Ennl hatkonyabb eljrs az n. euklideszi algoritmus. Vegyk szre, hogy egy egsz szmbl egy nla kisebb egsz szm tbbszri kivonsnak mveletsorozata helyettesthet egyetlen egszoszts mvelettel. Pl.: 23 4 4 4 4 4 = 3, a 23-bl 5-szr vontuk ki a 4-et, maradt a 3, vagyis 23 = 5 4 + 3. Egyszerbben lerva: 23 : 4 = 5, maradk: 3. Az euklideszi algoritmusban az a s b szmok klnbsge helyett osztsuk maradkt kpezzk (a nagyobbat elosztjuk a ksiebbel s a kapott maradkkal szmolunk tovbb). Ugyanazt az eredmnyt fogjuk kapni, mint a kivonsok sorozatval, de sokkal kevesebb lpsben.

13

ALGORITMIZLS ALAPJAI

2.3.4.2 A BhmJacopini-ttel
Figyeljk meg a fenti pldban, hogy az eljrsban hrom klnbz strukturlis szerkezet tallhat. a) Egyrszt az a s b rtkt felvltva, egyms utn vltoztatjuk. Annak nincs jelentsge, hogy az a cskkentse utn a b, vagy ismt az a rtkt kell-e cskkenteni, de a kivonsok mindig egyms utn s nem egyszerre trtnnek. (Csak azutn hajtom vgre pl. a harmadik kivonst, ha a msodikat mr befejeztem.) Azt mondjuk, hogy ezek a mveletek szekvencit alkotnak. b) Elfordulhat olyan eset, hogy gy r vget az algoritmus, hogy az eredeti rtkeken egyltaln nem kell vltoztatnunk. Ha a kt eredeti, bemen szmadat egyenl, akkor nincs semmi tennivalnk, kivlasztjuk az egyiket s az lesz az LNKO. gy a 2. pont azonnal egy dntst ignyel tlnk: kell-e brmit is csinlnunk, vagy kszen vagyunk? Mivel a vgrehajts sorn tbbszr is sorra kerl a 2. tevkenysg, ez lesz az a pont, amely vgl meglltja a vgrehajtst. (Brmely kt termszetes szmnak van legnagyobb kzs osztja. Legrosszabb esetben ez a szm az 1, ha a kt szm relatv prm.) Azt mondjuk, hogy a 2. mvelet egy elgazs vagy szelekci. Az ilyen esetekben mindig kt vagy tbb lehetsges vgrehajtsi lps (vgrehajtsi g) kzl vlasztunk ki egyet s azt hajtjuk vgre. A 3. pontban is elgazsokat ltunk. c) Az egsz eljrs egy mveletsorozat ismtlse. Addig kell ismtelve kivonnunk a nagyobbik szmbl a kisebbiket, amg egyenlk nem lesznek. Az ilyen ismtl szerkezet neve ismtls vagy iterci. (A programozsi nyelvekben az ismtls neve ciklus, s ciklusutastsokkal valsthat meg. Minden magas szint programozsi nyelv ismer legalbb egyfle ciklusszerkezetet, de ltalban tbbet is.) Az 1966-ban kt olasz matematikus, Corrado Bhm (1923) s Giuseppe Jacopini ltal publiklt cikk3 mutatja be azokat a kutatsi eredmnyeket, amelyeket azta az algoritmusok strukturlt lersnak egyik alaptteleknt hasznlunk. A ttelt Bhm Jacopini-ttelnek nevezik: Brmely algoritmust lerhatunk hrom alapstruktra segtsgvel: szekvencival, itercival s szelekcival. 4. kp Az eredeti cikk els oldala

5. kp

Corrado Bhm s Giuseppe Jacopini

A kvetkezkben az algoritmusok pontos megadsnak s lersnak nhny eszkzt ismerjk meg.

2.3.4.3 Mondatszer lernyelv, pszeudonyelv


A mondatszer lernyelv (pszeudonyelv, pszeudokd) a magyar (angol, stb.) nyelv szavainak, kifejezseinek segtsgvel, illetve szimblumok (, , stb.) hasznlatval rja le az algoritmus vezrlsi szerkezeteit, vgrehajtand mveleteit. Jl definilt, kizrlagos
3

C. Bhm, G. Jacopini: Flow diagrams, Turing Machines and Languages with only Two Formation Rules, Comm. of the ACM , 9(5). 1966, pp. 366371.

14

ALGORITMIZLS ALAPJAI

szabvny nem ltezik r, a hazai s nemzetkzi szakirodalom gyakorlatban kialakult egyfajta szintaxis kisebb-nagyobb eltrseket mutat a klnbz szerzk, kiadk mveiben. Jegyzetnkben minden algoritmust ezzel a ler eszkzzel mutatunk be. Ktetnkben a vezrlsi szerkezetek jellsre is magyar szavakat, kifejezseket fogunk hasznlni, de ebben a fejezetben bemutatjuk a tovbbi elterjedt jellsmdokat is. Bevezetsknt lssunk egy konkrt pldt. Tekintsk a korbban lert LNKO kiszmtsnak egy lehetsges, mondatszer lernyelven megadott algoritmust. eljrs LNKO be: A, B ciklus, amg A B ha A > B, akkor A = A B klnben B = B A // harmadik eset nincs elgazs vge ciklus vge ki: A eljrs vge Figyeljk meg a vezrlsi szerkezeteket! Az eljrs lnyegben hrom f rszbl ll. Az els rsz az input (be: A, B), a msodik rsz a szmtst vgzi, a harmadik rsz pedig az output (ki: A). Az eljrs kimenete termszetesen lehetne a B vltoz is, hiszen a ciklus lefutsa utn A s B egyenlk. A kzps rsz ciklusa addig fut, amg a kt vltoz rtke egyenl nem lesz. Ha a bemen rtkk eredetileg is egyenl (pl. A = B = 17), nincs tennivalnk, hiszen az LNKO is ez a szm lesz. A ciklus belsejben egy szelekcit ltunk. Ha A nagyobb B-nl, akkor A rtkt cskkentjk B-vel, ha nem nagyobb, akkor a B rtkt cskkentjk A-val. Egyenlk nem lehetnek, mert ha egyenlk lettek volna, mr kilptnk volna a ciklusbl. Ezt jelltk is az algoritmusban egy kommenttel. A komment (megjegyzs) a programoznak s nem a fordtprogramnak szl. A kommentek jellsre a klnbz programozsi nyelvek msms mdszert alkalmaznak. Jegyzetnkben mi a kommenteket // (per-per) jel mg fogjuk rni s minden esetben kurzvan szedjk. Az A = A B utasts egy rtkads, amely az algoritmusok s az imperatv nyelven rott programok egyik legfontosabb vgrehajthatutasts-tpusa. A vltoz rtket kap, vagyis a vltozhoz rendelt memriaterletre a vltoz tpusnak megfelel reprezentciban eltroljuk a vltoz rtkhez rendelhet bitkombincit. Az rtkads bal oldaln mindig egy vltoz ll, a jobb oldalon pedig egy kifejezs, amelynek kirtkelhet rtke van. A kirtkelhetsg azt jelenti, hogy az algoritmus adott pontjn a kifejezsben szerepl sszes vltoz deklarlt s rendelkezik rtkkel, illetve a kifejezsben szerepl operandusok s opertorok, illetve esetleges zrjelek rtelmezhet mveletet alkotnak s a mvelet elvgzsekor egyrtelm rtket adnak. A kifejezs lehet konstans, vagy llhat operandusokbl, opertorokbl s zrjelekbl. Operandus lehet konstans vagy vltoz, opertor lehet az adott adattpuson rtelmezhet mveleti jel (pl. 15

ALGORITMIZLS ALAPJAI szmok esetben +, , *, /). Zrjelezsre a klnbz programozsi nyelvekben jellemzen kerek zrjelet () szoktunk hasznlni. A zrjelek egymsba gyazhatk. A kifejezsek megadsa a programozsi nyelvekben leggyakrabban infix alakban trtnik, azaz az opertorok az operandusok kztt vannak elhelyezve. Jegyzetnkben a vltozk nevt nagybetsen szedjk. Ez eltrhet a ms irodalmakban megismert szablyoktl, s nem kveti az egyes magas szint programozsi nyelvekben hasznlt de facto szabvnyokat, illetve konvencionlis jellsmdot. (Magas szint forrskdokban nagybets szedssel az n. nevestett konstansokat (Pascal), ms nven szimbolikus llandkat (ANSI C) vagy konstansokat (C#) szoks jellni. A vltozk nevben csak kisbetket szoktak alkalmazni, kivve akkor, ha a vltoz neve tbb szbl ll. Mivel szkz nhny ritka pldtl eltekintve a programozsi nyelvek egyikben sem fordulhat el azonostban, az alhzs jel (_) pedig egyes nyelvekben specilis funkcival br, megszokott, hogy a tbb szbl ll vltozneveket szkz nlkl egyberjuk, de a szkezd betket nagyra cserljk, kivve az elst: pl. elemekSzma, gyflNeve, ellenrzSzmjegy, legnagyobbKzsOszt, stb.) Jegyzetnk azonban nem konkrt programozsi nyelvhez kszlt. Az algoritmusok trst ez a jellsmd nem befolysolja, de trskor figyelembe kell venni az adott nyelv szintaxisnak szablyait (pl. a magyar kezetes karakterek sok nyelvben nem hasznlhatk azonostkban). Pldk rtkadsra: A = 17 B = A * 2 C = (A + B) / (A B) KTPI = 6.28 SZVEG = "htf" Az A = A B rtkads azrt tnhet specilisnak, mert az egyenlsg bal s jobboldaln is szerepel az A vltoz. Ennek programozstechnikai szempontbl semmilyen jelentsge nincs, mert az rtkads jobboldala egy kirtkelhet kifejezs, s a kirtkels utn kapott rtk kerl a bal oldalon lv vltozba. A jegyzetben a vezrtlsi szerkezetek megadsra a kvetkez lernyelvi utastsokat fogjuk hasznlni: input: be: <vltoz1>, <vltoz2>, ... output: ki: <vltoz1>, <vltoz2>, ... elgazs: ha logikai kifejezs, akkor utasts1 [klnben utasts2] elgazs vge 16

ALGORITMIZLS ALAPJAI

A logikai kifejezs olyan kifejezs, amelynek logikai rtke {IGAZ, HAMIS} van. Ilyen kifejezseket sszehasonlt opertorokkal (<, , >, , =, ) s logikai opertorokkal (NEM, S, VAGY), illetve zrjelekkel adhatunk meg. Abban az esetben, ha a megadott logikai kifejezs rtke igaz, akkor az utasts1-et hajtjuk vgre. Ha a logikai kifejezs rtke hamis, s adtunk meg klnben-gat, akkor az utasts2-t hajtjuk vgre. Az utasts1 s utasts2 brmilyen utasts lehet: vgrehajthat utasts, jabb elgazs, ciklus, stb. A klnben-gon jellt szgletes zrjelek ([ ]) azt jelentik, hogy a vezrlsi szerkezetben ez a rsz opcionlis, teht nem ktelez megadni. A klnbz programozsi nyelvek ltalban nem csak ktirny feltteles elgazst kezelnek, hanem n. esetsztvlaszt elgazsokat is (Pascal: CASE OF; C, C#, Java: switch). Jegyzetnkben ezektl eltekintnk, s minden algoritmusban csak ktirny feltteles elgazst fogunk hasznlni. elfeltteles vagy elltesztel ciklus: ciklus, amg logikai kifejezs utastsok ciklus vge A logikai kifejezs itt is egy logikai rtkkel br, kirtkelhet kifejezs, ez a ciklus felttele. A ciklusmagban lv utastsokat addig ismteljk, amg a ciklusfejben megadott ciklusfelttel igaz. Ha az els lefuts eltt a ciklusfelttel hamis, akkor a ciklus magja egyszer sem fut le, ilyenkor res ciklusrl beszlnk. Az elfeltteles ciklus vlhat vgtelenn, ha a ciklusmagban nem gondoskodunk arrl, hogy a ciklusfelttel egyszer hamiss vljon. Ilyenkor a ciklusbl sosem lpnk ki. Ez szemantikai hiba. (A ciklus vgtelenn vlsa nem azonos a fajta szerinti vgtelen ciklussal. A vgtelen ciklus olyan ciklus, amelynek sem a fejben, sem a vgben nem adunk meg felttelt sem az ismtlsre, sem a befejezesre. Az ilyen ciklusokbl a ciklusmagban elhelyezett befejeztet/kiugr pl. EXIT utastsokkal lehet kilpni. Ilyen vgtelen ciklusokat alkalmaznak pl. opercis rendszerekben, de jegyzetnk trgyba ezek a ciklusok nem tartoznak bele, gy hasznlatukat kerlni fogjuk.) vgfeltteles, utfeltteles vagy htultesztel ciklus: ciklus utastsok amg logikai kifejezs A htultesztel ciklus felttelt a ciklus vgben helyezzk el. Ez a felttel lehet pozitv vagy negatv, vagyis jelentheti az ismtls (a ciklusban marads) vagy a kilps felttelt is. Jegyzetnkben minden esetben a ciklusban marads felttelt fogjuk megadni az ilyen ciklusoknl. Ez a ciklusszerkezet lnyegesen eltr az elfeltteles ciklustl annyiban, hogy ez a ciklus nem lehet res. Ha a ciklus felttele az els lefuts eltt hamis (teht kilptet a ciklusbl), a ciklusmag egyszer akkor is lefut. A ciklus magja egyszer mindenkppen lefut, mert csak az els lefuts utn rtkeljk ki a ciklus felttelt. 17

ALGORITMIZLS ALAPJAI Ha a ciklusmagban nem gondoskodunk arrl, hogy a ciklusmagot gy vltoztassuk meg, hogy kilptessen a ciklusbl, akkor a vgfeltteles ciklus is vlhat vgtelenn. szmll ciklus: ciklus <vltoz> = kezdrtk-tl vgrtk-ig utastsok ciklus vge A szmll ciklusban az els lefuts eltt a vltoz (ciklusvltoz) felveszi a kezdrtket, majd az utastsok vgrehajtdnak. Ezutn a ciklusvltoz rtke automatikusan megn eggyel, s ha az aktulis rtk mg nem haladja meg a vgrtket, akkor a mag ismt lefut. A ciklus addig ismtel, amg a ciklusvltoz rtke meg nem haladja a vgrtket. A klnbz programozsi nyelveket sszehasonltva a szmll ciklus szintaxisa jelentsen klnbz lehet. Vannak nyelvek, amelyek a fenti szintaxis ciklust nem ismerik, de hasonlt igen(pl. C, C#, Java). Vannak nyelvek, amelyek ismerik a fenti szerkezetet, de a lpskz csak 1 lehet (pl. Pascal). Vannak nyelvek, amelyekben megadhat lpskz (pl. klbz BASIC-ek). Az egyes programozsi nyelvekben a vgrtk helyett clszerbb a hatr kifejezst hasznlnunk, mert ha megadhatunk lpskzt, akkor nem biztos, hogy a ciklusvltoz fel is veszi a hatrknt megadott rtket. Pl. ha a kezdrtk 5, a lpskz 3, a hatr 12, akkor a ciklusvltoz ltal felvett rtkek a kvetkezk: 5, 8, 11. A 12-t nem veszi fel, vagyis vgrtkrl itt nem beszlhetnk. Jegyzetnkben a szmll ciklusoknl ltalban nem jellnk lpskzt. Ahol nem jellnk, ott a lpskz mindig +1 lesz. Abban az egy-kt esetben, ahol mgis jellni fogjuk, a lpskz 1 lesz. A szmll ciklus is lehet res, ha a megadott kezdrtktl a megadott irnyban a vgrtkig (hatrig) nincs egyetlen felvehet rtk sem. Ilyen ciklusokat azonban a jegyzetnkben nem fogunk hasznlni. itertor (bejr) ciklus: // C# foreach (elem in adatszerkezet) { utastsok } // Java for (vltoz : adatszerkezet) { utastsok } // PHP foreach ($adatszerkezet as $vltoz) 18

ALGORITMIZLS ALAPJAI

{ utastsok } // Javascript for (vltoz in adatszerkezet) { utastsok } Ezt a ciklusszerkezetet gyakran alkalmazzk az jabb programozsi nyelvek. A lnyege, hogy a ciklus az adatszerkezet sszes elemre lefut. A fejben megadott vltoz felveszi az adatszerkezet sszes rtkt s a ciklus magja az sszes rtkre lefut. Az adatszerkezet lehet tmb, de ms is (az egyes nyelvekben eltr tpus adatszerkezetek tmogatottak). Tmb esetn nem kell kezelnnk az elemek indext, s nem kell tudnunk azt sem, hogy hny elem a tmb, mert a vezrlsi szerkezet helyettnk kezeli ezeket. Mivel ez a vezrlsi szerkezet csak bizonyos programozsi nyelvekben fordul el4, s jegyzetnk a legtbb algoritmust vektorok alkalmazsval adja meg, melyekben egyszer az elemek elrse az indexkkel, a jegyzet tovbbi rszben nem fogjuk alkalmazni az itertor ciklust. Amint arrl korbban mr szltunk, ez a jellsmd rszben nknyes, de a szakirodalmoban ltalban hasznlt szablyokat kveti. Pldaknt bemutatunk az LNKOalgoritmusra egy msik szimblumrendszert alkalmaz peszudokddal megadott vltozatot is, ez inkbb hasonlt a nemzetkzi szakirodalomban alkalmazotthoz:
LNKO

1 2 3 4 5 6 7

ax by while a b do if a > b then a a b else b b a print a

Ebben a pszeudokd-szintaxisban rtkads, feltteles elgazs (if then else) s ktfle ciklus (while do s for <vltoz> ltezik. Vgrehajthat utastsknt egyedl az rtkads rendelkezik sajt szimblummal: <vltoz> kifejezs. Minden egyb mveletet szvegesen kell lerni, ennek nyelve s szintaxisa a klnbz irodalmakban eltr (ltalnos az angol nyelv). A fenti pldban nem input s output mveletet rtunk, hanem a-nak s b-nek x s y kezdrtket adtunk. Ez nem befolysolja az algoritmus trhatsgt, a lnyeg, hogy az a s b vltozk valahonnan kezdrtket kapjanak. Az input s output utastsok egybknt is nagyon klnbz mdon vannak
4

A fentieken kvl tallkozhatunk vele pldul az ActionScript, az Ada, az Objective C, a Delphi, a Perl, a Python, a Ruby s a Visual Basic .NET nyelvekben.

19

ALGORITMIZLS ALAPJAI implementlva a klnbz programozsi nyelvekben. Vannak olyan nyelvek, ahol kulcsszavakkal trtnik az I/O, de jellemzbb, hogy az I/O utastsok nem kpezik a nyelv rszt, hanem unitokban, vagy osztlyokban vannak definilva.

2.3.4.4 Folyamatbra, D-diagram


Folyamatbrkkal grafikus mdon rhatk le az algoritmusok. A folyamatbrk skidomokbl illetve az azokat sszekt nyilakbl llnak. A vgrehajtsi sorrendet a nyilak hatrozzk meg. A skidomok alakja jelli az egyes vezrlsi szerkezetek s vgrehajthat utastsok tpust. Folyamatbrkkal nemcsak informatikai algoritmusoknl tallkozhatunk. Minden olyan esetben szeretettel alkalmazzk ket, amikor valamilyen mveletsort rnak le, s lnyeges, hogy az egyes lpsek milyen sorrendben kvessk egymst. (Ez vglis az algoritmusok lnyege.) Tallkozhatunk folyamatbrkkal lapraszerelt btorok sszelltsi tmutatjban, minsgellenrzsi feladatoknl, vszhelyzeti tmutatban, stb. Ezek a folyamatbrk azonban gyakran elg kuszk a sok nyl miatt. Informatikai algoritmusok megadsnl nagyon fontos az egyszersg, az ttekinthetsg s az egyrtelmsg, ezrt az ilyen algoritmusok megadshoz n. D-diagramokat hasznlunk. A D bet Dijkstra5 nevre utal, aki elsknt adott egy szkebb jellsi rendszert a folyamatbrk megadsra. A jellsi rendszer legfontosabb szablya, hogy minden skidomnak egyrtelmen csak egy tovbblpsi ga van. Ez all egyedl a program vgt jell szimblum a kivtel, amely meglltja a vezrlst. 6. kp Edsger Wybe Dijsktra

Az albbiakban a folyamatbrk D-diagram-elemeit mutatjuk be. A folyamatbra kezd szimbluma a startszimblum, utols eleme pedig a stopszimblum. Mindkettt ellipszis jelli. A startszimblumnak nincs megelz, a stopszimblumnak nincs rkvetkez eleme. 7. kp Start- s stopszimblum folyamatbrban

A szekvencia egyes lpseit tglalapok jellik. A lpsek sorrendjt a nyilak jellik ki. 8. kp Szekvencia D-diagram

A szekvencia a vrehajthat utastsok lpseinek meghatrozott sorrend sorozata. Elfordul azonban olyan eset, amikor az algoritmus felrshoz, vagy megrtshez nem
5

Edsger Wybe Dijkstra (19302002) holland matematikus, informatikus. Szmos fontos s mig hasznlt algoritmus s mdszer kidolgozja (pl. Dijkstra-algoritmus a legrvidebb t meghatrozshoz egy adott csompontbl irnytott grfokban, Dijkstra-szemaforok tbbszl programokban a szlak szinkronizlshoz).

20

ALGORITMIZLS ALAPJAI

szksges, hogy minden egyes vgrehajthat lpst teljes rszletessggel elemezznk. Pldul ha egy olyan algoritmust ksztnk, amely tartalmazza egy adatbzis feltltst, illetve az egyes lehetsges lekrdezsek eljrsait is, akkor nem biztos, hogy az adatrgzts minden egyes lpst szksges rszletesen szerepeltetni a folyamatbrban. (Ha a dokumentciban szerepel, hogy milyen adatokat kell rgztennk, ezek milyen adattpusak, hol kell ket trolni, stb., akkor szinte biztos, hogy szksgtelen ezeket az informcikat a folyamatbrban jra szerepeltetni.) Ilyen esetekben ahelyett, hogy rszletesen kifejtennk a lpseket, egyetlen skidommal jelljk a nem elemi lpst az algoritmusban. Ez egy tglalap, melynek rvidebb oldalait dupla vonallal jelljk. 9. kp Szekvencia nem elemi utastssal

Az input s output utastsok jellsre kln skidom, a paralelogramma szolgl. 10. kp Input s output

Az elgazsok jellsre sarkra lltott ngyszget (ngyzet, rombusz, deltoid, stb.) hasznlunk. Az elgazsba egy irnybl lphetnk be, de kt lehetsges irnyban lphetnk ki belle. Az elgazst jell ngyszgbe kerl a felttel. Ha a felttel igaz, akkor az egyik gat, ha hamis, akkor a msik gat kell vlasztanunk. 11. kp Elgazs D-diagram

A feltteles ciklus jellsre nincs kln skidom, elgazs s szekvencia, illetve az ket sszekt nyilak segtsgvel rjuk fel ket. 12. kp Elfeltteles ciklus D-diagram

13. kp

Vgfeltteles ciklus D-diagram

2.3.4.5 Struktogram
Szintn grafikus algoritmusler eszkz. A szakirodalomban tallkozhatunk vele NassiShneiderman-diagram6 (NSD), illetve Chapin-bra7 (Chapin chart) nven is. 14. kp Isaac Ike Nassi s Ben Shneiderman

Isaac Ike Nassi s Ben Shneiderman (1947) informatikusok ltal 1972/73-ban kifejlesztett eszkz. I. Nassi and B. Shneiderman: Flowchart Techniques for Structured Programming. In: ACM SIGPLAN Notices, Volume 8, Number 8 (August 1973), pp.1226. 7 Ned Chapin: New Format for Flowcharts. In: Software Practice and Experience, Volume 4, Number 4 (October-December 1974), pp. 341357.

21

ALGORITMIZLS ALAPJAI 15. kp Ned Chapin

A struktogramok a klnbz tevkenysgeket tglalapokkal jellik. Maga az algoritmus is egy tevkenysg, gy ezt is egy tglalap jelli. Az algoritmus lpseit ezen a tglalapon bell elhelyezett kisebb tglalapok jelentik. Szekvencia: 16. kp Szekvencia a struktogramban

Az elgazs lpsnek tglalapjt tbb skidomra bontjuk. Ha a felttel igaz, akkor az igaz ghoz tartoz tglalap lpst hajtjuk vgre, ha hamis, akkor pedig a hamis ghoz tartoz lpst. 17. kp Elgazs a struktogramban

A ciklus jellsre az adott tglalapon bell elhelyezett kisebb tglalap szolgl. A bels tglalapba kerl a ciklus magja, al/fl pedig az ismtls felttele. Fl akkor, ha a ciklus elfeltteles, al pedig akkor, ha a ciklus vgfeltteles. 18. kp Ciklusok a struktogramban

2.4 SSZEFOGLALS
Az algoritmusok egy feladat, problma megoldsnak lpseit, vagyis a megolds mdszernek pontos lerst adjk. Az algoritmusokkal szemben tmasztott kvetelmnyekrl a lecke elejn mr olvashattunk, de a lecke vgigolvassa utn levonhat, hogy a legfontosabb kvetelmnyek a pontossg s az egyrtelmsg. A leckben bemutatott algoritmusler eszkzket a szakirodalomban hasznlt szablyok alapjn ismertettk, de kisebb-nagyobb eltrsek a klnbz szakirodalmak jellsmdjban elfordulhatnak. A legfontosabb kvetelmny itt is az, hogy egyrtelmen s pontosan rtelmezhet legyen az egyes lpsek feladata s a lpsek kztti sorrend.

2.5 NELLENRZ KRDSEK


rtelmezze az algoritmus fogalmt! Milyen kvetelmnyeket fogalmazhatunk meg az algoritmusokkal szemben? 2. Mutassa be az algoritmusler eszkzket! Milyen mdon adhatk meg a vezrlsi szerkezetek a klnbz algoritmusler eszkzkben? 3. Hasonltsa ssze az el- s vgfeltteles ciklusokat! Milyen ciklus lehet res? Milyen ciklus vlhat vgtelenn? 4. Adja meg nhny, eddigi (kzp- s felsfok) tanulmnyai sorn megismert mvelet, tevkenysg algoritmust! Milyen krlmnyekre kell figyelnie?
1.

22

ALGORITMIZLS ALAPJAI

2.6 GYAKORL TESZTEK

23

ALGORITMIZLS ALAPJAI

3. LECKE: ADATOK, ADATSZERKEZETEK


3.1

CLKITZS

Ebben a leckben az algoritmusokban, illetve a programokban hasznlt adatok megjelensi formirl, adattpusokrl s adatszerkezetekrl fogunk beszlni. A lecke clja, hogy megismerjk az elemi s az sszetett adatok trolsi s feldolgozsi lehetsgeit, az adattpusok s az adatszerkezetek jellemzit. Algoritmusok ksztsnl fontos, hogy felismerjk, milyen adattpus vagy adatszerkezet a legalkalmasabb az adott problma megoldshoz. 3.2

TARTALOM
Adat Literl Vltoz Adatok jellemzi, adattpusok sszetett adatok kezelsnek lehetsgei Adatszerkezetek jellemzi Homogn adatszerkezetek: tmb, halmaz, sor, verem, lista, fjl A rekord adatszerkezet Adatok s adattpusok megjelense a klnbz programozsi nyelvekben, pldk

3.3 A TANANYAG KIFEJTSE


3.3.1 Adat

Tgabb rtelemben minden jel adatnak tekinthet. Az adatok segtsgvel informcit kzlhetnk, a kommunikciban az adat hordozza az ismereteket, de nem nmagban. Informciv akkor vlhat egy adat, ha az j ismeretknt rtelmezhet. Az adatok eszerint olyan jelsorozatok, amelyek alkalmasok arra, hogy emberi vagy gpi kommunikciban informcikat kzvetthessenek. Ehhez a jeleknek rzkelhetknek, szlelhetknek, feldolgozhatknak s megrthetknek kell lennik. Szkebb rtelemben, s a szmtstechnikban ltalban az adatok szmokkal lert dolgokat jelentenek. Kzismert, hogy a szmtgpek az adatok trolsakor lnyegben minden dolgot kettes szmrendszer, azaz binris jelsorozatokk alaktanak. Azrt ppen binriss, mert a kettes szmrendszerben mindssze ktfle jelet hasznlunk, a 0-t s az 1et. Ktfle szmjegyhez sokkal egyszerbb egyrtelmen megklnbztethet fizikai llapotokat rendelni, mintha tbbfle szmhoz kellene ugyanezt megtennnk. Ugyanakkor tudjuk azt is, hogy brmilyen adat talakthat kettes szmrendszerbeli jelsorozatokk. A termszetes szmok egyszer konverzival, az eljeles, esetleg nem egsz szmok klnbz algoritmusokkal8, a szveges adatok klnfle karakterkdolsok9
8

Az rdekldk szmra javasoljuk, hogy nllan ismerkedjenek meg a fixpontos s lebegpontos aritmetike alapjaival. Ezekrl a nem klnsebben bonyolult eljrsokrl szmos irodalomban olvashatunk. 9 Jrjunk utna, hogy milyen kdtblkon alapul karakterkdolsi eljrsok hasznlatosak ma. Jrjunk utna az ASCII kdrendszer, illetve az azon alapul ms kdrendszerek (pl. ISO-8859 szabvnycsald kdolsai)

24

ALGORITMIZLS ALAPJAI

alkalmazsval, hangok, ll- s mozgkpek pedig digitalizlssal. A digitalizls nem egyetlen eljrst jelent, a klnbz mdiumtpusok esetn szmos eljrs ismeretes. Ezek ismertetse azonban nem tartozik jegyzetnk trgykrbe. Most lssuk, hogy milyen mdon fordulhatnak el adatok algoritmusainkban, programjainkban. 3.3.2 Literlok

A programokban, algoritmusokban elfordul szmokat, karaktereket s szvegeket literloknak nevezzk. Literlok lehetnek pldul: 42, 173.51, "c", "szerda", 1989. oktber 23. Ezek olyan adatok, amelyek nmagukat jelentik, rtkk, tpusuk, jelentsk lland. Nem tudjuk, hogy minek a mennyisgt jelli a 42 jelsorozat, de mindenki szmra nyilvnval, hogy ez egy ktjegy, decimlis (tzes szmrendszerbeli) egsz.10 Nem tudjuk, hogy milyen halmaz szmossgt jelenti (pl. milyen trgybl van negyvenkett), de tudjuk, hogy ez az sszes negyvenkt elem halmaz egyetlen kzs tulajdonsga, s a nagysgrendjt is rzkeljk: tbb, mint t, de kevesebb, mint szzhsz. Hasonl a helyzet a 173.51 esetben, ez nagy valsznsggel egy negatv, vges tizedes trtet, vagyis egy racionlis szmot jell. Azt ebben az esetben sem tudjuk, hogy pontosan milyen dolognak a mrszmrl van sz, de valsznleg mindenki egy mennyisgre gondol, ha ezt a jelsorozatot ltja. A "c" egy latin bet, a magyar bc negyedik betje, a fizikban a fny vkuumbeli sebessgt jellik vele. Ha egy res lapon nmagban ltjuk ezt a jelet, valsznleg nem fogunk neki semmilyen jelentst tulajdontani, azon tl, hogy ez egy c bet. Hasonlkpp a "szerda", amely egy karaktersorozat s magyar nyelven a ht egyik napjnak neve, illetve az utols plda, amely egy dtum. (Szmunkra azrt fontos, mert akkor kiltottk ki a harmadik magyar kztrsasgot, egy kldldi szmra azonban valsznleg jelentktelen naprl van sz). A szmliterlok mennyisgeket, a karakterliterlok betket (pontosabban karaktereket, vagyis a kdtbla egy-egy elemt) jellnek, a szvegliterlok pedig karaktersorozatokat. Ezek az adatok csak nmagukat jelentik, az rtkk vltozatlan, de alkalmasak arra, hogy mveleteket vgezznk velk, illetve rajtuk. A klnbz programozsi nyelvekben eltr szablyok vonatkozhatnak a literlok megadsra. Szmliterlokban szmjegyek, eljel s tizedespont llhat. A klnbz programozsi nyelvekben hasznlhatunk tzestl eltr alapszm szmrendszerbeli szmliterlokat is, teht nemcsak decimlis, hanem pl. binris, oktlis vagy hexadecimlis szmliterlokat is. A karakteres literlok megadsa is klnbzhet az egyes programozsi nyelvekben. Ezeket vagy aposztrfok (), vagy macskakrmk ("") kztt kell megadnunk (Pascalban pl. minden karakter- s sztringliterlt aposztrfok kztt, a C-szer nyelvekben
jellemzinek. Jrjunk utna, hogy mi a jelentsge a UNICODE szabvnynak, s mit jelent az UTF-8 kdols, amely a UNICODE rendszer egyik gpi megvalstsa! 10 Valjban ez egyltaln nem ennyire egyrtelm. nmagt tekintve ez a jelsorozat mg azt sem garantlja, hogy egy mennyisgrl van sz. Elkpzelhet, hogy ez egy ktszavas zenet, amelynek els szavt a 4, msodik szavt a 2 helyettesti. Ahhoz, hogy ezt megfejtsk, szksgnk van egy sztrra, egy kulcsra, egy kdtblra. Mindemellett azonban valszn, hogy mindannyiunk szmra inkbb az a termszetes, hogy a 42 jelsorozat egy pozitv egsz szmot jelent, tzes szmrendszerben.

25

ALGORITMIZLS ALAPJAI a karakterliterlokat aposztrfok, a sztringliterlokat macskakrmk kztt, mg a klnbz BASIC-nyelvjrsokban mindkt literltpust ltalban macskakrmk kztt). Jegyzetnk mondatszer lernyelven megadott pldiban mi minden karakter- s sztringliterlt macskakrmk kztt fogunk megadni. 3.3.3 Vltozk

A 2.3.4 fejezetben bemutatott LNKO-pldban hasznltunk kt jelet, a-t s b-t, hogy szmokat helyettestsnk velk. A feladat kirsban azt is jelltk, hogy ezek a szimblumok termszetes szmokat jellnek, vagyis meghatroztuk, hogy milyen rtkkszletbl vehetnek fel rtkeket. Hasonl eszkzket ltalnos iskols korunktl kezdve hasznltunk matematika, fizika s egyb termszettudomnyos tanrkon. Minden matematikarettsgin tallkozhatunk ilyen jelleg feladatokkal: Oldja meg az albbi msodfok egyeneletet x Z + esetn!

3 x 2 + 7 x 15 = 0
A fenti egyenletben tallhat x szimblum egy (pontosabban nulla, egy vagy kt) szmot jell. Azt, hogy milyen rtke(ke)t vehet fel, az x Z + szabllyal kiktttk. Az x1 s x 2 gykket ki tudjuk szmtani a msodfok egyenlet megoldkpletvel, de mivel ezek jelen esetben nem egszek, azt mondjuk, hogy ennek az egyenletnek a megadott rtelmezsi tartomnyban nincs megoldsa. A 2.3.4 fejezet pldjban az a s b, illetve a fenti pldban x tekinthetk vltozknak. A vltoz egy olyan eszkz, amely valamilyen rtket helyettest. Ez az rtk nem lland, meg is vltozhat, innen szrmazik az eszkz elnevezse. Az LNKO-pldban a s b rtkt tbbszr cskkentettk, teht a vagy b az algoritmus vgrehajtsa sorn minden lps utn j rtket kapott, egszen addig, amg egyenlk nem lettek. Az rtkk teht vltozott, de a vgrehajts egy adott pillanatban mindig egy konkrt rtket jelltek. Imperatv programozsban a vltozknak nagyon fontos szerepe van. A programoz ezen eszkzk segtsgvel tudja elrni, illetve megvltoztatni a memriban trolt adatokat. ppen ezrt a vltozk az algoritmizlsban is fontos szerepet kapnak. A vltozk olyan programozsi eszkzk, amelyek ngy fontos jellemzvel rendelkeznek.

3.3.3.1 Nv
A vltoz neve egy azonost. Minden programozsi nyelv vilgosan definilja, hogy egy vltoz milyen nevet kaphat, azaz milyen karaktersorozatbl llhat az azonostja. ltalban elmondhat, hogy a programozsi nyelvek tbbsge szerint az azonost egy olyan karaktersorozat, amely betvel kezddik s betvel vagy szmjeggyel folytatdhat. Ez a definci nem tnik bonyolultnak, de ha figyelembe vesszk, hogy a klnbz programozsi nyelvek milyen jeleket tekintenek betknek, akkor mris nehezebb krdssel llunk szemben. Nem clunk a klnbz programozsi nyelvek szintaktikai szablyrendszernek sszehasonltsa, ezrt itt csak annyit runk a krdsrl, hogy mg a rgebbi programozsi nyelvek tbbnyire ASCII-kdolst hasznltak, ezrt elssorban az angol bc huszonhat kis- s nagybetjt tekintettt betnek, a mai programozsi nyelvek jelents rsze UNICODE kdols, gy nemcsak az angol nyelvben 26

ALGORITMIZLS ALAPJAI

hasznlt jelek tekinthetk bennk betnek. Fontos krds tovbb az, hogy az kis- s nagybetk azonos jelentsek-e (vagyis klnbsget tesz-e kis- s nagybetk kztt a nyelv, ha azonostban hasznljuk ket), s mg szmos tovbbi krds. Az azonostkban hasznlhat szmjegyek egyrtelmen csak decimlis szmjegyek lehetnek. Mivel az algoritmusok nem felttlenl (st, tbbnyire nem) kapcsolhatk egyetlen programozsi nyelvhez, ezrt az algoritmusokban hasznlt vltozk elnevezsei nem minden esetben kvetik az egyes nyelvek szablyrendszert. Ezzel kapcsolatosan rszletesebben lerst adtunk a 2.3.4.3 fejezetben.

3.3.3.2 Jellemzk
A vltozk legfontosabb jellemzi az adattpusuk, illetve hogy a program egyes rszeiben hogyan viselkednek. Az adattpus egy rtkhalmazhoz rendelt nv. A viselkedssel, mint jellemzvel kapcsolatosan emltend fogalmak a lthatsg s az lettartam, de mivel ez elssorban programozsi krds, jelen jegyzetben csak rintlegesen trgyaljuk. A vltozk adattpusa elssorban azt hatrozza meg, hogy az rtkket milyen rtkkszletbl vehetik fel. A numerikus tpus vltozk rtkei szmok lehetnek. Ez tg fogalom, hiszen a matematikban is klnbz szmhalmazokat ismernk: termszetes szmok, egszek, racionlisak, irracionlisak, vals szmok, komplex szmok. A klnbz programozsi nyelvekben ltalban tbbfle numerikus tpus rendelhet vltozkhoz. Minden nyelv tmogatja az egsz s a vals tpusokat, s jellemzen nincs kln tpus az irracionlis szmokra. Ha vgiggondoljuk, ez logikus. Az irracionlis szmok halmazban olyan szmok tallhatk, amelyek nem rhatk fel kt egsz szm hnyadosaknt. Ezeket a szmokat vgtelen tizedes trtknt rhatnnk fel, pontos lersuk azonban nyilvnvalan lehetetlen, hiszen vgtelenek. Ezeket a szmokat csak bizonyos 2 , s pontossggal tudjuk megadni. Kzismerten ilyen szmok a , az e, a folytathatnnk. (A szmegyenesen tbb irracionlis szm van, mint racionlis. Ennek a ttelnek a bizonytsa termszetesen nem tartozik jegyzetnk trgykrbe.) Ha pontosan akarnk megadni az rtkket, vgtelen szmjegyet kellene megadnunk, a szmtgp memrijban vagy httrtrn pedig vgtelen szmjegyet kellene eltrolnunk. Az informatikai troleszkzk trolkapacitsa folyamatosan n, de vgtelen termszetesen soha sem lesz. gy brmekkora merevlemezen trolnnk is egyetlen irracionlis szmot, csak bizonyos pontossggal tehetnnk meg azt. Az informatikban az adattrols jellemzen a vges mennyisgek krben alkalmazott tudomny. Termszetesen ms krds az, hogy mely elmleti vagy alkalmazott tudomnyoknak van szksge az irracionlis szmok nagypontossg trolsra, s egzakt mdon mit jelent a nagypontossg kifejezs. Numerikus tpusokon kvl a legtbb programozsi nyelv tmogat karakteres tpusokat (karakter, karakterlnc), sok nyelvnek van sajt tpusa a logikai rtkek trolsra, mg ms nyelvekben a logikai rtkek numerikus rtkekkel vannak reprezentlva. Elemi adattpusoknak nevezzk az elemi adatok trolsra szolgl tpusokat. Elemi adatok azok az adatok, amelyeket nem lehet, vagy az adott feladat szempontjbl nem rdemes kisebb rszekre bontani. A szemlyes adataink kztt elemi adat pldul a 27

ALGORITMIZLS ALAPJAI nemnk, vagy a szletsi vnk (br az vszzad, mint ennek rsze akr kln adatknt is rtelmezhet lehet). Elemi adat a lakhelynk irnytszma, vagy a cmnkbl hzszm. sszetett adatoknak nevezzk azokat az adatokat, amelyek elemi adatokbl plnek fel. Szemlyi adataink kzl jellemzen ilyen a lakcm, hiszen az felbonthat irnytszmra, helysgnvre, kzterlet nevre s tpusra, hzszmra, emeletre, ajtra, stb. sszetett adat lehet egy nv is, ha szksges, hogy kln kezeljk a vezetknevet s a keresztneve(ke)t. Az sszetett adatok kezelsre a programozsi nyelvekben s algoritmusainkban adatszerkezeteket hasznlunk. Ha egy vltoznak megadtuk az adattpust, kijelltk, hogy milyen rtkkszletbl vehet fel rtkeket. Emellett azonban kt tovbbi dolgot is meghatroztunk. Az adattpus meghatrozza azt is, hogy milyen mveletek vgezhetk az adott adaton. Numerikus adatokon vgezhetk pl. alapmveletek, nhny kivtellel (pl. nullval val oszts), mg keresztnevek hnyadosnak kiszmtsa rtelmezhetetlen mvelet. A msik dolog inkbb programozsi krds. Az adattpus meghatrozsval eldl az is, hogy az adott adatot milyen reprezentciban tallhatjuk meg a memriban. Az egsz szmokat fixpontos szmbrzolssal alakthatjuk a memriban trolhat alakra. Vals szmokat lebegpontos szmbrzols segtsgvel alakthatunk trolhat formtumv. Szvegek trolshoz kdtblkat hasznlunk: a szveget karakterekre bontjuk, s a karakterek kdjt troljuk a memriban. A tpus teht a trbeli reprezentcit is meghatrozza. Az algoritmizls tmakrtl azonban ez utbbi krds viszonylag tvol esik.

3.3.3.3 Trbeli cm
Az adatokat a memria trolja. A memriban minden egyes trcmen egybjtos adatokat trolhatunk. A trcmek n. szegmentlt cmzssel adhatk meg. A memrit ilyen mdon nagyon bonyolult feladat kezelni. Magunknak kell megoldani az egyes adattpusok s adatszerkezetek reprezentlst, s magunknak kell nyilvntartani azt is, hogy az egyes adatainkat milyen memriaterleten troljuk, illetve hogy az egyes memriaterleteken milyen adatok rhetk el. 19. kp Vltozk trbeli cme

A magas szint, elssorban procedurlis nyelvekben a vltozk azrt alapvet jelentsgek, mert segtsgkkel a szegmentlt memriakezels nlkl is tudunk adatokat kezelni. Vltozk segtsgvel lnyegben az egyes memriaterleteknek adhatunk nevet. A magas szint nyelvekben ha egy vltozt deklarlunk (megadjuk nevt s tpust), akkor a nyelv automatikusan lefoglal egy az adott vltoz szmra megfelel mret memriaterletet. Ha ezutn a vltoznak rtket adunk, az adott rtk a vlasztott tpusnak megfelel reprezentciban bekerl a megadott cmre, ha a vltoz rtkt szeretnnk felhasznlni, akkor pedig a rendszer a vltozhoz rendelt memriaterletrl olvassa ki az ott trolt adatot, s alaktja az adott tpusnak megfelel kdols felhasznlsval a programoz ltal rtelmezhet formtumra.

28

ALGORITMIZLS ALAPJAI

3.3.3.4 rtk
A deklarcitl kezdve minden vltoz rendelkezik cmkomponenssel. Mivel a memriban nincsenek res terletek (lehet, hogy egy trcmen 0-s rtk van trolva, de az a cella sem res!), a szmtgp bekapcsolstl kezdve a memria minden terletn van valamilyen adat, a vltozk a deklarci pillanattl kezdve rtkkel is rendelkeznek. Rgebbi programozsi nyelvekben ez azt is jelentette, hogy ha a programoz deklarlt egy vltozt, de annak nem adott rtket, akkor a vltoz rtke nemdeterminisztikus volt, vagyis brmilyen memriaszemt lehetett az rtk. Egyes nyelvekben ezt a problmt automatikus kezdrtk-adssal orvosoltk: a deklarci pillanatban a vltoz valamilyen nulls kezdrtket kapott (0-s numerikus rtk, res karakterlnc, stb.). Ms nyelvekben egy vltoz rtkt csak akkor hasznlhatjuk fel, ha mi magunk adtunk mr neki rtket. 3.3.4 sszetett adatok, adatszerkezetek

Szemlyes adataink kztt tipikusan sszetett adat a lakcmnk, hiszen ez elemi adatokra bonthat. sszetett adat iskolai osztlynvsor, egy knyv adatai egy irodalomjegyzkben, stb. Az sszetett adatok trolsra s feldolgozsra a magas szint programozsi nyelvekben adatszerkezeteket hasznlhatunk. Adatszerkezetekkel ezrt algoritmusok kapcsn is fontos foglalkoznunk. Az adatszerkezetek csoportostsnak ktfle alapja lehetsges.

3.3.4.1 Adatszerkezetek fajti a trolt elemek tpusa szerint


Vizsglnunk kell, hogy az adott adatszerkezetet alkot elemi adatok tpusa megegyez-e, vagy az adatszerkezetben klnbz tpus elemi adatok tallhatk. Ha az adatszerkezetet alkot elemi adatok azonos tpusak, akkor homogn adatszerkezetrl beszlnk, ha az adattpusok klnbz(het)nek, akkor pedig inhomogn vagy heterogn adatszerkezetet hasznlunk. Homogn adatszerkezetek pl. a tmb, halmaz, sor, verem, lista, fa, hl, fjl, heterogn adatszerkezet pedig a rekord. A sztring (karakterlnc) tekinthet elemi adatnak s adatszerkezetnek is. Vannak olyan programozsi nyelvek, amelyekben nem ltezik ez az adattpus. Azokban a nyelvekben, amelyek tmogatjk a sztring tpust, ltezik eszkz a karakterlnc elemeinek (vagyis az egyes karaktereknek) az elrsre is. Ebbl a szempontbl a szting rtelmezhet egy karakterekbl ll homogn adatszerkezetknt (pl. tmb) is. A rekord adatszerkezetben az egyes elemi adatokat mezknek nevezzk. A mezk tpusa eltr lehet. A rekord adatszerkezet alapvet szerepet tlt be az n. relcis adatbzis-kezel rendszerekben.

3.3.4.2 Adatszerkezetek fajti a trolt elemek szma szerint


Attl fggen, hogy az adatszerekezet elemeinek szma vltozhat-e a program vagy az algoritmus cgrehajtsa sorn, beszlhetnk statikus s dinamikus adatszerkezetekrl. A statikus adatszerkezetek elemszma a ltrehozs (deklarci) pillanatban eldl, a vgrehajts sorn ez a tulajdonsg nem vltoztathat meg. Tipikusan statikus adatszerkezet a tmb, amelynek elemszmt a deklarcikor kell megadnunk. Programozsi nyelvtl fggen fordtsi vagy futsidben a rendszer lefoglalja a megfelel mret 29

ALGORITMIZLS ALAPJAI memriaterletet (a memriaterlet az elemi adatok helyfoglalstl s az elemszmtl fgg), ezrt nem tudjuk megvltoztatni az elemszmot.11 Arra van lehetsgnk, hogy egy 100 elemre deklarlt tmbnek csak az els harminc elemt dolgozzuk fel, de tudnunk kell, hogy a maradk hetven elem szmra is foglalt helyet a rendszer, s az elemszm gy statikus. Dinamikus adatszerkezeteknl a fordt vagy futtat rendszer nem foglal lland mret memriaterletet. Az ilyen adatszerkezetek elemszma futsidben vltozhat. Ezeknl az adatszerkezeteknl gyakori az az eljrs, hogy ltrehozunk egy res (egyetlen elemet sem tartalmaz) adatszerkezetet, s futsidben bvtjk vagy cskkentjk egy-egy elemmel. Dinamikus adatszerkezet pldul a lista, a sor, a verem, a klnbz grfok, illetve a fjl. Ismt hangslyozzuk, hogy ez a jegyzet programozssal s algoritmizlssal csak rintlegesen foglalkoz hallgatk szmra kszlt, ezrt az adatszerkezetek ttekintsekor sem clunk a teljessg 3.3.5 A tmb

A tmb homogn, statikus, s n. asszociatv adatszerkezet. Az asszociativits azt jelenti, hogy az egyes elemek elrshez n. indexeket hasznlunk. A tmb minden egyes eleme kap egy (vagy tbb) indexet, ez(ek) ltalban egsz szm(ok). Az egyes programozsi nyelvekben nemcsak szmok lehetnek tmbindexek, de mi minden pldban nemnegatv egszeket fogunk hasznlni.

3.3.5.1 Tmbk dimenziinak szma


Attl fggen, hogy egy elem elrshez hny indexet kell megadnunk, beszlhetnk a tmbk dimenziszmrl. Az egydimenzis tmbk esetben (melyeket vektoroknak is neveznk) az egyes elemek egy indexszel rhetk el. A tmbelemek elrsre az indexeket szgletes zrjelben fogjuk jellni (TMBNV[INDEX]). A legtbb magas szint programozsi nyelv is kveti ezt a jellsmdot. 20. kp Egydimenzis tmb (vektor)

A ktdimenzis tmb (mtrix) esetben egy elem elrshez kt indexet kell megadnunk. A ktdimenzis tmbk felfoghatk gy is, mint n sorbl s m oszlopbl ll tblzatok. 21. kp Ktdimenzis tmb (mtrix)

11

A tmb a legismertebb s leggyakrabban hasznlt homogn, statikus adatszerkezet, minden magasszint programozsi nyelv ismeri s tmogatja. Szmos nyelvben van lehetsgnk arra, hogy jradefiniljuk a tmb mrett, vagyis megvltoztassuk az elemszmot futsidben. Vannak olyan programozsi nyelvek, amelyek tmbnek nevezett adatszerkezetben klnbz tpus adatokat trolhatk. Ebben a jegyzerben nem clunk a klnbsgek teljeskr feltrsa, sem pedig eldnteni, hogy valban tmb-e az az adatszerkezet, amelyet egy adott nyelv annak nevez. A jegyzetben ezrt mi ragaszkodni fogunk ahhoz a defincihoz, hogy a tmb statikus, homogn adatszerkezet. gy is fogjuk hasznlni.

30

ALGORITMIZLS ALAPJAI

Lnyegtelen, hogy a mtrixot nm-es vagy mn-es tblzatnak tekintjk-e, teht nincs jelentsge, hogy egy elem elrsekor elszr az oszlopindexet, majd a sorindexet, vagy elszr a sorindexet s ezutn az oszlopindexet adjuk-e meg, de minden esetben azt a sorrendet kell kvetnnk, amelyet a deklarcikor eldntttnk Az iskolai rarend esetben elszr ltalban az oszlopindexet tekintjk, majd a sorindexet (pnteken a harmadik ra, nem pedig a harmadik ra pnteken). Az rarend trolshoz rdemes ezrt egy t oszlopbl s hat vagy ht sorbl ll tmbt deklarlnunk. A torped jrkban, vagy a sakkban is egy mez jellshez elszr az oszlop, majd a sorindexet adjuk meg. Ha torped jtkot, vagy sakkprogramot ksztnk, a jtktbla trolshoz hasznlhatunk olyan mtrixot, amelynek deklarcijakor elszr az oszlopok, majd a sorok szmt adjuk meg. (Sakknl klnsen kell figyelnnk az indexekre, mert a sakktbla sorainak s oszlopainak szma azonos.) Hangslyozzuk, hogy nincs erre szabvny vagy ktelez szably, de a programokban, algoritmusokban nem a fenti megoldst szoktuk kvetni. Mtrixoknl az elemek elrshez ltalban sorindex, oszlopindex sorrendben szoktuk megadni az indexeket. Ebben a jegyzetben mi minden esetben ezt a sorrendet fogjuk kvetni. A hromdimenzis tmbk esetben kpzeljk azt, hogy ezek lapokbl llnak, a lapokon pedig mtrixok vannak. Egy elem elrshez meg kell adnunk a lapindexet, majd a sorindexet, vgl az oszlopindexet. 22. kp Hromdimenzis tmb

A ngydimenzis tmb elkpzelhet gy, mint egy olyan mtrix, amelynek egyes elemei is mtrixok. Az tdimenzis tmb lapokbl ll, az egyes lapokon olyan mtrixok vannak, amelyeknek az elemei is mtrixok, s gy tovbb. 23. kp Magasabb dimenziszm tmbk

A dimenzik szma elvben nem korltozott, de egyrszt az egyes programozsi nyelvek ltalban adnak fels korltot, msrszt a gyakorlatban hromnl nagyobb dimenziszm tmbket nem szoktunk hasznlni.

3.3.5.2 Tmbindexek rtelmezsi tartomnya


Vannak olyan programozsi nyelvek, amelyekben a tmbindex nemcsak szm lehet, hanem pldul karakter is, Ebben a jegyzetben mi minden esetben szmokat fogunk hasznlni. Vannak olyan programozsi nyelvek, amelyekben a programoz maga dntheti el, hogy a tmbk egyes indexei milyen tartomnybl vehetnek fel rtkeket, mgy ms nyelvekben deklarcikor nem az indexek ltal felvehet rtkek tartomnyt, hanem a tmb elemszmt kell megadnunk. Ezekben a nyelvekben az indexels mindig 0-tl kezddik. Rgebbi, algoritmusokkal foglakoz knyvekben gyakori volt az a sajnlatos szoks, hogy a tmb els elemnek 1-es indexet adtak. Programozsi nyelvekben ez egyedl a BASIC nyelvekre jellemz szoks volt, de a ma hasznlatos BASIC vltozatokban (Visual Basic .NET, Visual Basic for Applications) van lehetsgnk arra, hogy a tmbelemeket 0-tl kezdjk indexelni. A programozi gyakorlatban a BASIC nyelv 31

ALGORITMIZLS ALAPJAI jelentsge csekly ms nyelvekvel szemben (C, C++, C#, Java, stb.), s ezekben a nyelvekben minden esetben 0-val kezddik a tmbelemek indexelse, mert a programoznak a tmb elemeinek szmt, s nem az indexek ltal felvehet rtkek tartomnyt kell megadnia. Ezek figyelembe vtelvel ebben a jegyzetben minden esetben 0-val kezdjk a tmbelemek indexelst. Az els elem indexe 0, a msodik elem indexe 1, a harmadik elem indexe 2 s gy tovbb. Egy n elem tmb utols elemnek indexe gy n1. 3.3.6 Tovbbi homogn adatszerkezetek

A kvetkezkben felsorolsszeren bemutatunk nhny gyakran alkalmazott adatszerkezetet s fbb jellemziket. A 11. fejezetben rszletesebben szlunk ezekrl az adatszerkezetekrl s hasznlatukrl.

3.3.6.2 Halmaz
A halmaz adatszerkezet n. struktra nlkli adatszerkezet. Az elemek kztt nem tudunk sorrendet kijellni, nem tudjuk megmondani, hogy egy elemnek melyik elem a megelzje s melyik a rkvetkezje. Az adatszerkezetbe tudunk elemeket rgzteni s elemeket kivonni belle, illetve meg tudjuk mondani, hogy egy adott adat eleme-e a halmaznak. A halmaz adatszerkezetnek egy elem vagy eleme, vagy nem, minden elem vagy egyszer, vagy nullaszor tallhat meg benne. A halmaz adatszerkezet hasonlt a matematikban hasznlt halmazokhoz, de nem lehet vgtelen az elemszma. Nem minden programozsi nyelvben ltezik halmaz adattpus, de a programoz kszthet sajt reprezentcit, pldul tmb segtsgvel. Az n. multihalmaz adatszerkezet lehetv teszi, hogy egy elemet tbbszr is elhelyezznk a halmazban. 24. kp Halmaz

25. kp

Multihalmaz

3.3.6.2 Sor
Az adatszerkezetet gyakran emltik FIFO nven is, amely az angol First In First Out kifejezs rvidtse. Ennek az adatszerkezetnek az a jellemzje, hogy egyms utn bvtjk adatokkal, de legelszr azt az adatot dolgozhatjuk fel, amelyet elszr helyeztnk el benne. gy kpzelhet el ez az adatszerkezet, mint egy alagt, benne az adatok az autk. Az autk az alagtban nem elzhetik meg egymst, vagyis az az aut fog elszr kijnni az alagtbl, amelyik bement a msik vgn. 26. kp Sor (FIFO)

Ezt az adatszerkezetet hasznlja a pl. billentyzetpuffer. Ha valamirt a billentyzetrl bejv adatok nem dolgozhatk fel azonnal, az adatok egy pufferbe kerlnek, amg megtrtnik a feldolgozsuk. Termszetesen azt az adatot kell elszr 32

ALGORITMIZLS ALAPJAI

feldolgozni, amelyik elszr bekerlt a pufferbe, vagyis a feldolgozs sorrendjnek meg kell egyeznie az adatbevitel sorrendjvel.

3.3.6.3 Verem
Ezzel az adatszerkezettel kapcsolatban gyakran tallkozhatunk a FIFO rvidtssel, amelynek feloldsa az angol Last In First Out kifejezst jelenti. Ennek az adatszerkezetnek az a jellemzje, hogy a benne trolt adatok kzl azt dolgozhatjuk fel elszr, amelyet utoljra helyeztnk el benne. Kpzeljnk el egy dobozt, amelyikbe azonos mret knyveket rakunk egyms utn. A dobozban a knyvek csak egymsra kerlhetnek, egyms mellett nem frnek el. Azt a knyvet fogjuk tudni elszr kivenni, amelyet utoljra tettnk a dobozba. 27. kp Verem (LIFO)

3.3.6.4 Lista
A lista adatszerkezetre az jellemzje, hogy minden elemnek (az els s az utols kivtelvel) van megelzje s rkvetkezje. A listban teht az elemek rendezettsggel rendelkeznek. A lista brhol bvthet s brhonnan trlhet belle elem. Nem szabad sszekevernnk a lista adatszerkezetet az n. lncolt lista trolsi mdszerrel. A lncolt lista trolsi mdszernl minden elem tartalmaz egy adartrszt s egy mutat rszt. Az adatrsz trolja az adatot, a mutat pedig megmondja, hogy a tbbi elem kzl melyik az adott elem rkvetkezje. Ktirnyban lncolt lista esetn egy elem nem csak a kvetkez, hanem az elz elemre mutat mutatt is tartalmaz. Az utols elem kvetkez elemre mutat mutatja egy specilis elemre, a NIL-re mutat. A NIL elemnek nincs adattagja, sem pedig elz s kvetkez elemre mutat mutattagja sem. Ciklikus lista esetn az utols elemnl a kvetkez elemre mutat mutat az els elemre mutat. Ciklikus lista is lehet ktirnyban lncolt, ekkor az els elem elz elemre mutat mutatja az utols elemre mutat. A lncolt listkhoz tartozik mg egy specilis elem, a fej. Ez az elem nem tartalmaz adattagot, csak egy mutatt, amely a lista belpelemre (a kijellt els elemre) mutat. A lncolt listba brhov beszrhatunk adatot, ehhez megfelel memriaterletet kell lefoglalnunk, majd be kell lltanunk a beszrt elem, az azt megelz (s esetleg a rkvetkez) elem mutatit. Mg egyszer hangslyozzuk, hogy a lista adatszerkezet s a lncolt lista trolsi mdszer kt klnbz dolog. Lista reprezentlhat lncolt listval, de reprezentlhat vektorral is. Brmilyen adatszerkezet reprezentlhat lncolt listval, ekkor sztszrt trolsrl beszlnk. Ekkor az adatszerkezet elemei melyek logikailag valamilyen sorrendben llnak egyms utn a memria egymstl fggetlen rszein, sztszrva vannak eltrolva. Folytonos trols esetn az adatszerkezet egyes elemei fizikailag is egymst kveten vannak eltrolva a memriban. 28. kp Lncolt listk 33

ALGORITMIZLS ALAPJAI

3.3.6.5 Fa, binris fa


A fa adatszerkezet a matematikban hasznlatos fa grfok megfeleli. Ez egy hierarchikus adatszerkezet, ahol minden egyes elemnek pontosan egy szl, s tetszleges szm utdeleme lehet, kivve a gykrelemet s a levlelemeket. A gykrelem a grf kezdeleme, ennek az elemnek nincs szlje. A levlelemeknek nincs utdeleme. A grfban az elemeket csompontoknak nevezzk, ket lek ktik ssze. Binris fkban minden elemnek 0, 1 vagy kt rkvetkezje lehet. A szigor rtelemben vett binris fk minden elemnek 0 vagy 2 rkvetkezje van. Fk esetben az elemek beszrsa s trlse fgg a fa tpustl. Egy ltalnos fba brhov beszrhatunk elemet, de csak levlelemknt. Binris fk esetn bonyolultabb a krds, hiszen a beszrs utn is binris fnak kell maradnia az adatszerkezetnek. A binris fk, de ltalban a fa adatszerkezetek a szmtstechnikban nagyon fontos szereppel brnak. 29. kp Fa, binris fa, szigoran binris fa

3.3.6.6 Hl
A hl olyan grf, amelyben az elemeknek brmennyi megelz s rkvetkezje lehet. Ha kt elem kztt van kapcsolat, akkor k egymsnak klcsnsen megelzi s rkvetkezi. Egy elemnek akr sajt maga is lehet a megelzje vagy a rkvetkezje. 30. kp Hl

Kzismert az n. utaz gynk problma. Egy grf cscsai vrosok, a kzttk tallhat lek pedig tvonalak kt vros kztt. Az leket slyozzuk, kltsggel ltjuk el. A kltsg lehet tvolsg, vagy meredeksg (hegyvidki utak esetben), esetleg a fizetend r, ha tdjas az t vagy tmegkzlekedssel kzlekednk. A feladat az, hogy talljuk meg a legolcsbb (legrvidebb, legkisebb szintklnbsg stb.) utat A-bl B-be. Ezt a problmt hl adatszerkezettel (is) lehet reprezentlni. 31. kp Hl

Megjegyezzk, hogy az ilyen jelleg feladatok megoldsra nincs ltalnos rvny algoritmus. Nem tudunk olyan mveletsort definilni, amely brmilyen grfban azonnal megadja az optimlis tvonalat. A megoldst keresni kell, ehhez be kell jrni a grfot valamilyen algoritmussal, s meg kell tallni az optimlis megoldst. Ez bonyolultabb grfok esetben akr megoldhatatlan feladat is lehet, ezrt az ilyen feladatoknl gyakran alkalmaznak mestersges intelligenciban hasznlt megoldsokat. 3.3.7 Rekord

A rekord heterogn adatszerkezet. A rekordban trolt elemi adatokat mezknek nevezzk, a mezk tpusnak nem kell egyeznek lennie, ezrt heterogn adatszerkezet a 34

ALGORITMIZLS ALAPJAI

rekord. A rekord adatszerkezet nagyon fontos szerepet tlt be a relcis adatbzis-kezel rendszerekben. Ezekben az adatokat tblk segtsgvel troljuk, a tblkban pedig az egyes adatelemek a rekordok (egyed, tuple). Absztrakt megkzeltsben: a tblk az azonos egyedtpusok trolsra szolglnak, ezekben az egyes egyed-elfordulsok a rekordok. A rekordok mezi az egyedek tulajdonsgait rjk le. A rekord egyes mezinek tpusai a tulajdonsgtpusok, mg a rekordokban trolt mezk egyes rtkei a tulajdonsgelfordulsok. 32. kp 3.3.8 Fjl Rekord

Fjlokrl httrtrakon trolt adatok esetben beszlnk. A fizikai trols, vagyis a reprezentci attl fgg, hogy milyen httrtron troljuk az adatot. A fjlokban logikailag sszefgg adatokat trolunk, de a trolsuk fizikailag lehet sztszrt is (gondoljunk pl. a mgneses elv httrtrakon termszetes lemeztredezettsgre, fragmentcira). A programozsi nyelvek megklnbztetik a logikai s a fizikai fjl fogalmt. A fizikai fjl a httrtron trolt bitkombinci, a logikai fjl az az adatszerkezet, amelyet a program sorn manipullunk. Ez az adatszerkzetet pl fel adatelemekbl (adattagokbl). A program a logikai fjlon keresztl fr hozz a fizikai httrtr-tartalomhoz. A szerkezet nlkli (szerilis) llomny olyan llomny, amelynek nincs szerkezete. A benne trolt adatok (rekordok) sorrendje tetszleges, ha keresni akarunk benne, akkor csak teljes keresst alkalmazhatunk. A szekvencilis llomnyban a rekordok elsdleges kulcsa alapjn rendezettek az adatok. A direkt s random llomnyok esetn egy fggvny segtsgvel klcsnsen egyrtelm (direkt llomny) vagy csak egyrtelm (random) lekpezst hozunk ltre az llomny rekordjainak azonostja s a httrtron elfoglalt helye kztt.

3.4 SSZEFOGLALS
Ebben a fejezetben az algoritmusokban elfordul adatokrl esett sz. Az adatok lehetnek literlok, vagy megjelenhetnek vltozkon keresztl. A problmamegoldsban az algoritmusok mellett az adatszerkezetek ismerete is rendkvl fontos. Egy feladatot akkor tudunk sikerrel megoldani, ha felismerjk s ki tudjuk vlasztani a megoldshoz legalkalmasabb adattpusokat vagy adatszerkezetet is.

3.5 NELLENRZ KRDSEK


Milyen jellemzi vannak egy vltoznak? 2. Mutassa be az elemi s az sszetett adatok jellemzit! 3. Hasonltsa ssze a statikus s dinamikus, illetve homogn s inhomogn adatszerkezeteket! 4. Eddigi tanulmnyai sorn hol tallkozott mr fa s binris fa adatszerkezettel? Ne csak az informatikra gondoljon! (Pl. csaldfa)
1.

3.6 GYAKORL TESZTEK


35

ALGORITMIZLS ALAPJAI

4. LECKE: ADATSORHOZ EGY ADATOT RENDEL ELJRSOK 1.


4.1

CLKITZS

Ebben a leckben olyan algoritmusokkal ismerkednk meg, amelyek adatsorozatbl (egy vektor elemeibl) egy adatot lltanak el. A leckben szerepl algoritmusok egyszerek, de felttlenl szksgesek ahhoz, hogy megrtsk a ksbbi, bonyolultabb eljrsokat. Az albbi algoritmusok bemutatsnl az adatokat vektorok troljk. Fontos azonban megjegyeznnk, hogy ezek az algoritmusok ltalban kismrtk talaktssal ms adatszerkezetek esetn is helyesen mkdnek

4.2 TARTALOM
Tmb feltltse adatokkal sszegzs (sszeg, szorzat, szmtani kzp) Eldnts Megszmlls Kivlaszts Szlsrtk-kivlaszts

4.3 A TANANYAG KIFEJTSE


4.3.1 Tmbfeltlts

Ahhoz, hogy adatokkal dolgozhassunk, termszetesen elszr is adatokra van szksgnk. A lecke tovbbi rszben tallhat algoritmusokat vektorokon mutatjuk be, ezrt ebben a rszben a vektorok feltltst tekintjk t. Tegyk fel, hogy deklarltuk az n elem a vektort. A vektor feltltsnek algoritmusa: eljrs TMBFELTLTS ciklus I = 0-tl (N 1)-ig be: A[I] ciklus vge eljrs vge Ezt az algoritmust akkor hasznlhatjuk, ha a vektort inputrl (pl. billentyzetrl) akarjuk feltlteni. A harmadik sor be: A[i] utastsa helyett rhat pl. rtkads is, ha a vektor elemeit pl. egy msik tmb rtkeinek felhasznlsval akarjuk megadni. A fenti algoritmusban (s az ezt kvetekben sem) szerepel deklarci. A deklarci a programozsi nyelvek eszkze a vltoz tpusnak s trbeli helyfoglalsnak vgrehajtsra. Mivel jegyzetnk az algoritmusokrl szl, s az alkalmazott adatszerkezetek bzistpusa, illetve elemszma indifferens az algoritmusok szempontjbl, a deklarcikat nem jelljk az algoritmusokban.

36

ALGORITMIZLS ALAPJAI

Lssunk pldkat klnbz programozsi nyelveken! Felttelezzk, hogy az A tmbt mr deklarltuk az albbi eljrsokat tartalmaz programrszekben, a ciklusvltoz deklarcijt viszont jelljk.

Turbo Pascal, Free Pascal


procedure tombfeltoltes; var i : integer; begin for i := 0 to (n 1) do begin write(Krem a(z) , str(i), . adatot:); readln(a[i]); end; end;

ANSI C
void tombfeltoltes() { int i; for (i = 0; i < n; ++i) { puts("Krem a kvetkez szmot:"); scanf("%d", &a[i]); } }

C#
void tombfeltoltes() { int i; for (i=0; i < n; ++i) { System.Console.WriteLine("Krem a(z) {0}. adatot:", i); a[i] = System.Console.ReadLine(); } } A Pascalban mindegy, hogy milyen tpus a ReadLn() eljrs paramtere. Az ANSI C pldban azt felttelezzk, hogy az A tmb egszeket tartalmaz. Ha nem, akkor a scanf() fggvny paramterben a %d konverzis karaktert %c-re, %f-re stb. kell cserlni. A C# pldban azt feltteleztk, hogy az A tmb sztringeket tartalmaz. Ha nem, akkor az a[i] = System.Console.ReadLine(); rtkads helyett ehhez hasonlt kell rni: a[i] = int.Parse(System.Console.ReadLine()); egsz tpus elemek esetn , vagy ms mdon 37

ALGORITMIZLS ALAPJAI kell gondoskodni az input adat konvertlsrl (pl. a Convert osztly megfelel metdusainak hasznlatval), mert a ReadLine() fggvny visszatrsi rtke String. 4.3.2 sszegzs

Az sszegzs ttele egy vektor elemeinek sszegt (szorzatt, szmtani kzept, stb.) adja meg. Felttelezzk, hogy a vektor elemei numerikus tpusak. Feladat: Adott az N elem A vektor. Keressk az elemei sszegt (szorzatt, szmtani kzept). eljrs SSZEGZS1 SSZEG = 0 ciklus I = 0-tl (N 1)-ig SSZEG = SSZEG + A[I] ciklus vge ki: SSZEG eljrs vge Lssunk egy pldt! Tegyk fel, hogy bevsrls utn szeretnnk a pnztrblokk adatait ellenrizni. A TTEL tmbben troltuk a vsrolt termkek rait, s szeretnnk ellenrzsknt kiszmtani a vgsszeget. sorszm TTEL 1 427 2 1271 3 57 4 983 5 234 I 0 1 2 3 4 TTEL[I] SSZEG 0 427 427 1271 1698 57 1755 983 2738 234 2972

Az algoritmus elejn az SSZEG vltoz felveszi a 0 kezdrtket. Ekkor az I vltoz, illetve a TTEL tmb I-edik eleme mg nem rtelmezett adat. Az els lpsben I felveszi az 0-s rtket, a TTEL tmb I-edik (nulls index, teht els) eleme a 427. Ezt hozzadjuk az SSZEG vltoz aktulis rtkhez (0), gy az SSZEG j rtke 427 lesz. A msodik lpsben I felveszi az 1-es rtket, a TTEL tmb I-edik (egyes index, teht msodik) rtke az 1271. Ezt hozzadjuk az SSZEG vltoz aktulis rtkhez (427), gy az SSZEG j rtke 1698 lett. gy folytatjuk, amg a ciklus le nem fut az I = (N 1) (azaz I = 4) rtkre is. Az utols sszeads utn az SSZEG vltoz rtke a vektor elemeinek sszege lesz. Az algoritmus helyes sszeget ad, de vegyk szre, hogy van benne egy felesleges lps. Ha otthon, szmolgppel ellenriznnk az adatokat, biztos, hogy nem gy kezdennk el. Az els ttelt nem a nullhoz adnnk, hanem az lenne az els lps, hogy az els ttelhez hozzadnnk a msodikat, majd az els kett rszsszeghez a harmadikat s gy tovbb. 38

ALGORITMIZLS ALAPJAI

Abban az esetben, ha egy vektor sszes elemnek sszegt keressk, az SSZEG vltoz kezdtknek bellthatjuk a ttelek kzl az elst, s a ciklust a msodik elemtl indthatjuk. eljrs SSZEGZS2 SSZEG = A[0] ciklus I = 1-tl (N 1)-ig SSZEG = SSZEG + A[I] ciklus vge ki: SSZEG eljrs vge Hogyan lesz az sszegbl tlag? Nyilvn gy, hogy elosztjuk az elemek szmval. Ha tudjuk, hogy N > 0, akkor az eljrs kimenete lehet ez is: ki: SSZEG / N Ha elemek szorzatt keressk, akkor a ciklus magjban lv mvelet legyen ez: SZORZAT = SZORZAT * A[I] Ekkor persze fontos, hogy a SZORZAT vltoz kezdrtke ne legyen 0 (kivve, ha a vektor els eleme ppen nulla). Az sszegzs ttelt alkalmazzuk akkor is, ha egy vektronak csak bizonyos elemeit szeretnnk sszegezni, ekkor viszont feltteles sszegzst alkalmazunk. Feladat: a TTELEK vektorban troljuk egy hztarts bevteleit s kiadsait. A bevtelek pozitv, a kiadsok negatv eljelek. Mennyi a hztarts teljes bevtele, teljes kiadsa s jelenlegi egyenlege? eljrs PLDA1 BEVTEL = 0 KIADS = 0 ciklus I = 0-tl (N 1)-ig ha TTEL[I] > 0 akkor BEVTEL = BEVTEL + TTEL[I] klnben KIADS = KIADS + TTEL[I] elgazs vge ciklus vge ki: BEVTEL, KIADS, BEVTEL KIADS eljrs vge

39

ALGORITMIZLS ALAPJAI

Turbo Pascal
procedure pelda1; const bevetel : real = 0; kiadas : real = 0; var i : integer; begin for i := 0 to (n 1) if tetel[i] > 0 then bevetel := bevetel + tetel[i] else kiadas := kiadas + tetel[i] writeln(bevetel, kiadas, bevetel kiadas); end;

C#
void pelda1() { double bevetel = 0, kiadas = 0; int i; for (i = 0; i < n; ++i) if (tetel[i] > 0) bevetel += tetel[i]; else kiadas += tetel[i]; System.Console.WriteLine({0}, {1}, {2},bevetel, kiadas, bevetel kiadas); } 4.3.3 Eldnts

Adott egy N elem A vektor s egy T tulajdonsg, amely rtelmezhet a tmb elemeire (pros, nemnegatv, oszthat ttel, hosszabb tz karakternl, van benne k bet stb.). Krds: van-e az A vektornak T tulajdonsg eleme? Ez tipikusan az a ttel, amelyben nem clszer a vektor sszes elemt vizsglni. Elegend csak addig keresnnk T tulajdonsg elemet, mg a legelst meg nem talljuk, hiszen nem krds, hogy hny darab T tulajdonsg elem van, ezek milyen indexekkel rhetk el, stb. Ha a vektor legels eleme T tulajdonsg, megllhatunk, s az eljrs jelezheti, hogy igen, van ilyen elem. A legkedveztlenebb eset az lehet, ha a tmb valamennyi elemt megvizsgltuk, de egyik sem volt T tulajdonsg. Ezt az jelzi, hogy az I ciklusvltoz rtke N lesz. N. index eleme nincs a tmbnek, hiszen 0-tl kezddik az indexels, gy az utols elem indexe (N 1). 40

ALGORITMIZLS ALAPJAI

eljrs eldnts I = 0 ciklus, amg (I < N) s (A[I] nem T tulajdonsg) I = I + 1 ciklus vge ha I < N, akkor ki: "Igen, van T tulajdonsg elem" klnben ki: "Nem, nincs T tulajdonsg elem" elgazs vge eljrs vge Figyeljk meg a ciklusfejben szerepl felttelt. Ez a felttel lnyegben a tovbblps felttele. Ha az ppen vizsglt index mg lehetsges indexe a tmbnek (I < N), s az aktulis index elem nem olyan, amilyen keresek (A[I] nem T tulajdonsg), akkor lphetek a kvetkez elemre. A ciklusbl kt ok miatt lphetnk ki: vagy az (I < N) felttel vlik hamiss, vagy az (A[I] nem T tulajdonsg) felttel. Mivel az I rtke egyesvel nvekszik, az (I < N) felttel csak gy vlhat hamiss, ha (I = N) teljesl. Ha ez az eset kvetkezik be, az azt jelenti, hogy I < N esetn egyetlen olyan elemet sem talltunk, amely T tulajdonsg lett volna, vagyis a vektornak nincs a keresett tulajdonsgnak megfelel eleme. Ha az (A[I] nem T tulajdonsg) felttel vlik hamiss, vagyis az I index elemre nem igaz, hogy nem T tulajdonsg, az azt jelenti, hogy talltunk egy T tulajdonsg elemet. Konkrt feladatok esetben a legnagyobb hibalehetsget a nem T tulajdonsg felttel lersa jelentheti, ha a T tulajdonsg sszetett. Matematikai logikval kapcsolatos tanulmnyainkbl emlksznk az albbi azonossgokra:

( P Q) = P Q ( P Q ) = P Q

Lssunk egy pldt. A SZMOK vektorban termszetes szmokat trolunk. Krds: van-e kzttk olyan szm, amelyik 5-nl nagyobb de 10-nl kisebb? T: SZMOK[I] > 5 s SZMOK[I] < 10 T: SZMOK[I] 5 vagy SZMOK[I] 10 eljrs plda2 I = 0 ciklus, amg (I < N) s (SZMOK[I] 5 vagy SZMOK[I] 10) I = I + 1 ciklus vge ha I < N akkor ki: "Igen, van olyan szm kzttk, amelyik 510 kz esik" klnben ki: "Nem, nincs ilyen szm." elgazs vge eljrs vge 41

ALGORITMIZLS ALAPJAI

Turbo Pascal
procedure pelda2; var i : integer; begin i := 0; while (i < n) and ((szamok[i] <= 5 or szamok[i] >= 10) do i := i + 1; if i < n then writeln("Igen, van ilyen szm.") else writeln("Nem, nincs ilyen szm."); end;

C#
void pelda2() { int i; for (i=0; i < n && (szamok[i] <= 5 || szamok[i] >= 10); ++i) ; if (i < n) System.Console.WriteLine("Igen, van ilyen szm."); else System.Console.WriteLine("Nem, nincs ilyen szm."); } 4.3.4 Megszmlls

Adott az N elem A vektor s egy T tulajdonsg. Krds: hny T tulajdonsg eleme van A-nak? A vlasz megadshoz most az A valamennyi elemt meg kell vizsglnunk. Az I ciklusvltoz felveszi 0 s (N 1) kztt az sszes lehetsges tmbindexet, s ha az I index elem T tulajdonsg, akkor eggyel nveljk a DB szmll rtkt. eljrs megszmlls DB = 0 ciklus I = 0-tl (N 1)-ig ha A[I] T tulajdonsg, akkor DB = DB + 1 elgazs vge ciklus vge ki: DB eljrs vge

42

ALGORITMIZLS ALAPJAI

Lssunk egy konkrt pldt. Ismerjk egy 15 fs iskolai csoport tanulinak nemt s magassgt cm-ben. Szmtsuk ki a fik tlagos magassgt! NEM MAGASSG 0 F
178

1 F
192

2 N
167

3 N
159

4 N
164

5 F
169

6 F
182

7 N
177

8 F
165

9 N
170

10 11 12 13 14 F N N F F
170 173 164 181 172

eljrs plda3 SSZEG = 0 DB = 0 ciklus I = 0-tl 14-ig ha NEM[I] = "F", akkor DB = DB + 1 SSZEG = SSZEG + MAGASSG[I] elgazs vge ciklus vge ha DB > 0, akkor ki: SSZEG / DB klnben ki: "Az adatok kztt nem szerepelt egy fi magassga sem" elgazs vge eljrs vge A megoldsban egy feltteles sszegzst s egy megszmllst lthatunk. Mivel a megoldsban az adatok trolsra tmbt hasznlunk, nem trolhatk egy adatszerkezetben a nemek s a magassgok, hiszen klnbz tpusak az adatok. Ezrt kt kln vektorban troljuk ket. A logikailag sszetartoz (vagyis egyazon szemlyre vonatkoz) adtokat az indexek ktik ssze. A csoport harmadik tagjnak neme NEM[2], magassga pedig MAGASSG[2]. Ebben a pldban nem hasznlhatjuk azt a megoldst, hogy az SSZEG vltoz kezdrtknek a MAGASSG tmb 0. elemt vlasztjuk, mert nem lehetnk biztosak abba, hogy a csoport tagjai kztt az els szemly ppen fi. A konkrt pldban az, de ms iskolai csoportok esetben ez egyltaln nem biztos. Hasonlkpp: habr ebben a konkrt pldban ltjuk, hogy az adatok kztt szerepelnek fik adatai is, az adatok pontos ismerete nlkl ebben nem lehetnnk biztosak. Emiatt az sszegzs s a megszmlls utn szksges azt is ellenriznnk, hogy volt-e T tulajdonsg elem az adatok kztt, vagyis jelen esetben szerepel-e legalbb egy fi adata, mert ha nem, akkor kirskor nullval osztannk. Lssuk a plda Turbo Pascal s C# nyelv kdjait! Ezekben a kdrszletekben az eddigiektl eltren megadjuk a vektorok adatait is.

Turbo Pascal
procedure pelda3; const 43

ALGORITMIZLS ALAPJAI osszeg : integer = 0; db : integer = 0; nem : array[0..14] of char = (F, F, N, N, N, F, F, N, F, N, F, N, N, F, F); magassag : array[0..14] of integer = (178, 192, 167, 159, 164, 169, 182, 177, 165, 170, 170, 173, 164, 181, 172); var i : integer; begin for i := 0 to (n 1) do if nem[i] = F then begin db := db + 1; osszeg := osszeg + magassag[i]; end; if db > 0 then writeln(osszeg / db) else writeln(Nincs kzttk fi.); end;

C#
void pelda3() { char[] nem = new char[] {F, F, N, N, N, F, F, N, F, N, F, N, N, F, F}; int[] magassag = new int[] {178, 192, 167, 159, 164, 169, 182, 177, 165, 170, 170, 173, 164, 181, 172}; int osszeg = 0, db = 0, i; for (i = 0; i < n; ++i) if (nem[i] == F) { ++db; osszeg += magassag[i]; } if (db > 0) System.Console.WriteLine(osszeg / double(db)); else System.Console.WriteLine(Nincs kzttk fi.); } 4.3.5 Kivlaszts

Adott az N elem A vektor s egy X elem, melyrl biztosan tudjuk, hogy eleme Anak. Krds: hnyas index eleme A-nak X? 44

ALGORITMIZLS ALAPJAI

A megolds lnyege, hogy biztosan tudjuk, hogy a keresett elem megtallhat Aban. Az I ciklusvltoz kezdrtkt belltjuk 0-ra, majd egyesvel nvelve rtkt sorra megvizsgljuk a tmb elemeit. A vizsglatot addig folytatjuk, mg megtalljuk X-et A-ban. Nem kell azt vizsglnunk, hogy esetleg elfogytak-e az elemek, s a keress sikertelen, mert a ttel elfelttelei kztt szerepelt, hogy a keresett elem biztosan megtallhat a vektorban. eljrs kivlaszts I = 0 ciklus, amg A[I] X I = I + 1 ciklus vge ki: I eljrs vge Viszonylag ers kvetelmny az az elfelttel, hogy a keresett elem biztosan szerepeljen a vektorban. Ezrt ezt a ttelt ltalban ms ttelekkel egytt szoktuk alkalmazni. Nemcsak konkrt X elemre, de T tulajdonsg elemre is felrhat ez a ttel, ha biztosan tudjuk, hogy van T tulajdonsg elem egy adatsorban. Ez esetben nem konkrt rtket keresnk, hanem egy bizonyos tulajdonsg elemet. Ez a tulajdonsg lehet konkrt, csak az adott adatsorra rtelmezhet jellemz, de lehet ltalnos is. A kvetkez ttel(ek)ben ltalnos jellemznek megfelel elemeket keresnk: minden adatsoron rtelmezhet szlsrtk, kereshetnk legkisebb s legnagyobb elemet.12 4.3.6 Szlsrtk-kivlaszts

A szlsrtk-kivlasztst maximumkivlasztson mutatjuk be, de ez az eljrs nagyon knnyen alakthat minimumkivlasztss. Maximumkivlasztsnl azokra a krdsekre kell vlaszolnunk, hogy a vektor sszes eleme kzl keressk a legnagyobbat, vagy a vektornak csak valamilyen felttelnek megfelel elemeit vonjuk be a kivlasztsba. A msik krds az, hogy ha a maximlis rtk tbbszr is elfordul, melyik elforduls indext szeretnnk megkapni. Az albbi eljrsban a vektor sszes elemnek figyelembe vtelvel a maximlis elem indext keressk. Ha tbb elfordulsa is van, az els elforduls indext keressk.

12

Legkisebb s legnagyobb elemet nemcsak szmok kztt kereshetnk. Mivel a szveges adatok kdolshoz kdtblzatokat hasznlnak a programozsi nyelvek, a szveges adatok is numerikus adatknt vannak trolva. gy rtelmezhetnk sztringek kztti relcikat (kisebb, nagyobb, egyenl, stb.) Fontos, hogy sztringek sszehasonltsakor a legtbb programozsi nyelv case sensitive, vagyis a kis- s nagybetket hatrozottan megklnbztetik, s a nagybetk kdja kisebb, mint a kisbetk. (A legtbb magas szint programozsi nyelv gy kezeli a karakterlncok sszehasonltst, de van kivtel, pl. az Adobe Director nev multimdia szerzi rendszernek programozsi nyelve, a Lingo nem case sensitive, mg a sztringek sszehasonltsban sem.) Tovbb a kdtblkban az alfabetikus karakterek kztt sajnos csak az angol bc betire igaz az, hogy betrend szerint kvetik egymst. A magyar kezetes magnhangzk helye a kdtblkban nem kveti a betrendbe sorols magyar szablyait, ezrt magyar kezetes karaktereket tartalmaz karakterlncoknl az sszehasonlt opertorok segtsgvel kzvetlenl nem tudunk betrendbe sorolst vgezni.

45

ALGORITMIZLS ALAPJAI eljrs maximumkivlaszts1 MAXINDEX = 0 ciklus I = 1-tl (N 1)-ig ha A[I] > A[MAXINDEX], akkor MAXINDEX = I elgazs vge ki: MAXINDEX eljrs vge Figyeljk meg, hogy az eljrsban abbl a kezdfelttelbl indulunk ki, hogy a vektor legnagyobb eleme az els elem. Ezt kveten a msodik elemtl az utols elemig mindet sszehasonltjuk az eddig legnagyobbnak tekintett elemmel, s ha az aktulis index elem nagyobb, mint az eddig legnagyobbnak gondolt, akkor megjegyezzk ennek indext. A tovbbi hasonltsoknl ezt az j indexet vesszk figyelembe. Az eljrsban teht a MAXINDEX vltoz az eddig megvizsglt elemek kzl jegyzi meg a legnagyobbnak az indext. Mint fent jeleztk, ez az eljrs a vektor sszes elemnek figyelembe vtelvel keresi a legnagyobbnak az indext. Ha a maximlis elemnek tbb elfordulsa is van a vektorban, ez az eljrs az els elforduls helyt adja meg. 33. kp Szlsrtk tbbszri elfordulsa egy vektorban

Az eljrsban az elgazs felttelben tallhat > (nagyobb) relcit < (kisebb) jelre cserlve az eljrs minimlis elemet keres. Ebben az esetben szintn minden elem figyelembevtelvel, s ha tbb minimliselem-elforduls is van a vektorban, akkor a legelst talljuk meg. Abban az esetben, ha a szlsrtk-elfordulsok kzl az utolsnak az indexre vagyunk kvncsik, akkor a > s < relcikat (nagyobb vagy egyenl) s (kisebb vagy egyenl) relcira kell cserlnnk. Feladat: A 4.3.4 fejezetben megadott adatok figyelembe vtelvel keressk a legmagasabb lny magassgt. Ennl a feladatnl nem vehetjk figyelembe az sszes adatot, hiszen vannak fik is a tanulcsoportban. Minden esetben az albbi algoritmust kell alapul vennnk, ha felttelezzk, hogy az adatsorban szerepelhetnek olyan adatok is, amelyek nem felelnek meg a feladat kirsnak. (Ennl a feladatnl azt kell feltteleznnk, hogy a csoportban nemcsak lnyok vannak.) Mivel tudjuk vagy felttelezzk, hogy nem minden adatot kell majd figyelembe vennnk, ebben a feladatban nem lhetnk azzal a kezdfelttelezssel, hogy az els adat a legnagyobb, mert lehet, hogy a konkrt esetben az els adat nem is lny. (A fenti adatokban valban nem lny az els adat.) Termszetesen nem hasonlthatjuk hozz a tbbi adatot. Ha az az eset kvetkezne be, hogy nincs egyetlen lny sem, aki magasabb, mint az els tanul (aki fi) magassga, akkor az algoritmus vgl rossz adatot

46

ALGORITMIZLS ALAPJAI

szolgltatna. Egy olyan lny magassgt kapnnk meg, amely valjban az els fi magassga. Ilyenkor szksgnk van mg egy segdvltozra, ennek kezdrtke lesz az, amelyet az els sszehasonltskor alapul vesznk. Ennek az rtknek viszont olyannak kell lennie, hogy az els sszehasonltskor biztosan fellrdjon. Ha maximumot keresnk, ennek a segdvltoznak olyan kezdrtket adjunk, amelynl az els vals elem mindenkppen nagyobb, legyen az brmilyen kicsi is. Ha minimumot kell keresnnk, a segdvltoz kapjon olyan kezdrtket, hogy az els sszehasonltsnl ez az rtk mindenkppen nagyobb legyen, mint az els vals rtk, legyen az brmilyen nagy is. Maximumkivlasztsnl ezt az rtket -nek, minimumkivlasztsnl +-nek fogjuk jellni. Ilyen rtket a programozsi nyelvek nem tmogatnak, ezrt a konkrt nyelvi implementcikban kellen nagy vagy kellen kicsi rtkkel helyettestsk ket! A MAXINDEX (vagy MININDEX) vltoz rtkt pedig 1-re lltjuk. A tmbnek nincs 1-es index eleme, ez az index teht egy fiktv elem. Ez jell(het)i a kivlaszts vgn, hogy talltunk-e egyet is a kijellt tulajdonsg elemek kztt, amely lehet minimum vagy maximum. eljrs plda4 MAX = MAXINDEX = 1 ciklus I = 0-tl 14-ig ha NEM[I]=N s MAGASSG[I] > MAX, akkor MAX = MAGASSG[I] MAXINDEX = I ciklus vge ki: MAGASSG[MAXINDEX] eljrs vge A fenti eljrs vgn a kiratsnl hasznlhattuk volna a MAX vltozt is, hiszen ugyanazt az rtket trolja, mint a MAGASSG[MAXINDEX]. Gyakori eset azonban, hogy nem ugyanabbl a vektorbl kell megadnunk a vgeredmnyt, amelyben kerestnk. Ha pldul trolnnk a tanulk neveit, akkor krdezhettk volna a legmagasabb lny nevt is: NV[MAXINDEX].

4.4 SSZEFOGLALS
Ebben a leckben olyan elemi algoritmusokkal ismerkedtnk, amelyek adatsorbl egy adatot lltanak el. Az itt szerepl eljrsok krt nknyesen vlasztottuk ki, ebben a leckben szerepelhetett volna tbb eljrs is.

4.5 NELLENRZ KRDSEK


Keressen olyan htkznapi tevkenysgeket, amelyben szlsrtk-kivlaszts alkalmazhat! 2. Gyorstja-e a szlsrtk-kivlasztst, ha tudjuk, hogy az adatsor rendezett?
1.

47

ALGORITMIZLS ALAPJAI ltalnos esetben van-e md arra, hogy megszmllsban ne vizsgljuk meg egy adatsor sszes elemt, s mgis helyes adatot kapjunk? 4. A vgrehajts lpseinek szmt tekintve miben tr el a az eldnts s a kivlaszts a tbbi eljrstl?
3.

4.6 GYAKORL TESZTEK

48

ALGORITMIZLS ALAPJAI

5. LECKE: ADATSORHOZ EGY ADATOT RENDEL ELJRSOK 1. KERESSEK


5.1

CLKITZS

A keressek az informatikai algoritmusok egy nagyon gyakran alkalmazott csoportjt alkotjk. Keresprogramokkal keresnk informcit az interneten, szra vagy szvegrszre keresnk a szvegszerkeszt programban, kulcs alapjn keresnk az adatbzisokban, stb. Ez a lecke a legalapvetbb keressi eljrsokat mutatja be. Az eddigiekhez hasonlan ezeket az eljrsokat is vektorokon mutatjuk be, de a gyakorlatban ezeket ltalban ms adatszerkezeteken alkalmazzk. A kereseljrsok clja hasonl a kivlasztshoz, de lnyeges klnbsg, hogy nem lehetnk biztosak abban, hogy a keresett elem valban megtallhat is lesz a vektorban, elfordulhat, hogy a keress eredmnytelen lesz. Adott az N elem A vektor s az X elem. Krds: mi az X indexe az A vektorban, ha egyltaln megtallhat benne. Az albbiakban tbbfle kereseljrst mutatunk be.

5.2 TARTALOM 5.3 A TANANYAG KIFEJTSE


Teljes keress Strzss keress Lineris keress Binris keress Sztring keresse sztringben mintailleszts 5.3.1 Teljes keress

Ez az eljrs nagyon hasonlt az eldnts ttelhez. Egyesvel vizsglunk minden elemet, hogy az-e a keresett X elem. A vizsglat akkor r vget, ha az I index elem ppen a keresett elem, vagy az utols elemet is megvizsgltuk s a keress nem hozott eredmnyt (I = N). Ez a keress nem hatkony, de rendezetlen vektorok (s egyb adatszerkezetek) esetn az egyetlen, amely megbzhatan mkdik. eljrs teljesKeress I = 0 ciklus, amg (I < N) s (A[I] X) I = I + 1 ciklus vge ha I < N, akkor ki: I klnben ki: "A keresett elem nem tallhat." 49

ALGORITMIZLS ALAPJAI elgazs vge eljrs vge 5.3.2 Strzss keress

A teljes keressben sszetett ciklusfelttelt ltunk. Egy sszetett ciklusfelttel kirtkelse mindig bonyolultabb (s tbb idt ignyel a processzortl), mint egy egyszer felttel. Prbljuk meg egyszersteni a ciklusfelttelt. A kivlaszts ttelben nem kellett azt az esetet vizsglnunk, hogy a ciklusvltoz rtke nagyobb-e, mint a legnagyobb tmbindex, mert biztosan tudtuk, hogy a keresett elem megtallhat a tmbben, s meg fogja lltani a keresst. Hogyan alakthatnnk a teljes keresst kivlasztss? Ha biztosak lehetnnk abban, hogy a keresett elem megtallhat a vektorban. Hogyan lehetnk biztosak ebben? Ha beletesszk a vektorba a keresett elemet. A strzss keress lnyege, hogy a keresett elemet elhelyezzk a tmb utols valdi eleme mgtt (A[N] = X). Ekkor az gy kibvtett tmbn mr alkalmazhat a kivlaszts ttele, mert biztosan tudni fogjuk, hogy a keresett elem szerepel a vektorban. Ha a kivlasztskor ezt a strzsaelemet (illetve annak indext) talljuk meg, az azt jelenti, hogy a keresett elem az eredeti tmbben nem szerepelt. Az eljrs sebessgt tekintve lehet hatkonyabb, mint a teljes keress, a helyfoglals szempontjbl viszont biztosan kevsb hatkony, hiszen nagyobb trterletre van szksgnk a tmb szmra. Ha a tmbelemek pldul hossz karakterlncok, emiatt a plusz helyfoglals miatt elkpzelhet, hogy nem is clszer ezt a keresst alkalmaznunk. eljrs strzssKeress A[N] = X I = 0 ciklus, amg A[I] X I = I + 1 ciklus vge ha I < N, akkor ki: I klnben ki: "A keresett elem nem tallhat." eljrs vge 5.3.3 Lineris keress

A keress elfelttele, hogy az adatsor rendezett legyen, vagyis teljesljn az albbi felttel: a0 a1 a2 an. Az eljrs lnyege, hogy teljes keresst vgznk az els elemtl kezdve, de csak addig, amg a keresett elem egyltaln elfordulhat a tmbben. 34. kp Lineris keress

50

ALGORITMIZLS ALAPJAI

Mivel az adatsor rendezett, megllhatunk, ha az A[I] < X felttel mr nem teljesl. Vagy azrt, mert A[I] = X (szmunkra ez a kedvez eset), vagy mert a tmb I-nl nagyobb index elemei mind nagyobbak, mint X, teht biztosan nem fog kzttk szerepelni. eljrs linerisKeress I = 0 ciklus, amg (I < N) s (A[I] < X) I = I + 1 ciklus vge ha (I < N) s (A[I] = X), akkor ki: I klnben ki: "A keresett elem nem tallhat." eljrs vge 5.3.4 Binris (logaritmikus) keress

Mieltt tteknthk ezt a programozsi ttelt, kpzeljk el a kvetkez jtkot, melyet ketten jtszhatnak. Az egyik jtkos gondol egy egsz szmot 1 s 100 kztt, a msiknak az a feladata, hogy minl gyorsabban kitallja ezt a szmot. Ehhez mond egy tippet, amelyre a szmot gondol jtkos vlaszknt megmondja, hogy az ltala gondolt szm kisebb vagy nagyobb-e, illetve termszetesen ha a tippel eltallta a szmot, akkor ezt is jelzi. Mi lehet a legclszerbb els tipp? Nyilvn az 50, hiszen ezzel mris kizrhat az eredeti szmok fele, st, mg annl is tbb. Ha a tippel az 50-et mondja, a szmot gondol jtkos megmondja neki, hogy az szma kisebb, nagyobb, vagy ppen egyenl ezzel a szmmal. Ha pldul kisebb, akkor a msodik tippnek nem is 1 s 50 kz kell esnie, hiszen az 50-et is kizrhatjuk: ha az lett volna a gondolt szm, a jrk mr vget rt volna. A msodik tippnek gy 1 s 49 kz kell esnie, ez clszeren a 25 lehet. Ha a gondolt szm ennl nagyobb, akkor 26 s 49 kz kell esnie. A harmadik tipp gy lehetne ennek a kt szmnak a szmtani kzepe: 38. (Felfel kerektettnk, br a matematika szablyai szerint 37 lenne a kerekts.) Tegyk fel, hogy a gondolt szm ennl kisebb, vagyis 26 s 37 kz kell esnie, 26 s 37 szmtani kzepe felfel kerektve 32, ez lehet a negyedik tipp. Tegyk fel, hogy a gondolt szm ennl kisebb, vagyis 26 s 31 kz esik. Az tdik tipp gy legyen 28. Tegyk fel, hogy a gondolt szm ennl kisebb, ekkor csak a 27 lehet az. Ez azt jelenti, hogy a 6. tippre eltalltuk a szmot. Ha nem ezzel a mdszerrel tippeltnk volna, hanem 1-tl kezdve egyesvel mondtuk volna a tippeket, 27 lpsben talltuk volna el a gondolt szmot. A binris (logaritmikus) keress alkalmazsnak szintn elfelttele, hogy az adatsor rendezett legyen. Lssuk egy pldn keresztl, hogyan mkdik, ha az adatokat egy vektorban troljuk. A 7
0

8
1

10
2

10
3

17
4

21
5

23
6

23
7

31
8

37
9

40
10

49
11

61
12

67
13

73
14

A keresshez hrom segdvltozt hasznlunk: E (a tartomny els eleme), U (a tartomny utols eleme) s K (a tartomny kzps eleme). A keresett elem X, a tartomny 51

ALGORITMIZLS ALAPJAI a tmbnek az a rsze, amelyben mg megtallhat lehet a keresett elem. A tartomnyon kvl es elemek kztt biztosan nem szerepelhet az X. Tegyk fel, hogy X = 37.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

7 1. 2. 3.
E=0

10

10

17

21

23

23
K=7

31

37

40

49

61

67

73
U=14

E=8 E=8 K=9 U=10

K=11

U=14

1. lps: A kezdllapotban E = 0, U = 14, K = (E + U) / 2 = 7. A K-adik elem (A[K]) 23. A 23 kisebb, mint X (= 37), vagyis ha az X egyltaln megtallhat a vektorban, akkor csakis a jelenlegi K-adik elem utn lehet. Ezrt megvltoztatjuk a tartomny kezdelemnek indext: E = K + 1. 2. lps: Az els lps utn E = 8, U = 14, K = (E + U) / 2 = 11. A[K] = 49, ez nagyobb, mint a kereset X, vagyis ha az X egyltaln megtallhat A-ban, akkor csakis a jelenlegi K-adik elem eltt lehet. Ezrt megvltoztatjuk a tartomny utols elemnek indext: U = K 1. 3. lps: E = 8, U = 10, K = (E + U) / 2 = 9. A[K] = 37 = X, ezt az elemet kerestk, vge az eljrsnak. Lssunk most egy olyan esetet, amikor a keresett elem nem tallhat. Legyen X = 9!
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

7
1. 2. 3. 4. 5. E=0 E=0 E=0

10

10

17

21

23

23
K=7

31

37

40

49

61

67

73
U=14

K=3 K=1 U=2 E=K=U=2 U=1 E=2

U=6

1. lps: Kezdllapot, E = 0, U = 14, K = (E + U) / 2 = 7. A[K] = 23, ez nagyobb, mint X, teht ha X egyltaln eleme A-nak, akkor csak a K-adik elem eltt lehet. U = K 1. 2. lps: E = 0, U = 6, K = (E + U) / 2 = 3. A[K] = 10, ez nagyobb, mint X, teht ha X egyltaln eleme A-nak, akkor az indexe csak K-nl kisebb lehet. U = K 1. 3. lps: E = 0, U = 2, K = (E + U) / 2 = 1. A[K] = 8, ez kisebb, mint X, teht ha X egyltaln eleme A-nak, akkor az indexe csak K-nl nagyobb lehet. E = K + 1. 4. lps: E = U = K = 2, A[K] = 10, ez nagyobb, mint X, teht ha X egyltaln eleme A-nak, akkor az indexe csak K-nl kisebb lehet. U = K 1. 52

ALGORITMIZLS ALAPJAI

5. lps: E = 2, U = 1, vge az eljrsnak, mert annak a tartomnynak egy eleme sincs, amelynek els eleme a hrmas, utols eleme a kettes index elem. Ha teht az E > U felttel teljesl, az azt jelenti, hogy a keresett elem nem tallhat az adatsorban. Kimondhatjuk, hogy a binris (logaritmikus) keress legfeljebb M = log2 N + 1 lpsben megtallja a keresett elemet, vagy megll, ha a keresett elem nem tallhat az adatsorban. Az x jells x fels egszrszt jelenti. Ha N = 10, akkor M = log2 10 + 1 = 5. Ha N = 100, akkor M = log2 100 + 1 = 8. Ha N = 1000, akkor M = log2 1000 + 1 = 11. Ha N = 10 000, akkor M = log2 10 000 + 1 = 15. Ha N = 100 000, akkor M = log2 10 000 + 1 = 18. Lthat, hogy ha N rtkt nagysgrendekkel nveljk is, a maximlis lpsek szma a keressben csak minimlisan nvekszik. Ezrt ennek az eljrsnak igazn a nagy elemszm adatsorokban nagy a hatkonysga. Termszetesen nem szabad elfelednnk azt az elfelttelt, hogy az algorimtus rendezett adatsort ignyel. Jogos krds lehet, hogy ha a keresett elemnek tbb elfordulsa is van az adatsorban (a rendezettsg felttele miatt ezek az elfordulsok egymst kvetik), vajon melyik elfordulst tallja meg az eljrs. Legyen X = 35, A pedig az albbi:
k1 k k+1 i2 i1 i i+1 i+2 l1 l l+1

8 9 11 33 35 35 35 37 59 61 67 A vlaszt N nagysga, illetve az A elemeinek nagysga s eloszlsa is befolysolhatja, gy ltalnos kpletet nem tudunk mondani arra, hogy ilyen esetben X melyik elfordulsnak indext tallja meg az algoritmus. Ha X szerepel az A-ban, akkor az algoritmus biztosan megtallja. Ha szksges, egy msik algoritmussal sszegyjthetjk X sszes elfordulst, amelyek nyilvnvalan K-nak az sugar krnyezetben tallhatk, ahol N / 2. eljrs logaritmikusKeress E = 0 U = N 1 K = (E + U) / 2 ciklus, amg (E U) s (A[K] X) ha A[K] < X, akkor E = K + 1 klnben U = K 1 elgazs vge K = (E + U) / 2 ciklus vge ha (E U), akkor ki: K klnben ki: "A keresett elem nem talhat." 53

ALGORITMIZLS ALAPJAI elgazs vge eljrs vge 5.3.5 Sztring keresse sztringben mintailleszts

Gyakori feladat, hogy egy karakterlncot kell megkeresnnk egy msik karakterlncban, ezt a mveletet nevezik mintailletsztsnek (pattern matching) is. Az a karakterlnc, amelyben keresnk, lehet akr egy teljes dokumentum is egy szvegszerkeszt programban. A feladat nemcsak sztringek esetn rtelmezhet s hasznlhat, ugyanezt a problmt kell megoldani akkor is, ha egy szakaszt keresnk egy DNS-lncban. A keresett minta lehet regulris kifejezs is. Ilyenkor nem egy konkrt sztinget keresnk, hanem egy a lehetsges sztringek alkotta halmazt (egyszer regulri kifejezs az is, amikor az opercis rendszerben fjlok keresshez helyettest joker karaktereket hasznlunk, pl.: *.doc, szepes?.txt). Egyes nem imperatv programozsi nyelvekben a mintailleszts rendszerszinten tmogatott szolgltats (pl. Perl). A problmval szmos szakirodalom foglalkozik. Jegyzetnkben a legegyszerbb, az n. brute force eljrst ismertetjk. Hatkonysgi mutatit tekintve ez a leggyengbb mdszer, viszont egyszer s knnyen megrthet. A tma irnt rdekldk figyelmbe ajnljuk az albbi mintailleszt eljrsok tanulmnyozst: KMP (KnuthMorrisPratt) algoritmus, RabinKarp algoritmus, BoyerMoore algoritmus13, Dmlki algoritmus. A brute force (nyers er) vagy egyszer mintaillesztsi eljrs egy lineris keressbe gyazott lineris keress. A sztringeket most tekintsk olyan tmbknek, amelyek karaktereket tartalmaznak (sok programozsi nyelvben ez egybknt nem ll tvol a konkrt megvalststl). Legyen A az a tmb, amelyben keresnk, B pedig a keresett sztring karaktereit tartalmaz tmb. Legyen N az A hossza, M pedig B hossza (karaktereinek szma). gy nyilvnval, hogy a legutols karakterpozci, ahol az illeszkeds egyltaln bekvetkezhet az (N M). pozci. Az albbi egyszer algoritmus kirja az els olyan kezdpozcit, ahol a B illeszkedik A-ra. Ha nincs ilyen, akkor pedig azt, hogy a keresett sztring nem tallhat. eljrs egyszerMintailleszts I = 0 J = 0 K = 0 ciklus, amg I (N M) s J < (M 1) ha A[K] = B[J], akkor K = K + 1 J = J + 1 klnben I = I + 1
13

E hrom algoritmus elemzsekkel egytt megtallhat tbbek kztt itt: Thomas H. Cormen Charles E. Leiserson Ronald L. Rivest: Algoritmusok, 34. fejezet. Mszaki Knyvkiad, Budapest, 1997.

54

ALGORITMIZLS ALAPJAI

J = 0 K = I elgazs vge ciklus vge ha J = (M 1), akkor ki: "Illeszkedik ezen a pozcin:", I klnben ki: "Nincs illeszkeds." eljrs vge 35. kp Egyszer mintailleszts

5.4 SSZEFOGLALS
Ebben a leckben olyan elemi algoritmusokkal ismerkedtnk, amelyek adatsorbl egy adatot lltanak el. Javasoljuk, hogy az Olvas is talljon ki az ismertetett pldkban ltottakhoz hasonl krdseket, s prblja megadni a megoldsok algoritmust. Feladatokat konkrt adatok ismerete nlkl is kitallhatunk. Ebben az esetben mg nagyobb szerepe van annak, hogy olyan algoritmusokat adjunk meg, amelyek fel vannak ksztve a szlssges esetekre is.

5.5 NELLENRZ KRDSEK


1. Milyen esetekben kell teljes keresst alkalmaznunk? 2. Mit jelent a mintailleszts kifejezs? 3. Milyen okbl kapta a nevt a logaritmikus keress? 4. Gondolja vgig, hogyan keres meg egy szmot a telefonknyvben vagy egy szt a sztrban (ne online adatbzisra, hanem nyomtatott knyvre gondoljon)! Prbljon meg algoritmust adni erre a mdszerre!

5.6 GYAKORL TESZTEK

55

ALGORITMIZLS ALAPJAI

6. LECKE: ADATSORHOZ ADATSORT RENDEL ELJRSOK 1.


6.1 CLKITZS
Ebben a fejeztben olyan algoritmusokkal ismerkednk, amelyek adatsorbl adatsort, vektorok esetben a forrsadatokbl vektort lltanak el. Ez lehet egy msik vektor, vagy pl. a rendezeljrsok esetben maga a forrsvektor. 6.2

TARTALOM
A leckben az albbi algoritmusokat mutatjuk be: Kivlogats sszefuttats

6.3 A TANANYAG KIFEJTSE


6.3.1 Kivlogats

Adott az N elem A vektor s egy T tulajdonsg. Msoljuk a B vektorba A sszes T tulajdonsg elemt! Az eljrs leginkbb a korbban trgyalt megszmlls ttelre hasonlt. Megjegyezzk, hogy br az albbiakban olyan eljrst mutatunk be, melyben az eredmnyknt ltrehozott adatsor egy vektor, ez helyfoglals szempontjbl nem hatkony megolds. Ha elzetesen nem rendelkeznk informcival arrl, hogy az A vektorban hny T tulajdonsg elem tallhat, a B deklarcijakor csak az A elemszmt vehetjk alapul. Ez egyedl abban az esetben nem jr felesleges helyfoglalssal, ha A minden eleme T tulajdonsg. Ennl a ttelnl az eredmnyadatsor adattpusnak clszerbb dinamikus adatszerkezetet (pl. lista) vlasztani. eljrs kivlogats J = 0 ciklus I = 0-tl (N 1)-ig ha A[I] T tulajdonsg, akkor B[J] = A[I] J = J + 1 elgazs vge ciklus vge eljrs vge Az eljrs vgn a J vltoz a B szmossgt (elemszmt) fogja trolni. Termszetesen J index eleme a B-nek sem lesz, hasonlan A-hoz, amelynek N index eleme nincs. A legnagyobb indexek (J 1) s (N 1). A kivlogatsnak egy specilis vltozata, amikor az eredmnyadatsor tartalmazza a forrsadatsorban tallhat sszes elemet, de mindegyiket csak egyszer (pldul ismerjk 100 aut adatait tpus, mrka, rendszm, szn, stb. , s ksztnk egy olyan kivlogatst, 56

ALGORITMIZLS ALAPJAI

amelynek eredmnye az az adatsor, amelyben szerepel minden tpus, de csak egyszer). Ehhez hasonl mvelet adatbzis-kezel rendszereknl az a lekrdezs, amelynek SQLparancsban szerepel a GROUP BY zradk. 36. kp Egyedek kivlogatsa

Egy lehetsges megoldsban az A vektor els elemt tmsoljuk a B vektor els index helyre, hiszen ezt megelzen a B vektor mg res14. Ezutn az A vektor msodik elemtl az utols elemig minden elem esetn vgrehajunk egy eldntst: az I index Abeli elem szerepel-e mr B-ben. Ha nem szerepel, akkor felvesszk B-ben az utols elem utni helyre. eljrs kivlogats2 B[0] = A[0] K = 1 ciklus I = 1-tl (N 1)-ig J = 0 ciklus, amg (J < K) s (A[I] B[J]) J = J + 1 ciklus vge ha (J = K), akkor B[K] = A[I] K = K + 1 elgazs vge ciklus vge ciklus vge eljrs vge Ez az eljrs kombinlhat megszmllssal is. Ekkor egy harmadik vektorban (C) azt tartjuk nyilvn, hogy B elemei hnyszor fordulnak el B-ben. Az els lpsben B els eleme A els eleme lesz, C els eleme pedig 1-es rtket kap. Az A msodik elemtl az utols elemig minden elemre vgrehajtunk egy eldntst: szerepel-e mr az I index A-beli elem B-ben. Ha nem, akkor felvesszk B utols eleme utn j elemknt, C-be pedig ezzel az indexszel felvesznk egy 1-es rtket. Ha igen, akkor C-ben megnveljk a megfelel index elem rtkt 1-gyel. 37. kp Egyedek kivlogatsa megszmllssal

14

Az res kifejezs pontatlan. A memriban lefoglalt terlet nem fgg a trolt adatok tartalmtl. A deklarcikor meg kell adnunk, hogy az egyes tmbelemek hny bjtot foglalnak. Pl. ha a tmb elemei 20 karakter hosszsg sztringek, akkor az egyenknt 20 vagy 40 bjtot foglalnak attl fggen, hogy a programozsi nyelv 8 vagy 16 bites jelkdolst alkalmaz. Dinamikus adatszerkezetek esetben az res kifejezs azt jelenti, hogy egyetlen eleme sincs s nem foglal memriaterletet. Vektorok esetben legfeljebb azt jelentheti az res sz, hogy az elemei valamilyen nulls kezdrtkkel rendelkeznek (numerikus adatok rtke 0 vagy 0.0, a karakterlncok rtke az res sztring).

57

ALGORITMIZLS ALAPJAI eljrs kivlogats3 B[0] = A[0] C[0] = 1 K = 1 ciklus I = 1-tl (N 1)-ig J = 0 ciklus, amg (J < K) s (A[I] B[J]) J = J + 1 ciklus vge ha (J = K), akkor B[K] = A[I] K = K + 1 klnben C[J] = C[J] + 1 elgazs vge ciklus vge eljrs vge 6.3.2 sszefuttats

Az sszefuttats ttele kt rendezett sorozatbl llt el egy harmadik rendezett sorozatot, melyben a kt input adatsor minden eleme szerepel, de ha egy elem mindkt adatsornak eleme volt, az eredmny adatsorban csak egyszer fog szerepelni. Kpzeljk el, hogy egy iskolban matematikbl s angolbl egy idben rendeznek tanulmnyi versenyt. A szervezk szeretnnek kimutatst kszteni arrl, hogy az iskola sszes tanuljnak hny szzalka vett rszt a versenyen nv szerint kik azok a tanulk, akik rszt vettek valamelyik versenyen. gy ha egy tanul mindkt versenyen rszt is vett, ebben a nvsorban csak egyszer fog szerepelni a neve. A kivlogatshoz hasonlan az eredmnyadatsor szmra a vektor nem optimlis adatszerkezet, mert nem tudjuk, hogy hny elem eleme mindkt input adatsornak. Ha egyetlen olyan X elem sincs, hogy X A s X B, akkor C elemszma N + M lesz, ahol N A elemszmt, M pedig B elemszmt jelli: N = |A| , M = |B|, |C| = N + M. Mivel nem minden esetben tudhatjuk, hogy mennyi az ismtld elemek szma, C-t (N + M) mretre kell deklarlnunk. Az A vektor elemeit az I, a B vektor elemeit a J indexvltoz segtsgvel rjk el. A C elemeinek indexvltozja K lesz. A s B elemeit pronknt hasonltjuk ssze (A[I]-t B[J]-hez hasonltva). A kt elem kzl a kisebbet bemsoljuk C-be. Ha a kisebb elem Abl val, akkor az I, ha B-bl val, akkor a J rtkt nveljk eggyel. Ha A[I] = B[J], akkor A[I]-t msoljuk a C[K] helyre, s I-t s J-t is nveljk eggyel. ltalban nem egyszerre fogynak el az elemek A-bl s B-bl, ezrt ha egy A-beli elemet mr egyetlen B-beli elemhez sem tudunk hasonltani, mert elfogytak B elemei, akkor A sszes maradk elemt t kell msolnunk C-be. Hasonl a helyzet akkor is, ha A elemei fogynak el hamarabb. 38. kp sszefuttats eljrs sszefuttats 58

ALGORITMIZLS ALAPJAI

K = 0 I = 0 J = 0 ciklus, amg (I N 1) s (J M 1) ha A[I] < B[J], akkor C[K] = A[I] I = I +1 klnben ha A[I] > B[J], akkor C[K] = B[J] J = J + 1 klnben C[K] = A[I] I = I + 1 J = J + 1 elgazs vge K = K + 1 ciklus vge ciklus, amg I N 1 C[K] = A[I] I = I + 1 K = K + 1 ciklus vge ciklus, amg J M 1 C[K] = B[J] I = I + 1 K = K + 1 ciklus vge eljrs vge

6.4 SSZEFOGLALS
Ez a lecke kt olyan algoritmust trgyalt, melyeket gyakran hasznlunk pl. adatbzis-kezel rendszerekben. Az adatbzis-kezel rendszerekben hasznlt mveletek kztt az egyik leggyakoribbak az n. lekrdezsek, amelyek sorn az adatbzisban trolt egyedekre, azok egyes mezire megfogalmazott feltteleket hasznljuk a keresett rekordok elrshez. A kivlogats gy is rtelmezhet, mint egy egytbls lekrdezs, amelyben a felttel egyetlen mezre vonatkozik. A lekrezsek ennl termszetesen sokkal bonyolultabbak is lehetnek, clunk az elemi algoritmus bemutatsa volt. Az sszefuttatshoz hasonl ttel a halmazelmletben ismert egyests (uni) mvelett vgrehajt algoritmus. Az sszefuttats azonban annyiban hatkonyabb, hogy nem ignyel keresst, mivel a kt eredeti vektor elemeit prhuzamosan dolgozza fel rendezettsgk miatt.

59

ALGORITMIZLS ALAPJAI

6.5 NELLENRZ KRDSEK


1. Milyen kapcsolat van a kivlogats ttele s az adatbzis-kezel rendszerekben vgezhet lekrdezsek kztt? 2. Milyen felttelek mellett hajthat vgre kt adatsoron az sszefuttats ttele? 3. Milyen sszefggs van az adatsor elemszma s az eredmnyhalmaz elemszma kztt kivlogats esetn? 4. Mirt nem hatkony adatszerkezet a tmb egy kivlogats eredmnyhalmaznak trolshoz?

6.6 GYAKORL TESZTEK

60

ALGORITMIZLS ALAPJAI

7. LECKE: ADATSORHOZ ADATSORT RENDEL ELJRSOK 2. RENDEZ ELJRSOK


7.1 CLKITZS
A korbbi leckkben ismertetett eljrsok kztt tbbnl szerepelt az az elfelttel, hogy az adatsornak rendezettnek kell lennie. Ebben a leckben rendezeljrsokkal fogunk ismerkedni. Az albbiakban bemutatott eljrsok mindegyike a bemenetknt kapott tmbben rendez, teht nem j adatsort llt el, hanem az input adatsor elemeinek sorrendjt megvltoztatva lltja el az output adatsort. Ezek a rendez eljrsok teht n. bels rendezsek. A rendezsek sorn az A adatsornak egy olyan permutcijt lltjuk el, melyben igaz, hogy ai ai+1 (nvekv sorrend) vagy ai ai+1 (cskken sorrend), ahol ai A, i = 0 .. (n 1). Szmos rendez eljrs ismeretes, ezek kzl ebben a jegyzetben csak nhny nagyon kzismert mdszert mutatunk be, s azokat is csak vektorokon. Az algoritmizls, algoritmuskszts szakirodalmban az abszolt alapvetnek tartott egyik mben, Donald Ervin Knuth (1938) A szmtgp-programozs mvszete cm knyvsorozatnak 1978ban megjelent 3. ktetben a szerz kb. 25 eljrst mutat be, jelezve, hogy ennl (mr akkor) lnyegesen tbb eljrst publikltak. 39. kp Donald Ervin Knuth

7.2 TARTALOM
kt elem cserje egy vektorban renezs kzvetlen kivlasztssal buborkrendezs rendezs szlsrtk-kivlasztssal beszr rendezs Shell mdszere gyorsrendezs rendezeljrsok hatkonysga

7.3 A TANANYAG KIFEJTSE


7.3.1 Kt elem cserje egy vektorban

A rendezsek sorn az A adatsor (vektor) egy olyan permutcijt lltjuk el, melyben igaz, hogy ai ai+1 (nvekv sorrend) vagy ai ai+1 (cskken sorrend), ahol ai A, i = 0 .. (n 1). Ahhoz, hogy az elemek sorrendjt megvltoztathassuk, a rendez eljrsokban az I s J index tmbelem cserjhez az albbi rtkadsokat fogjuk hasznlni: S = A[I] A[I] = A[J] 61

ALGORITMIZLS ALAPJAI A[J] = S Megjegyzs: ha a tmbelemek numerikus adatok, akkor a csere trtnhet segdvltoz nlkl is: A[I] = A[I] + A[J] A[J] = A[I] A[J] A[I] = A[I] A[J] 7.3.2 Rendezs kzvetlen kivlasztssal

Az eljrs nem hoz ltre j adatszerkezetet, ahnem a bemen struktra elemeit rendezi, pldnkban ez a pldnkban a megszokott mdon egy vektor. Az algoritmus kt egymsba gyazott ciklust hasznl. A kls ciklus vltozja (I) azt mutatja meg, hogy a tmb hnyadik elemtl kezddik a mg rendezetlen tmbrsz. Az eljrs kezdetn ez az els elem (I = 0). A bels ciklus J = (I + 1)-tl a htralv elemeket hasonltja hozz, s ha kisebbet (nagyobbat) tall, rgtn felcserli ket. Ha az utols elemmel is sszehasonltotta a mg rendezetlen tmbrsz els elemt, akkor ez az elem biztosan a helyre kerlt. Ekkor az I = (I + 1) index elemhez hasonltjuk az t kevet elemeket, egszen az I = (I 2) index elemig, amelyet az (I 1) index elemhez hasonltva a vektor rendezett lesz. Egyszer rendezsi eljrsrl van sz, mgsem hasznljuk, mert nagyon nagy lehet a felesleges cserk szma, s ez a futsi id nvekedst eredmnyezi. 40. kp Rendezs kzvetlen kivlasztssal

eljrs rendezsKzvetlenKivlasztssal ciklus I = 0-tl (N 2)-ig ciklus J = (I + 1)-tl (N 1)-ig ha A[J] < A[I], akkor S = A[I] A[I] = A[J] A[J] = S elgazs vge ciklus vge ciklus vge eljrs vge 7.3.3 Buborkrendezs

Ebben a rendez eljrsban szomszdos elemeket hasonltunk egymshoz. Ha a J s (J + 1) index elemek sorrendje nem j (pl. nvekv sorrendet szeretnnk elrni, de A[J] > A[J + 1]), akkor felcserljk ket. Ha J = 0-tl (N 2)-ig az sszes {J, (J + 1)} elemprt sszehasonltottuk s szksg esetn felcserltk, akkor a tmb (N 1) index (utols) eleme a helyre kerlt. Ekkor jrakezdjk a vizsglatokat J = 0-tl (N 3)-ig, stb. 41. kp 62 Buborkrendezs

ALGORITMIZLS ALAPJAI

eljrs buborkrendezs ciklus I = (N 1)-tl 1-ig 1 lpskzzel ciklus J = 0-tl (I 1)-ig ha A[J] > A[J + 1], akkor S = A[J] A[J] = A[J + 1] A[J + 1] = S ciklus vge ciklus vge ciklus vge eljrs vge Abban az esetben, ha a tmb nagyon rendezetlen (pl. egy nvekv sorrendben lv elemeket tartalmaz tmbt szeretnnk cskken sorrend szerint rendezni) a cserk szma itt is jelents, teht ez az eljrs sem tekinthet hatkonynak. 7.3.4 Rendezs szlsrtk-kivlasztssal

A cserk szmt tekintve az elz rendez eljrsoknl jval hatkonyabb rendezs lehet a szlsrtk-kivlasztsos rendezs. A szlsrtket mely lehet maximum s minimum mindig a mg rendezetlen tmbrszben keressk meg, majd felcserljk a (mg rendezetlen) tmbrsz els vagy utols elemvel, attl fggen, hogy nvekv vagy cskken sorba szeretnnk-e rendezni az adatokat, illetve minimumot vagy maximumot keresnk. 42. kp Rendzs szlsrtk-kivlasztssal (minimumkivlasztssal)

A ttel alkalmazsa sorn egy N elem tmbben maximum (N 1) csere trtnik, mivel az utols elempr cserjekor kt elem kerl a vgleges helyre. A rendezs itt is kt egymsba gyazott ciklussal trtnik. A kls ciklus vltozja (I) azt mutatja meg, hogy a tmb hnyadik elemtl kezdve rendezetlen mg, a bels ciklus pedig az (I + 1) index tmbelemtl az (N 1) indexig (az utolsig) megvizsglja, hogy a mg rendezetlen tmbrszben van-e kisebb (nagyobb) elem, mint a mg rendezetlen tmbrsz els eleme. Ha van, akkor annak indext megjegyezve a kvetkez elemet mr ahhoz hasonltja, mint lehetsges szlsrtkhez. Az (N 1) index elem vizsglata utn a mg rendezetlen tmbrsz szlsrtk-elemt felcserli a mg rendezetlen tmbrsz els elemvel ha szksges. Akkor nem szksges a csere, ha a mg rendezetlen tmbrsz els eleme a tmbrsz szlsrtke, vagyis ez az elem eredetileg is a megfelel helyen volt. Az albbi algoritmus a minimumkivlasztsos rendezst mutatja be. Ebben a pldban az A tmb elemeit nvekv sorba rendezzk. eljrs rendezsMinimumkivlasztssal ciklus I = 0-tl (N 2)-ig MININDEX = I ciklus J = (I + 1)-tl (N 1)-ig ha A[J] < A[MINHELY], akkor 63

ALGORITMIZLS ALAPJAI MINHELY = J elgazs vge ciklus vge ha MINHELY I, akkor S = A[I] A[I] = A[MINHELY] A[MINHELY] = S elgazs vge ciklus vge eljrs vge 7.3.5 Beszr rendezs

Az eljrs megrtshez kpzeljk el, hogy a keznkben lv (rendezetlen sorrend) krtyalapokat szeretnnk sorba rendezni (vagy a kapott csomagot az asztalrl laponknt felvve kialaktani a renezett sorozatot). A soron kvetkez krtyalapot kzbe vve megkeressk a helyt a mr rendezett lapok kztt, s a beszrs helye utni lapokat egy hellyel jobbra mozgatjuk, amg a rendezetlen rsz utols eleme is a helyre nem kerl a rendezett lapok kztt. 43. kp Beszr rendezs

eljrs beszrRendezs ciklus I = 1-tl (N 1)-ig J = I 1 X = A[I] ciklus, amg (J 0) s (X < A[J]) A[J + 1] = A[J] J = J 1 ciklus vge A[J + 1] = X eljrs vge 7.3.6 Shell mdszere nll rendezsi beszr rendezs Az eljrs (ms az elemeket. Az elemek nagyobb

Donald L. Shell (1924) 1959-ben publiklt mdszere nem algoritmus, brmilyen ms algoritmus hatkonysga javthat vele. A vizsglatakor lthat, hogy az eljrs futsi ideje N2-tel arnyos. algoritmusokhoz hasonlan) egyszerre csak egy hellyel mozgatja el tlagos hatkonysgon nvelni tudunk, ha megengedjk, hogy az ugrsokat is megtegyenek egy lpsben. 44. kp Donald L. Shell

64

ALGORITMIZLS ALAPJAI

A Shell-mdszer alapgondolata az, hogy definilunk egy sorozatot, amely azt mutatja meg, hogy a rendezs egyes futamaiban az egymstl hny lpsre lv elemeket rendezzk. Knuth a Szmtgp-programozs mvszete cm knyvben ezt a mdszert fogy nvekmnyes mdszernek nevezte el, s bebizonytja, hogy ennek a sorozatnak az elemei brmilyen (egszekbl ll) szmsorozatot alkothatnak, de a sorozat elemeinek egyre kisebbeknek kell lennik s az utols elemnek 1-nek kell lennie, vagyis a rendezs utols futamban a teljes sorozat egyms melletti elemein vgezzk a rendezst. Knuth azt is megmutatja, hogy vannak jobb s rosszabb hatkonysg sorozatok. Ezen bizonytsok bemutatsa nem trgya jegyzetnknek. A cserk szmnak tlagt azrt cskkenti (akr jelentsen) a Shell-fle mdszer, mert mire az egymstl nagyobb tvolsgra lv elemeken vgzett futamokat vgrehajtottuk, a vektor (vagy ms adatsor) elemeinek sorrendje kzelebb fog llni a rendezett sorrendhez, mint eredetileg. A Shell-mdszer futamai teht nagyjbl rendezik az elemeket, minden futam jobban, mint az elz. Ezzel nagyon sok felesleges csere is elkerlhet. 45. kp A Shell-fle mdszer

Az albbiakban a beszr rendezs Shell-fle mdszerrel javtott vltozatt mutatjuk be. A pldban a futamok fogy nvekmnye a D = (

N N + 1, + 1, K,1 ) sorozat lesz. 3 9

eljrs beszrRendezsShellMdszervel D = N ciklus D = D / 3 + 1 ciklus E = 0-tl (D 1)-ig J = E + D ciklus, amg J N I = J D X = A[J] ciklus, amg (I 0) s (X < A[I] A[I + D] = A[I] I = I D ciklus vge A[I + D] = X J = J + D ciklus vge ciklus vge amg D > 1 eljrs vge 7.3.7 Gyorsrendezs

Az eljrs Sir Charles Antony Richard Hoare (1934) nevhez fzdik, s valban gyors, mert a besl ciklusok ltalban nagyon gyorsan lefutnak. Egy nagy elemszm 65

ALGORITMIZLS ALAPJAI adatsor esetben a gyorsrendezs akr nagysgrenddel gyorsabb lefutst eredmnyez ms, kevsb hatkony rendezeljrssal sszehasonltva. 46. kp Sir Charles Antony Richard Hoare

Az eljrs alapgondolata az, hogy egy adatsor valamely elemt mozgassuk arra a helyre, amely helyet a rendezett adatsorban foglalna el. Kzben rendezzk t az adatsor tbbi elemt is gy, hogy a nla kisebb index elemek rtkei ne legyenek tle nagyobbak, a nla nagyobb index elemek rtkei pedig ne legyenek tle kisebbek. Ezutn osszuk kt rszre az adatsort ezen elem mentn, s ismteljk meg ezt az eljrst a kt rszadatsorra is. Az gy sztvlogatott kt rszt kt-kt tovbbi rszre osztja egy-egy jabb kzpelem, gy azokra a rszadatsorokra is hajtsuk vgre ezt az eljrst, s gy tovbb, egszen addig, amg a teljes rendezettsg be nem kvetkezik. Ebbl a lersbl lthat, hogy ez a mdszer a megoldand problmt kisebb s kisebb rszekre bontja, majd a megoldst ezeken az egyre kisebb rszeken hajtja vgre gy, mintha a kiindul feladat ezekre a kisebb problmkra vonatkozott volna. Ms szavakkal az eljrs nmagt hvja a megolds sorn. Ezt a mdszert nevezzk rekurzinak. A rekurzival gyakran tallkozunk a matematika klnbz terletein. A kombinatorikbl ismert az n. faktorilis fggvny, n!= 1 2 3 K (n 1) n Kiszmtshoz hasznlhat az albbi rekurzv definci is:

1, n = 0 esetn n!:= n (n 1)!, egybknt


fggvny faktorilis(N) ha N = 0, akkor faktorilis = 1 klnben faktorilis = N * faktorilis(N 1) fggvny vge A rekurzirl a 10. fejezetben bvebben olvashatunk. Trjnk vissza most a gyorsrendezshez, melynek algoritmust rekurzv mdon fogjuk megadni. A fent lerottakbl kvetkezik, hogy az lenne j, ha meg tudnnk mondani, hogy a sztvlogatand elemsorozatnak melyik az az eleme, amelyet kzpre kellene mozgatnunk, mert ez az elem kt azonos mret rszsorozatra bontan a rendezend sorozatot. Mivel ennek az elemnek a megkeresse csak egy msik eljrssal lenne megoldhat, s ez felesleges idvesztesget okozna, nem keressk az optimlis elemet, hanem nknyesen vlasztunk egyet. Lehet, hogy gy az egyik rszsorozat kevesebb elemet fog tartalmazni, mint a msik, de az algoritmus ettl fggetlenl helyesen fog mkdni, legrosszabb esetben lassabban. 47. kp Robert Sedgewick

66

ALGORITMIZLS ALAPJAI

A legjobb megolds Robert Sedgewick (1946) mdszere. Ez kt mutatt hasznl: I = 1-et s J = (N 1)-et. Felttelezve, hogy a sztvlogats utn A[I] a bal rszsorozathoz fog tartozni, nveljk meg I-t addig, amg egy olyan A[I] elemhez rnk, amely a jobboldali rszsorozat eleme lesz majd. A J rtkt pedig cskkentsk addig, amg egy a bal oldali rszsorozathoz tartoz A[J]rtket nem tallunk. Ha I < J, akkor A[I]-t s A[J]-t felcserljk, majd folytatjuk a feldolgozst, amg I J nem teljesl. Az utols csere A[J] s A[0] cserje. 48. kp Gyorsrendezs

eljrs gyorsrendezs(A, ALS, FELS) I = ALS J = FELS X = A[(ALS + FELS) / 2] ciklus ciklus, amg A[I] < X I = I + 1 ciklus vge ciklus, amg A[J] > X J = J 1 ciklus vge ha I < J, akkor S = A[I] A[I] = A[J] A[J] = S elgazs vge ha I J, akkor I = I + 1 J = J 1 elgazs vge amg I J ha ALS < J, akkor gyorsrendezs(A, ALS, J) elgazs vge ha I < FELS, akkor gyorsrendezs(A, I, FELS) elgazs vge eljrs vge 7.4

SSZEFOGLALS

Ebben a leckben olyan eljrsokkal foglalkoztunk, amelyek rendezetlen adatsorokat rendezettekk tesznek. Szeretnnk hangslyozni, hogy a fenti eljrsok csak kiragadott pldk, a programozs irodalmban ennl lnyegesen tbb algoritmust publikltak mr. A

67

ALGORITMIZLS ALAPJAI kzlt eljrsok mind tmbket hasznlnak, de termszetesen ms adatszerkezetek elemei is rendezhetk. Nem biztos, hogy a fent kzlt eljrsok a legegyszerbbek, de biztos, hogy nem a leghatkonyabbak. A hatkonysg krdse mindig tbbrt: egy eljrs hatkonysgt vizsglhatjuk gyorsasg, bonyolultsg s trfoglals tekintetben is. Biztos, hogy a fent kzlt eljrsok az egyszerbbek kz tartoznak, de nem biztos, hogy a legkzenfekvbb mdszereket mutatjk be. Akinek van r lehetsge, vgezze el az albbi ksrletet: krjk meg nhny ismersnket, hogy rakjanak sorba egy csomag szmkrtyt az asztalon. Hogy a klnbz szemlyek mdszert ssze tudjuk hasonltani, igyekezznk hasonl krlmnyeket teremteni: pl. a krtyk sorrendje legyen lvletlen, vagyis legyenek sszekeverve, de mindig azonos sorrendben kvessk egymst a lapok. Ksrletezznk sok (pl. 25-nl tbb) s kevs (5-6) krtyval is! Figyeljk meg, van-e klnbsg az alkalmazott mdszerek kztt! Figyeljk meg a mdszereket s prbljuk ket algoritmizlni!

7.5 NELLENRZ KRDSEK


1. Hogyan mrhetjk meg egy rendezs hatkonysgt? (Termszetesen az a szempont nem jhet szba, hogy helyes sorrendet lltanak-e el, hiszen ez minimlis kvetelmny.) 2. A fent kzlt eljrsok kzl melyik az, amelyik a legkzelebb ll htkznapi mdszerekhez? Mirt? 3. A rendezs ttelei nemcsak numerikus adatokon hasznlhatk, mert pl. hasonl elven trtnik a betrendbe sorols is. Gondoljuk t, hogy hogyan tudnnk magyar szavakat betrendbe sorolni! Gondolkodjunk el a konkrt gpi megvalstsok okozta nehzsgeken is (pl. az ASCII, ISO-8859-2 s UNICODE kdrendszerek egyikben sem a magyar betrendnek megfelel sorrendben kvetik egymst a betk). 4. A fenti pldk egy-egy adatsor rendezst mutattk be. Tblzatkezelkben, adatbzis-kezel rendszerekben termszetes, hogy tbb tulajdonsg alapjn is rendezhetnk. Gondolkodjunk el azon, hogyan algoritmizlnnk azt a feladatot, ha adott egy neveket, egy letkorokat s egy lakhelyeket tartalmaz vektor, s szeretnnk bennk az elemeket gy trendezni, hogy az adatok sorrendje lakhely szerint legyen rendezve, az azonos lakhelyen lakk kztt dntsn az letkor. Kt azonos lakhely s letkor szemly sorrendjben dntsn a nv!

7.6 GYAKORL TESZTEK

68

ALGORITMIZLS ALAPJAI

8. LECKE: PLDK AZ ELJRSOK ALKALMAZSRA


8.1

CLKITZS

Ez a lecke az elz ngy leckben bemutatott elemi vektorkezel eljrsokra pl pldkat mutat be. 8.2 8.2.1

TARTALOM
Pldk a ttelek alkalmazsra

4.3.8.1 Hegymsz
Egy hegymsz 20 kilomteres trt tett, s kilomterenknt megmrte az tengerszint feletti magassgot. Az albbi rtkeket rgztette az ADATOK vektorban: 49. kp ADATOK[ ]
650 0 628 1 658 2 683 3 683 4 683 5 644 6 611 7 645 8 619 9 619 10 580 11 580 12 626 13 626 14 626 15 598 16 636 17 612 18 584 19

A hegymsz rgztette adatok

1. Hnyadk mrsnl jrt a legmagasabban? eljrs hegymsz1 MAXHELY = 0 ciklus I = 1-tl 19-ig ha ADATOK[I] > ADATOK[MAXHELY], akkor MAXHELY = I elgazs vge ciklus vge ki: MAXHELY eljrs vge 2. Hnyadik mrsnl jrt a legalacsonyabban? eljrs hegymsz2 MINHELY = 0 ciklus I = 1-tl 19-ig ha ADATOK[I] < ADATOK[MINHELY], akkor MINHELY = I elgazs vge ciklus vge ki: MINHELY 69

ALGORITMIZLS ALAPJAI eljrs vge 3. Mennyi volt a mrsek tlaga? eljrs hegymsz3 SUM = ADATOK[0] ciklus I = 1-tl 19-ig SUM = SUM + ADATOK[I] ciklus vge ki: SUM / 20 eljrs vge 4. Jrt-e 1000 mter fltti magassgban? eljrs hegymsz4 I = 0 ciklus, amg (I <= 19) s (ADATOK[I] <= 1000) I = I + 1 ciklus vge ha (I <= 19) akkor ki: "Igen, jrt 1000 mter fltt" klnben ki: "Nem, nem jrt 1000 mter fltt" elgazs vge eljrs vge

5. Hny alkalommal mrt 600 s 650 mter kztti magassgot? eljrs hegymsz5 DB = 0 ciklus I = 0-tl 19-ig ha (ADATOK[I] >= 600) s (ADATOK[I] <= 650), akkor DB = DB + 1 elgazs vge ciklus vge ki: DB eljrs vge 6. Mennyi volt az ltagos magassg a legalacsonyabb s a legmagasabb pont kztt? A feladat kt elemi algoritmussal megoldhat: 1. meg kell keresnnk a legalacsonyabb s a legmagasabb mrs helyt (szlsrtk-kivlaszts), 2. a kt mrs kztt kell kiszmtanunk a mrsek tlagt (sszegzs). Felttelezzk, hogy van 70

ALGORITMIZLS ALAPJAI

szintklnbsg a legalacsonyabb s a legmagasabb pont kztt (nem a Hortobgyon stlt a hegymsz): eljrs hegymsz6 MINHELY = 0 MAXHELY = 0 ciklus I = 1-tl 19-ig ha ADATOK[I] > ADATOK[MAXHELY], akkor MAXHELY = I elgazs vge ha ADATOK[I] < ADATOK[MINHELY], akkor MINHELY = I elgazs vge ciklus vge ha MINHELY < MAXHELY, akkor ELEJE = MINHELY VGE = MAXHELY klnben ELEJE = MAXHELY VGE = MINHELY elgazs vge SUM = 0 ciklus I = ELEJE-tl VGE-ig SUM = SUM + ADATOK[I] ciklus vge ki: SUM / (VGE ELEJE + 1) eljrs vge 7. Melyik kt mrs kztt volt a legmeredekebb lejt? A megolds tulajdonkppen egy maximumkivlaszts. Sorra meg kell llaptanunk az 12., 23., 34. stb. mrsek klnbsgt, ahol ez az rtk a legnagyobb, ott volt a legmeredekebb lejt. Gondot okozhat a MAX kezdrtknek meghatrozsa: azrt lltjuk 1-re, mert a 1-es rtk azt jelenti, hogy a kt mrs kztt emelked volt, azaz brmilyen csekly lejt is van a mrsek kztt, annak mrtke biztosan nagyobb, mint 1. eljrs hegymsz7 MAX = -1 MAXHELY = 1 // a 1 egy nem ltez helyen mrt "lejt" ciklus I = 0-tl 18-ig ha ADATOK[I] ADATOK[I + 1] > MAX, akkor MAX = ADATOK[I] ADATOK[I + 1] MAXHELY = I elgazs vge ciklus vge 71

ALGORITMIZLS ALAPJAI ki: "A legnagyobb lejt: a(z) ", I, I + 1, "pont kztt." eljrs vge 8. s a legmeredekebb emelked? A megolds megegyezik az elz feladatval, az eltrs annyi, hogy most egy minimumkivlasztst rdemes alkalmaznunk. A MIN kezdrtke az elz feladatban lertak szerint clszeren 1 lehet, hiszen az 1-es rtk lejtnek felel meg, ennl minden emelked meredekebb (vagyis a klnbsg minden emelked esetn negatv szm lesz). eljrs hegymsz8 MIN = 1 MINHELY = 1 ciklus I = 0-tl 18-ig ha ADATOK[I] ADATOK[I + 1] < MIN, akkor MIN = ADATOK[I] ADATOK[I + 1] MINHELY = I elgazs vge ciklus vge ki: "A legnagyobb emelked: a(z) ", I, I + 1, "pont kztt." eljrs vge 9. Jrt-e fennskon a hegymsz? (A fennskot definiljuk gy: 600 m fltt kt egymst kvet mrs kztt 5 m-nl kisebb az eltrs.) A megolds egy egyszer eldnts: van-e kt olyan, egymst kvet pont, melyek mindegyike 600 m fltti s klnbsgk kisebb, mint 5 m? eljrs hegymsz9 I = 0 ciklus, amg (I <= 18) s (abs(ADATOK[I] ADATOK[I+1]) >= 5 vagy ADATOK[I] < 600 vagy ADATOK[I+1] < 600) I = I + 1 ciklus vge ha I <= 19 akkor ki: "Igen, van fennsk." klnben ki: "Nem, nincs fennsk." eljrs vge Az abs(x) kifejezs x abszoltrtkt jelli abs(X) = |X|

72

ALGORITMIZLS ALAPJAI

10. Mennyi volt a teljes megtett szintklnbsg? Ez egy sszegzssel megadhat, mindssze arra kell figyelnnk, hogy minden szintklnbsg eljelt pozitvnak tekintsk! eljrs hegymsz10 SUM = 0 ciklus I = 0-tl 18-ig DIFF = ADATOK[I] ADATOK[I + 1] ha DIFF < 0, akkor DIFF = DIFF * (1) // vagy DIFF = ABS(DIFF) elgazs vge SUM = SUM + DIFF ciklus vge ki: SUM eljrs vge 11. Hol van a msodik legmagasabb pont? Egy megoldsi lehetsg, hogy elszr megkeressk a legmagasabb pontot, majd jrakezdjk a keresst, s gy keressk a legmagasabb pontot, hogy kzben kizrjuk az egyenlsget az elbb megkeresett, valban legmagasabb ponttal. eljrs hegymsz11 MAXHELY = 0 ciklus I = 1-tl 19-ig ha ADATOK[I] > ADATOK[MAXHELY], akkor MAXHELY = I elgazs vge ciklus vge ha MAXHELY = 0, akkor // ha vletlenl pp az els pont a legmagasabb MAXHELY2 = 1 klnben MAXHELY2 = 0 elgazs vge ciklus I = (MAXHELY2 + 1)-tl 19-ig ha (ADATOK[I] > ADATOK[MAXHELY2]) s (I MAXHELY), akkor MAXHELY2 = I elgazs vge c .v ki: MAXHELY2 eljrs vge 12. Mennyi id alatt tette meg a teljes tvot az elstl az utols mrsig? 73

ALGORITMIZLS ALAPJAI Tegyk fel, hogy hegymsznk nem fradkony, gy a tra vgn ugyanolyan sebessggel haladt, mint az elejn: hegymenetben 3 km/h, lejtmenetben 6 km/h, vzszintes terepen pedig 5 km/h sebessggel. eljrs hegymsz12 S1 = 20 // 20 perc alatt egy kilomter hegymenetben S2 = 10 // 10 perc alatt egy kilomter lejtmenetben S3 = 12 // 12 perc alatt egy kilomter sk terleten SUM = 0 ciklus I = 0-tl 18-ig DIFF = ADATOK[I] ADATOK[I + 1] ha DIFF > 0, akkor SUM = SUM + S1 klnben ha DIFF < 0, akkor SUM = SUM + S2 klnben SUM = SUM + S3 elgazs vge ciklus vge Ki: SUM // ra:perc-ben megadva: Ki: SUM div 60, SUM mod 60 // ahol a div az egszoszts, // a mod pedig az oszts maradkt kiszmt opertor // (pl. 15 div 4 = 3, 19 mod 6 = 1). eljrs vge 13. Hny fennskon jrt a hegymsz? Vlasz: ngyen. Fennsk van a 23, az 56, a 1011 s a 1416 mrsek kztt. A 1213 pontok kztt nem, mert az 600 m alatt van! 14. Adjuk meg valamelyik mrs sorszmt, majd keressk meg azokat a mrsi pontokat, amelyek errl a pontrl lthatk! Pl. a 4-es pontrl lthat pontok az 13, illetve az 5. pont, a tbbi nem, mert az 56 pont hegycscsa eltakarja ket. Az utols kt feladat megoldst az Olvasra bzzuk!

4.3.8.2 Hres emberek


Ismerjk 30 hres ember fenti adatait15. Az adatokat nem egy, hanem 6 tmbben troljuk, mind a hat tmb egydimenzis. Az sszetartoz adatokat a tmbk indexei ktik ssze: pl. a 15-s index hres ember minden adatnak indexe 15. (NV[15] = "Talmcsi Gbor", SZLETETT[15] = 1981, stb., lsd a kiemelt sort.) A MEGHALT tmb rtke a

15

Az adatok 2010 jniusban voltak rvnyesek.

74

ALGORITMIZLS ALAPJAI

ma (2010. jnius) l szemlyek esetben 0. A GOOGLE tmbben tallhat rtkek az adott szemly nevre keresve a Google ltal adott tallatok krlbelli szmt jelenti.
NV Alain Delon Marcus Grnholm David Beckham Vlagyimir Kramnyik Luc Besson Juliette Binoche Woody Allen Laurence Olivier Julia Roberts Sndor Pl Esterhzy Pter Papp Lszl Eric Clapton Ernest Hemingway Mika Waltari Talmcsi Gbor Louis Armstrong Mark Knopfler Jean-Paul Belmondo Agatha Christie Steven Spielberg Paavo Nurmi Walt Disney Colin Firth Btorfi Csilla Ds Lszl Borisz Paszternak Grdonyi Gza Kimi Rikknen Robert Merle SZLETETT 1935 1968 1975 1975 1959 1964 1935 1907 1967 1939 1950 1926 1945 1899 1908 1981 1901 1949 1933 1890 1946 1897 1901 1960 1969 1954 1890 1863 1979 1908 MEGHALT 0 0 0 0 0 0 0 1989 0 0 0 2003 0 1961 1979 0 1971 0 0 1976 0 1973 1966 0 0 0 1960 1922 0 2004 FOGLALKOZS sznsz sportol sportol sportol filmrendez sznsz sznsz sznsz sznsz filmrendez r sportol zensz r r sportol zensz zensz sznsz r filmrendez sportol filmrendez sznsz sportol zensz r r sportol r NEMZETISG francia finn angol orosz francia francia amerikai angol amerikai magyar magyar magyar amerikai angol finn magyar amerikai amerikai francia angol amerikai finn amerikai angol magyar magyar orosz magyar finn francia GOOGLE 1 580 000 232 000 20 100 000 22 800 2 570 000 1 860 000 6 330 000 1 030 000 5 660 000 26 000 180 000 296 000 8 770 000 2 600 000 149 000 99 900 4 200 000 2 300 000 477 000 4 470 000 4 840 000 99 600 28 000 000 2 070 000 9 560 38 600 46 000 221 000 2 450 000 75 100

1. Ki a legidsebb ma l r? Maximumkivlaszts. Azonban mivel nem mindenki r a fentiek kzl nem hasonlthatjuk az adatokat az els szemly adataihoz. eljrs hres1 MAX = 0 MAXHELY = 1 ciklus I = 0-tl 29-ig 75

ALGORITMIZLS ALAPJAI ha (FOGLALKOZS[I] = "r") s (2010 SZLETETT[I] > MAX), akkor MAX = 2010 SZLETETT[I] MAXHELY = I elgazs vge ciklus vge ki: NV[MAXHELY] eljrs vge 2010 helyett termszetesen az aktulis vszmot kell behelyettesteni. 2. tlagosan hny tallatot kapunk a Google-ban a fenti amerikaiak nevre keresve? sszegzs. gyeljnk az extrm esetekre is: mi van, ha nincs is kztk amerikai...? Eljrs hres2 SSZEG = 0 DB = 0 ciklus I = 0-tl 29-ig ha NEMZETISG[I] = "amerikai", akkor SSZEG = SSZEG + GOOGLE[I] DB = DB + 1 elgazs vge ciklus vge ha DB > 0, akkor ki: SSZEG / DB klnben ki: "Nincs kzttk amerikai." elgazs vge eljrs vge 3. Ki az az orosz r, aki 1960-ban halt meg? (Tudjuk, hogy pontosan egy ilyen van.) A feladat kirsa sejteti, hogy ez egy kivlaszts. Kivlasztsnl a ciklus felttele a kvetkez elemre val lps felttele: ha az aktulis elem nem az, amelyet kerestnk, lphetnk a kvetkezre. Ebben a feladatban a tovbblps felttele sszetett: P: orosz Q: r R: 1960-ban halt meg P Q R = orosz r, aki 1960-ban halt meg (P Q R) = P Q R: nem orosz, vagy nem r, vagy nem 1960-ban halt meg eljrs hres3 76

ALGORITMIZLS ALAPJAI

I = 0 ciklus, amg (NEMZETISG[I] "orosz") vagy (FOGLALKOZS[I] "r") vagy (MEGHALT[I] 1960) I = I + 1 ciklus vge ki: NV[I] eljrs vge 4. Mennyi az amerikaiak tlagletkora? (Csak a ma lket kell figyelembe venni.) Feltteles sszegzs s megszmlls. Csak arra kell kln figyelnnk, hogy van-e egyltaln mg ma l amerikai kzttk, nehogy 0-val osszunk. eljrs hres4 DB = 0 SSZEG = 0 ciklus I = 0-tl 29-ig ha (NEMZETISG[I] = "amerikai") s (MEGHALT[I] = 0), akkor SSZEG = SSZEG + (2010 SZLETETT[I]) DB = DB + 1 elgazs vge ciklus vge ha DB > 0, akkor ki: SSZEG / DB klnben ki: "Nincs kzttk ma l amerikai." elgazs vge eljrs vge A 2010 helyett termszetesen az aktulis vszmot kell behelyettesteni. 5. Ki az a francia sznsz, aki 1963-ban szletett? (Lehet, hogy nincs is ilyen.) Keress. Ha a Gipsz Jakab 1963-ban szletett francia sznszt felvesszk 30-as indexszel a tmbk vgre, akkor felrhat a strzss keress, anlkl csak a teljes keress jhet szba, mivel az adatok rendezetlenek. eljrs hres5a NV[30] = "Gipsz Jakab" NEMZETISG[30] = "francia" SZLETETT[30] = 1963 MEGHALT[30] = 0 FOGLALKOZS[30] = "sznsz" GOOGLE[30] = 0 77

ALGORITMIZLS ALAPJAI I = 0 ciklus, amg (NEMZETISG[I] "francia") vagy (SZLETETT[I] 1963) vagy (FOGLALKOZS[I] "sznsz") I = I + 1 ciklus vge ha I < 30, akkor ki: NV[I] klnben ki: "Nincs ilyen sznsz." elgazs vge eljrs vge eljrs hres5b I = 0 ciklus, amg (I <= 30) s ((NEMZETISG[I] "francia") vagy (SZLETETT[I] 1963) vagy (FOGLALKOZS[I] "sznsz")) I = I + 1 ciklus vge ha I <= 29, akkor ki: NV[I] kllnben ki: "Nincs ilyen szemly." elgazs vge eljrs vge 6. Mi a nemzetisge annak az rnak, aki legutolsknt halt meg a fenti rk kztt? Az halt meg utoljra, akinek a MEGHALT tmbben tallhat rtke a legnagyobb. Mivel azonban nem tudhatjuk, hogy az els szemly r-e, az adataihoz nem hasonlthatjuk a tbbieket. Ms adatok esetn azt sem tudhatjuk biztosan, hogy egyltaln van-e kzttk r. eljrs hres6 MAX = 0 MAXHELY = 1 ciklus I = 0-tl 29-ig ha (FOGLALKOZS[I] = "r") s (MEGHALT[I] > MAX), akkor MAX = MEGHALT[I] MAXHELY = I elgazs vge ciklus vge 78

ALGORITMIZLS ALAPJAI

ha MAXHELY > 1, akkor ki: NEMZETISG[I] klnben ki: "Nincs kzttk olyan r, aki mr meghalt volna." elgazs vge eljrs vge 7. Van-e idsebb ma l r, mint a mr nem l rk kzl a legidsebb korban meghalt szemly? (Tegyk fel, hogy ma l s mr meghalt rk is vannak a listban!) Ez egy eldnts. Tudnunk kell hozz, hny ves volt a legidsebb korban meghalt r. (rdemes megfigyelni, hogy azt viszont nem szksges tudnunk, hogy hnyadik szemly a listban.) rdemes tovbb azt is megfigyelni, hogy a maximumkivlaszts felttelben nem kell kln szerepeltetni azt a felttelt, mely azt vizsgln, hogy az illet l-e mg, hiszen ha l, akkor a MEGHALT[I] SZLETETT[I] kifejezs rtke egy 1900-nl kisebb szm lesz (pl. 0 1963 = 1963), ennyi vesen (1963) pedig egszen biztosan nem lesz senki sem a legtovbb lt, de mr meghalt szemly, tekintve, hogy a kirs szerint vannak olyanok a listban, akik mr valban meghaltak. Az esetkben ez a klnbsg ugyanis pozitv szm lesz, ami biztosan nagyobb, mint mnusz ezerkilencszz-valamennyi... eljrs hres7 MAX = 0 ciklus I = 0-tl 29-ig ha (FOGLALKOZS[I] = "r") s (MEGHALT[I] SZLETETT[I] > MAX), akkor MAX = MEGHALT[I] SZLETETT[I] MAXHELY = I elgazs vge ciklus vge I = 0 ciklus, amg (I < 30) s ((FOGLALKOZS "r") vagy (MEGHALT[I] > 0) vagy (2007 SZLETETT[I] <= MAX)) I = I + 1 ciklus vge ha I <= 30, akkor ki: "Igen, van ilyen szemly." klnben ki: "Nem, nincs ilyen szemly." elgazs vge eljrs vge 8. Mennyi a mr nem lk tlagos tallati szma? 79

ALGORITMIZLS ALAPJAI sszegzs s megszmlls, figyelve arra, htha nincs is olyan szemly, aki mr meghalt volna. (Ez nem szerepel a feladat kirsban, de jobb az vatossg.) eljrs hres8 SSZEG = 0 DB = 0 ciklus I = 0-tl 29-ig ha MEGHALT[I] > 0, akkor SSZEG = SSZEG + GOOGLE[I] DB = DB + 1 elgazs vge ciklus vge ha DB > 1, akkor ki: SSZEG / DB klnben ki: "Nincs olyan szemly, aki mr meghalt volna." elgazs vge eljrs vge 9. Mi a foglalkozsa a legtbb tallattal rendelkez angolnak? (Tudjuk, hogy vannak angolok a listban.) Maximumkivlaszts. De nem mindenki angol. eljrs hres9 MAX = 0 MAXHELY = 1 ciklus I = 0-tl 29-ig ha (NEMZETISG[I] = "angol") s (GOOGLE[I] > MAX), akkor MAX = GOOGLE[I] MAXHELY = I elgazs vge ciklus vge ki: FOGLALKOZS[MAXHELY] eljrs vge 10. Tallati gyakorisguk szerint nvekv sorrendben rja ki egy listban16 a mr nem l szemlyek nevt! Azok nem lnek, akiknl a MEGHALT tmb rtke nem 0. Ki kell vlogatnunk a nevket s a tallati gyakorisgukat egy-egy segdtmbbe, majd utbbi szerint rendeznnk kell az adatokat. A feladat kirsa nem jelzi, de rdemes gondolnunk arra az esetre is, mi van, ha mg mindenki l, vagy csak egyetlen szemly van, aki mr meghalt. Ez esetben nincs mit rendeznnk...
16

A lista sz itt s a kvetkez pldkban a tgabb rtelemben vett listt, s nem a lista adatszerkezetet jelenti.

80

ALGORITMIZLS ALAPJAI

eljrs hres10 DB = 0 ciklus I = 0-tl 29-ig ha MEGHALT[I] > 0, akkor DB = DB + 1 NV2[DB] = NV[I] GOOGLE2[DB] = GOOGLE[I] elgazs vge ciklus vge ha DB > 1, akkor ciklus I = 0-tl (DB 2)-ig MINHELY = I ciklus J = I + 1-tl DB-ig ha GOOGLE[J] < GOOGLE[MINHELY], akkor MINHELY = J elgazs vge ciklus vge ha MINHELY I, akkor SNV = NV2[I] NV2[I] = NV2[MINHELY] NV2[MINHELY] = SNV SG = GOOGLE2[I] GOOGLE2[I] = GOOGLE2[MINHELY] GOOGLE2[MINHELY] = SG elgazs vge ciklus vge elgazs vge ciklus I = 0-tl (DB 1)-ig ki: NV2[I], GOOGLE2[I] ciklus vge eljrs vge 11. Ksztsen listt, melyben az lthat, hogy nemzetisgenknt hny szemly tallhat a fenti adatok kztt! (Tegyk fel, hogy nem tudjuk elre, milyen s hnyfle nemzetisg tallhat az adatok kztt, de biztosan nincs tbb, mint a szemlyek szma.) Ez egy eldnts. Ksztennk kell egy olyan tmbt, mely a nemzetisgek listjt tartalmazza (NEMZETISGEK[]). Az els szemly nemzetisgt automatikusan felvesszk ebbe az els helyre, majd a msodiktl a harmincadik szemly nemzetisgig mindenkit megvizsgljuk, szerepel-e mr ebben a listban (itt az eldnts). Ha nem, akkor felvesszk jknt az utols helyre. Ezzel egy idben nyilvntartjuk azt is egy msik vektorban (EMBEREKSZMA[]), hogy eddig hnyan voltak mr ilyen nemzetisgek. Ha olyan nemzetisg szemly adata van pp a keznkben, amilyen mr volt a listban, akkor ezt 81

ALGORITMIZLS ALAPJAI a szmot eggyel megnveljk. Az j nemzetisgek esetn ennek a szmnak 1-es kezdrtket adunk. eljrs hres11 NEMZETISGEK[0] = NEMZETISG[0] EMBEREKSZMA[0] = 1 DB = 1 ciklus I = 1-tl 29-ig J = 1 ciklus, amg (J <= DB) s (NEMZETISG[I] NEMZETISGEK[J]) J = J + 1 ciklus vge ha J <= DB, akkor EMBEREKSZMA[J] = EMBEREKSZMA[J] + 1 klnben NEMZETISGEK[DB] = NEMZETISG[I] EMBEREKSZMA[DB] = I DB = DB + 1 elgazs vge ciklus vge ciklus I = 0-tl (DB 1)-ig ki: NEMZETISGEK[I], EMBEREKSZMA[I] ciklus vge eljrs vge 12. Melyik foglalkozs birtokosaira adja tlagosan a legtbb tallatot a Google? Ehhez hatrozza meg, hogy foglalkozsonknt mennyi a tallatok tlaga! Ksztennk kell egy listt a foglalkozsokrl, ehhez ld. az A csoport 4-es feladatnak megoldst. A msik segdtmbben a foglalkozsokhoz tartoz Google-beli tallatok szmt sszegezzk, majd ezen vgrehajtunk egy maximum-kivlasztst. eljrs hres12 FOGLALKOZSOK[0] = FOGLALKOZS[0] SSZTALLATOK[0] = GOOGLE[0] DB = 1 ciklus I = 1-tl 29-ig J = 1 ciklus, amg (J <= DB) s (FOGLALKOZSOK[J] FOGLALKOZS[I]) J = J + 1 ciklus vge ha J <= DB, akkor SSZTALLATOK[J] = SSZTALLATOK[J] + GOOGLE[I] klnben 82

ALGORITMIZLS ALAPJAI

FOGLALKOZSOK[DB] = FOGLALKOZS[I] SSZTALLATOK[DB] = GOOGLE[I] DB = DB + 1 elgazs vge ciklus vge MAXHELY = 0 ciklus I = 1-tl (DB 1)-ig ha SSZTALLATOK[I] > SSZTALLATOK[MAXHELY], akkor MAXHELY = I elgazs vge ciklus vge ki: FOGLALKOZSOK[MAXHELY] eljrs vge 13. rja ki a magyarok nevt tallati gyakorisguk szerint cskken sorrendben! Elszr vlogassuk ki a magyarokat s tallati gyakorisgukat, majd rendezzk ket az utbbi szerint, clszeren maximumkivlasztsos rendezssel. (Az egyszersg kedvrt tegyk fel, hogy 1-nl tbb magyar van a fenti szemlyek kztt.) eljrs hres13 DB = 0 ciklus I = 0-tl 29-ig ha NEMZETISG[I] = "magyar", akkor MAGYAROK[DB] = NV[I] TALLATOK[DB] = GOOGLE[I] DB = DB + 1 elgazs vge ciklus vge ciklus I = 0-tl (DB 2)-ig MAXHELY = I ciklus J = (I + 1)-tl (DB 1)-ig ha TALLATOK[J] > TALLATOK[MAXHELY], akkor MAXHELY = J elgazs vge ciklus vge ha MAXHELY I, akkor SNV = MAGYAROK[I] MAGYAROK[I] = MAGYAROK[MAXHELY] MAGYAROK[MAXHELY] = SNV STALLATOK = TALLATOK[I] TALLATOK[I] = TALLATOK[MAXHELY] TALLATOK[MAXHELY] = STALLATOK elgazs vge 83

ALGORITMIZLS ALAPJAI ciklus vge ciklus I = 0-tl (DB 1)-ig ki: MAGYAROK[I], TALLATOK[I] ciklus vge eljrs vge 14. Szletsi vk szerint nvekv sorrendben rja ki a klfldiek nevt! Az klfldi, aki nem magyar. Elszr vlogassuk ki ket, majd rendezzk szletsi vk szerint ket. Az egyszersg kedvrt ttelezzk fel, hogy 1-nl tbb klfldi van a fenti szemlyek kztt. eljrs hres14 DB = 0 ciklus I = 0-tl 29-ig ha NEMZETISG[I] "magyar", akkor KLFLDI[DB] = NV[I] SZL[DB] = SZLETETT[I] DB = DB + 1 elgazs vge ciklus vge ciklus I = 0-tl (DB 2)-ig MINHELY = 1 ciklus J = (I + 1)-tl (DB 1)-ig ha SZL[J] < SZL[MINHELY], akkor MINHELY = J elgazs vge ciklus vge ha MINHELY I, akkor SNV = KLFLDI[I] KLFLDI[I] = KLFLDI[MINHELY] KLFLDI[MINHELY] = SNV S = SZL[I] SZL[I] = SZL[MINHELY] SZL[MINHELY] = S elgazs vge ciklus vge ciklus I = 0-tl (DB 1)-ig ki: KLFLDI[I], SZL[I] ciklus vge eljrs vge

4.3.8.3 Megyk, vrosok, rgik


MEGYE Bcs-Kiskun RGI 0 MJV 1 VROS 19 NAGYKZSG 9 KZSG 90 RGIK Dl-Alfld

84

ALGORITMIZLS ALAPJAI
Baranya Bks Borsod-Abaj-Zempln Csongrd Fejr Gyr-Moson-Sopron Hajd-Bihar Heves Jsz-Nagykun-Szolnok Komrom-Esztergom Ngrd Pest Somogy Szabolcs-Szatmr-Bereg Tolna Vas Veszprm Zala 1 0 3 0 4 6 2 3 2 4 3 5 1 2 1 6 4 6 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 11 17 23 7 10 7 20 8 17 9 5 39 13 23 8 9 13 7 5 12 12 4 15 7 10 4 7 4 0 27 4 19 7 3 3 3 284 45 322 47 81 166 51 108 53 62 125 120 227 186 93 203 200 245 (Forrs: KSH) Dl-Dunntl szak-Alfld szak-Magyarorszg Kzp-Dunntl Kzp-Magyarorszg Nyugat-Dunntl

A RGI tmb annak a rginak a sorszmt tartalmazza, amelybe az adott megye tartozik (pl. J-N-K Szolnok megye esetben ez a szm a 2, mivel a megye az szak-Alfld rgiban tallhat, amely a 2-es index elem a RGIK tmbben). Az MJV tmb a megyben tallhat megyei jog vrosok szmt, a VROS, a NAGYKZSGG s a KZSG tmbk pedig az adott megye megfelel kzigazgatsi besorols helysgeinek szmt tartalmazzk (pl. Fejr megyben 10 vros, Somogy megyben 4 nagykzsg stb. van). 1. Hny megyben kisebb a kzsgek szma, mint az tlag? Tudnunk kell elszr, hogy mennyi a kzsgek szma tlagosan. Ezutn megszmlljuk, hny megyben van ennl kevesebb. eljrs megye1 SSZEG = KZSG[0] ciklus I = 1-tl 18-ig SSZEG = SSZEG + KZSG[I] ciklus vge TLAG = SSZEG / 19 DB = 0 ciklus I = 0-tl 18-ig ha KZSG[I] < TLAG, akkor DB = DB + 1 elgazs vge ciklus vge ki: DB 85

ALGORITMIZLS ALAPJAI eljrs vge 2. Van-e olyan megye, ahol tbb nagykzsg tallhat, mint vros? Ez egy egyszer eldntsi feladat. eljrs megye2 I = 0 ciklus, amg (I < 19) s (NAGYKZSG[I] <= VROS[I]) I = I + 1 ciklus vge ha I < 19, akkor ki: "Igen, van ilyen megye." klnben ki: "Nem, nincs ilyen megye." elgazs vge eljrs vge 3. Melyik rgiban van az a megye, ahol a legkevesebb vros tallhat? Ki kell vlasztanunk azt a megyt, ahol a legkevesebb vros van, majd a rgijnak sorszma alapjn meg kell hatrozunk a RGIK tmb segtsgvel, melyik rgiban van. eljrs megye3 MINHELY = 0 ciklus I = 1-tl 18-ig ha VROS[I] < VROS[MINHELY], akkor MINHELY = I elgazs vge ciklus vge ki: RGIK[RGI[MINHELY]] eljrs vge 4. tlagosan hny nagykzsg van megynknt? sszegezzk a nagykzsgek szmt, majd osztjuk a megyk szmval. Egyszer sszegzs.

eljrs megye4 SSZEG = NAGYKZSG[0] ciklus I = 1-tl 18-ig SSZEG = SSZEG + NAGYKZSG[I] ciklus vge ki: SSZEG / 19 eljrs vge

86

ALGORITMIZLS ALAPJAI

5. Van-e olyan rgi, ahol kevesebb a vros, mint a nagykzsg? Egyszer eldntsi feladat. eljrs megye5 I = 0 ciklus, amg (I < 19) s (VROS[I] >= NAGYKZSG[I]) I = I + 1 ciklus vge ha I < 19, akkor ki: "Igen, van ilyen megye." klnben ki: "Nem, nincs ilyen megye." elgazs vge eljrs vge 6. Melyik rgiban van az a megye, ahol a legtbb helysg tallhat (a megye sszes helysgt figyelembe vve)? Ez egy olyan maximumkivlaszts, ahol nem egy vektor rtkeinek, hanem ngy vektor rtkei sszegnek maximumt keressk. eljrs megye6 MH = 0 ciklus I = 0-tl 18-ig ha MJV[I] + VROS[I] + NAGYKZSG[I] + KZSG[I] > MJV[MH] + VROS[MH] + NAGYKZSG[MH] + KZSG[MH], akkor MH = I elgazs vge ciklus vge ki: RGIK[RGI[MH]] eljrs vge 7. Hny nagykzsg van sszesen a Nyugat-Dunntl rgiban? (Tudjuk, hogy van ilyen nev rgi.) Ez egy egyszer (feltteles) sszegzs. Hasonlan a fentiekhez, az elzetes feladatunk csak az, hogy megtudjuk, mi a Nyugat-Dunntl rgi sorszma. eljrs megye7 MELYIK = 0 ciklus, amg RGIK[MELYIK] "Nyugat-Dunntl" MELYIK = MELYIK + 1 ciklus vge SSZEG = 0 ciklus I = 0-tl 18-ig 87

ALGORITMIZLS ALAPJAI ha RGI[I] = MELYIK, akkor SSZEG = SSZEG + NAGYKZSG[I] elgazs vge ciklus vge ki: SSZEG eljrs vge 8. Van-e olyan megye a Kzp-Dunnl rgiban, amelyben 10-nl tbb vros tallhat? Eldnts, de ugyangy, mint fent, most is ismernnk kell elre a rgi sorszmt. Gondoljuk t elre, mi lesz az a T tulajdonsg, amelynek megfelel megyt keresnk! eljrs megye8 MELYIK = 0 ciklus, amg RGIK[MELYIK] "Kzp-Dunntl" MELYIK = MELYIK + 1 ciklus vge I = 1 ciklus, amg (I < 19) s ((RGI[I] MELYIK) vagy (VROS[I] <= 10)) I = I + 1 ciklus vge ha I < 19, akkor ki: "Igen, van ilyen megye." klnben ki: "Nem, nincs ilyen megye." elgazs vge eljrs vge 9. Hny megyei jog vros van sszesen az szak- s a Dl-Alfld rgiban? (Tudjuk, hogy vannak ilyen nev rgik.) sszegzs, mely elfelttelezi, hogy ismerjk a krdses rgik sorszmt. Ez persze nem lehet gond, mr gy belejttnk... :) eljrs megye9 EGYIK = 0 ciklus, amg RGIK[EGYIK] "szak-Alfld" EGYIK = EGYIK + 1 ciklus vge MSIK = 0 ciklus, amg RGIK[MSIK] "Dl-Alfld" 88

ALGORITMIZLS ALAPJAI

MSIK = MSIK + 1 ciklus vge SSZEG = 0 ciklus I = 0-tl 18-ig ha (RGI[I] = EGYIK) vagy (RGI[I] = MSIK), akkor SSZEG = SSZEG + MJV[I] elgazs vge ciklus vge ki: SSZEG eljrs vge 10. rja ki a rgik neveit a bennk tallhat kzsgek szma szerinti emelked sorrendben! Rginknt meg kell szmllnunk a kzsgeket. Ehhez ltrehozunk egy DB nev 7elem vektort, melynek minden eleme az egyes rgikban tallhat kzsgek szmt jelenti. Ezutn eszerint a vektor szerint rendezzk a rgikat. eljrs megye10 ciklus I = 0-tl 6-ig DB[I] = 0 ciklus vge ciklus I = 0-tl 18-ig DB[RGI[I]] = DB[RGI[I]] + KZSG[I] ciklus vge ciklus I = 0-tl 5-ig MINHELY = I ciklus J = (I + 1)-tl 6-ig ha DB[J] < DB[MINHELY], akkor MINHELY = J elgazs vge ciklus vge ha MINHELY I, akkor SDB = DB[I] DB[I] = DB[MINHELY] DB[MINHELY] = SDB SRGI = RGIK[I] RGIK[I] = RGIK[MINHELY] RGIK[MINHELY] = SRGI elgazs vge ciklus vge ciklus I = 0-tl 6-ig ki: RGIK[I], DB[I] ciklus vge eljrs vge 89

ALGORITMIZLS ALAPJAI 11. Msolja a MEGYE2 tmbbe azoknak a megyknek a nevt, amelyek nem az szak-Alfld vagy a Nyugat-Dunntl rgikban vannak! (Tudjuk, hogy vannak ilyen nev rgik.) Ez pedig egy egyszer kivlogatsi feladat. Tudnunk kell viszont, hogy mi a sorszma az szak-Alfld s a Nyugat-Dunntl rgiknak. Mivel tudjuk, hogy vannak ilyen nev rgik, alkalmazhat a kivlaszts ttele. eljrs megye11 EGYIK = 0 ciklus, amg RGIK[EGYIK] "szak-Alfld" EGYIK = EGYIK + 1 ciklus vge MSIK = 0 ciklus, amg RGIK[MSIK] "Nyugat-Dunntl" MSIK = MSIK + 1 ciklus vge J = 0 ciklus I = 0-tl 18-ig ha (RGI[I] EGYIK) s (RGI[I] MSIK) akkor J = J + 1 MEGYE2[J] = MEGYE[I] elgazs vge ciklus vge eljrs vge 12. rja ki a megyk nevt a bennk tallhat vrosok szma szerint cskken sorrendben, amely megykben 10-nl tbb nagykzsg van! Elszr ki kell vlogatnunk a felttelnek megfelel megyket s a bennk tallhat vrosok szmt, majd ez utbbi szerint rendeznnk kell a kivlogatott megyket. A cskken sorrendhez clszernek ltszik a maximum-kivlasztsos rendezs alkalmazsa. Nem muszj vizsglni, de clszer, hogy csak akkor rendeznk, ha 1-nl tbb ilyen megye van, 0 vagy 1 megyt felesleges... eljrs megye12 DB = 0 ciklus I = 0-tl 18-ig ha NAGYKZSG[I] > 10, akkor MEGYE2[DB] = MEGYE[I] VROS2[DB] = VROS[I] DB = DB + 1 elgazs vge ciklus vge ha DB > 1, akkor ciklus I = 0-tl (DB 2)-ig 90

ALGORITMIZLS ALAPJAI

MAXHELY = I ciklus J = (I + 1)-tl (DB 1)-ig ha VROS2[J] > VROS2[MAXHELY], akkor MAXHELY = J elgazs vge ciklus vge ha MAXHELY I, akkor SMEGYE = MEGYE2[I] MEGYE2[I] = MEGYE2[MAXHELY] MEGYE2[MAXHELY] = SMEGYE SVROS = VROS2[I] VROS2[I] = VROS2[MAXHEYL] VROS2[MAXHELY] = SVROS elgazs vge ciklus vge elgazs vge ciklus I = 0-tl (DB 1)-ig ki: MEGYE2[I] ciklus vge eljrs vge 13. Melyik megyk vannak az szak-Alfld rgiban? (Tudjuk, hogy van ilyen nev rgi.) Msolja a neveiket az SZAKALFLD nev tmbbe! Kivlogats. Tudnunk kell viszont, hogy mi a sorszma az szak-Alfld rginak. Mivel tudjuk, hogy van ilyen nev rgi, alkalmazhat a kivlaszts ttele. eljrs megye13 MELYIK = 0 ciklus, amg RGIK[MELYIK] "szak-Alfld" MELYIK = MELYIK + 1 ciklus vge J = 0 ciklus I = 1-tl 19-ig ha RGI[I] = MELYIK, akkor J = J + 1 SZAKALFLD[J] = MEGYE[I] elgazs vge ciklus vge eljrs vge 14. rja ki a rgik neveit a bennk tallhat vrosok s nagykzsgek szmnak sszege szerinti cskken sorrendben!

91

ALGORITMIZLS ALAPJAI sszegeznnk kell a vrosok s nagykzsgek szmt rginknt. Ehhez hozzuk ltre az SSZEG nev htelem tmbt, melynek elemei az egyes rgikban tallhat, adott tpus helysgek szmnak sszegei lesznek. Ha ezzel kszen vagyunk, mr csak rendeznnk kell. A cskken sorrend elrshez clszernek ltszik a maximumkivlasztsos rendezs. eljrs feladat_4C ciklus I = 0-tl 6-ig SSZEG[I] = 0 ciklus vge ciklus I = 0-tl 18-ig SSZEG[RGI[I]] = SSZEG[RGI[I]] + VROS[I] + NAGYKZSG[I] ciklus vge ciklus I = 0-tl 5-ig MAXHELY = I ciklus J = (I + 1)-tl 6-ig ha SSZEG[J] > SSZEG[MAXHELY], akkor MAXHELY = J elgazs vge ciklus vge ha MAXHELY I, akkor SSSZEG = SSZEG[I] SSZEG[I] = SSZEG[MAXHELY] SSZEG[MAXHELY] = SSSZEG SRGI = RGIK[I] RGIK[I] = RGIK[MAXHELY] RGIK[MAXHELY] = SRGI elgazs vge ciklus vge ciklus I = 0-tl 6-ig ki: RGIK[I] ciklus vge eljrs vge

4.3.8.4 Autk
RENDSZM LYN-582 YWX-715 NZI-110 PAW-517 PHC-448 MRKA Opel Renault Fiat Toyota Renault SZN kk piros fehr fehr fekete ZEMANYAG diesel benzin diesel diesel benzin CCM 1700 1600 1200 2200 2000 KILOMTER 75481 59749 49369 74736 34970 R 2135000 1642000 2020000 1773000 557000

92

ALGORITMIZLS ALAPJAI
FQE-168 GER-115 KVS-920 NNB-904 QEX-962 LLF-939 ZOZ-218 MBX-182 MWZ-731 SOR-203 WTO-573 BMF-822 AUG-189 UOC-918 UKD-803 ONT-300 UPY-402 TZC-007 LSP-155 PYS-619 YPT-336 MKY-268 YBF-696 ARG-116 UWL-228 ZUE-691 JEH-568 HXH-645 TQM-629 JIL-882 XMP-469 NRN-598 KXG-142 LZX-198 LVK-184 WJL-522 CBO-222 AIL-142 WAJ-325 QUB-316 FQX-609 YFH-943 NVS-665 NSX-924 THN-312 Toyota BMW Renault Mercedes Fiat BMW Opel Mercedes Fiat Volkswagen Renault Ford Suzuki Volkswagen Mercedes Mercedes Renault Volkswagen BMW Volkswagen Fiat Fiat Ford Mercedes BMW Suzuki Volkswagen Toyota Mercedes Citron Fiat BMW Nissan Suzuki Opel Audi Toyota Mercedes Mercedes Mercedes Nissan Audi Toyota BMW Nissan zld kk zld fekete piros fekete piros zld fekete kk kk szrke szrke piros fekete szrke fehr fehr fehr fekete piros fekete piros zld piros fehr fekete kk szrke szrke piros fehr fekete fehr zld zld piros fehr kk fehr kk fekete zld fehr fekete benzin diesel benzin diesel diesel benzin diesel benzin benzin benzin benzin diesel diesel diesel diesel benzin diesel benzin benzin diesel diesel benzin diesel diesel diesel diesel diesel diesel benzin benzin diesel benzin diesel benzin diesel diesel diesel benzin diesel diesel benzin diesel diesel benzin benzin 2200 1500 2200 1800 1200 1800 1200 1300 1900 2000 1800 2000 1600 1400 1300 1500 1900 1700 1600 1200 1700 2000 2100 1400 2000 1300 1800 1700 2100 1700 2200 2100 2000 1900 2100 1500 1700 1400 1600 1300 1300 1800 1900 2200 2000 76498 57711 58838 50545 31163 77858 37658 26113 72356 26128 22998 71370 49334 62527 47369 63144 79076 49002 57669 38941 34004 69538 79825 63744 49154 18407 16420 76102 23099 47040 80621 28787 18941 62275 57307 22005 59260 43784 69567 30580 21032 43746 84602 16643 31800 1004000 1786000 1495000 1306000 1538000 449000 1533000 1512000 1725000 753000 438000 763000 2201000 2036000 2097000 1192000 756000 1069000 2174000 2083000 2282000 2230000 1716000 1846000 1522000 1877000 1399000 551000 477000 1626000 1433000 2135000 1648000 884000 2123000 694000 1612000 1767000 1687000 2291000 463000 1980000 956000 1341000 1189000

1. Milyen szn autbl van a legtbb? 2. Mennyi az 50 000 km-nl tbbet futott diesel autk tlagra? 3. Milyen mrkj aut az XYZ-573 rendszm? Alkalmazzon strzss keresst!

93

ALGORITMIZLS ALAPJAI 4. Van-e olyan benzines aut, amelyik tbb kilomtert futott, mint a diesel autk ltal futott kilomterek tlagnak hromszorosa? 5. Hatrozza meg, hogy szrke szn vagy Nissan tpus autbl van-e tbb? 6. Van-e olyan aut, ami tbbet futott 70 000 km-nl s drgbb, mint 2 000 000 Ft? 7. Adja meg a legnagyobb hengerrtartalm (CCM), kk szn diesel aut rendszmt! Figyelem, lehet, hogy nincs is ilyen! 8. Adja meg a Suzukik s a Mercedesek tlagra kztti klnbsget! 9. Van-e olyan piros szn diesel aut, ami tbbe kerl, mint a legtbb kilomtert futott zld szn aut? 10. Mennyibe kerl a legtbb kilomtert futott aut az 1500 cm3-nl kisebb kategrij autk kzl? 11. Mibl van tbb: 1 500 000 Ft-nl drgbb Mercedesbl vagy benzines Nissanbl? 12. Van-e olyan fehr aut, ami tbbe kerl a legdrgbb benzinesnl? 13. Hny 1500 cm3-nl kisebb hengerrtartalm (CCM) aut van? 14. tlagosan hny km-t futottak a BMW-k? 15. Van-e olyan Mercedes, ami olcsbb, mint a legolcsbb Fiat? 16. Milyen mrkj az ABC-123 forgalmi rendszm aut? A feladatot teljes keresssel oldja meg! 17. Melyik aut a msodik legolcsbb? (Az rt tekintve a legolcsbb utn kvetkez.) 18. Hny diesel aut hengerrtartalma (CCM) nagyobb, mint a benzines autk tlaghengerrtartalma? 19. Melyik mrkban van a legtbb piros aut? 20. A zld autk kzl melyik futotta a legkevesebb kilomtert? Adja meg rendszmt! 21. Van-e 2 000 000 Ft-nl drgbb diesel? 22. Milyen szn a msodik legolcsbb BMW? 8.3

SSZEFOGLALS

Ebben a leckben olyan gyakorl feladatokat mutattunk be, amelyek az elemi vektorkezel eljrsok ismeretben oldhatk meg. Javasoljuk, hogy az Olvas is talljon ki az ismertetett pldkban ltottakhoz hasonl krdseket, s prblja megadni a megoldsok algoritmust. Feladatokat konkrt adatok ismerete nlkl is kitallhatunk. Ebben az esetben mg nagyobb szerepe van annak, hogy olyan algoritmusokat adjunk meg, amelyek fel vannak ksztve a szlssges esetekre is. Az ismertetett pldk mondateszer lernyelven megadott algoritmusai egy konkrt nyelv szintaxisnak ismeretben egyszeren trhatk programm, s gy a gyakorlatban is kiprblhatk.

8.4 NELLENRZ KRDSEK


1. Milyen esetekben alkalmazunk keresst kivlaszts helyett? 2. Van-e olyan eset, amikor a minimumkivlasztsos rendezs vlasztsa clszerbb, mint a maximumkivlasztsos s fordtva?

94

ALGORITMIZLS ALAPJAI

3. Milyen esetekben rdemes binris keresst hasznlnunk ms kereseljrsok helyett? 4. tlagszmtsnl milyen szlssges esetekre kell felkszlnnk?

8.5 GYAKORL TESZTEK

95

ALGORITMIZLS ALAPJAI

9. LECKE: ALGORITMUSOK HATKONYSGA


9.1 CLKITZS
Ebben a leckben betekintst nyjtunk az algoritmusok hatkonysgnak vizsglatba. Az algoritmusok elemzse programozsi nyelvektl s szmtgpektl fggetlen, absztrakt matematikai tudomny. Algoritmusok elemzsekor vizsglhat egy eljrs idignye, illetve az adatok (adatszerkezetek) helyfoglalsa, vagyis trignye. Ezzel a kt terlettel a bonyolultsgelmlet foglalkozik, s az ignyeket a bemenet hossznak fggvnyben adja meg. ltalban nem pontos rtkeket hatrozunk meg, hanem nagysgrendeket. Pontos rtkek azrt is lennnek nehezen megadhatk, mert a klnbz programozsi nyelven rott programok klnbz architektrj gpeken futtatva nagyon klnbz (konkrt) futsi idket is produklhatnak. A bemenet nagysghoz mrt idigny nagysgrendje gy elegenden pontos informci lehet. A kiszmthatsgelmlet az algoritmusok futsnak befejezdst, eredmnyes lefutsnak lehetsgt s viszonyait vizsglja. Algoritmusok elemzsre azrt van szksg, hogy legyen eszkznk az algoritmusok hatkonysgainak sszehasonltsra, vagyis egy adott problma ismeretben ki tudjuk vlasztani a leghatkonyabb algoritmust. Ebben a leckben bemutatjuk hatkonysgmrs absztrakt eszkzeit. 9.2

TARTALOM
Algoritmusok mveletignye Aszimptotikus jellsek

9.3 A TANANYAG KIFEJTSE


9.3.1 Algoritmusok mveletignye

A mveletigny meghatrozsakor ltalban csak az algoritmus meghatroz mveleteinek elemzst vgezzk. Egy mvelet meghatroz az algoritmusban, ha a tbbi mvelethez kpest jelents a vgrehajtsi ideje, vagy a vgrhajtsainak a szma. Jellemzen ilyen mvelet egy rendezsi eljrsban az sszehasonltsok s a cserk szma, szemben pldul a ciklusvltozk rtknek nvelsvel. A 7.3.3 fejezetben bemutattuk a buborkrendezs algoritmust. Vizsgljuk meg ennek az eljrsnak a mveletignyt. Amint azt fent lertuk, a mveletek kztt meghatroz az sszehasonltsokat s a cserket vgz mveletek. Vizsgljuk meg ket kln-kln! A mveletignyt a rendezend elemek szma (n) nagysgnak fggvnyben adjuk meg. Jelljk (n)-nel az sszehasonltsok szmt! A kls ciklus (n1)-szer fut le, az egyes lefutsokon bell a bels ciklus (n1), (n2), 1 itercis lpst hajt vgre. Az sszehasonltst minden lpsben vgre kell hajtani, mg akkor is, ha cserre nincs szksg, gy azt mondjuk, hogy az sszehasonltsok szma lland. Az sszehasonltsok szma: 96

ALGORITMIZLS ALAPJAI

n(n 1) n 2 n = . 2 2 2 Az sszehasonltsok szmnak nagysgrendje gy n fggvnyben n2. Ezt gy jelljk: (n) = (n2) s teta n-ngyzetnek ejtjk. A nagysgrend meghatrozsnl az n-es tagot nem kell figyelembe vennnk, mert egyre nagyobb n-ek esetben ennek nagysga elenysz az n2-hez kpest. Lssuk most a cserk szmt, jelljk ezt Cs(n)-nel! A cserk szma nem lland, mert nem minden elempr esetben kell cserlnnk. Ezrt a cserk szmnak pontos meghatrozshoz ismernnk kell a szomszdos elemek relcis viszonyait is, gy viszont nem tudunk ltalnos rtket adni a cserk szmnak nagysgrendjhez. Tekintsk ezrt a cserk tlagos szmt kiindulsi alapnak! Ha nvekv sorrendet szeretnnk ltrehozni, s a vektor elemei mr eleve nvekv sorrendben vannak, akkor a cserk szma 0. Ekkor Csmin(n) = (0). A legrosszabb eset az, amikor a vektor elemei ppen fordtott sorrendben, teht nagysg szerint cskken sorban rendezettek. Ekkor a cserk szma: n(n 1) , azaz Csmax(n) = (n2). Csmax = 2 Ha felttelezzk, hogy a vektor minden eleme klnbz, akkor mondhatjuk, hogy az talgos cserk szma a legrosszabb rtk fele: n(n 1) Cstlag(n) = = (n2), 4 de ennek nagysgrendje mg mindig n2. Kimondhatjuk, hogy a buborkrendezs a legrosszabb s az tlagos esetben is nagysgrendben n2-es algoritmus, akr az sszehasonltsok, akr a cserk szmt tekintjk. Hasonlan n2-es rendezs a beszr rendezs az elemek mozgatsa, s a szlsrtk-kivlasztsos rendezs a szlsrtk megtallsa tekintetben. Ezen lltsok bizonytst az Olvasra bzzuk. ltalban elmondhatjuk azt, hogy egy (n2) futsidej algoritmus gyorsabban fut a legrosszabb esetben, mint egy (n3), de csak elegenden nagy n-ek esetben.
(n) = (n1) + (n2) + + 1 =
9.3.2 Aszimptotikus jellsek

Az elz fejezetben a legrosszabb futsi idt (T) hatroztuk meg. A buborkrendezsnl a legrosszabb futsi id: T(n) = (n2). Mint arrl korbban mr szltunk, a (n2) nem egy konkrt rtket, hanem egy nagysgrendet jell. Adjuk meg ennek a jellsnek a pontos defincijt! + fggvnyt, amely a termszeteses szmok halmazn Tekintsk az f : N R0

van rtelmezve s nemnegatv vals rtkeket vehet fel. N = {0, 1, 2, } Most pedig definiljuk egy adott g fggvny esetn azon fggvnyek halmazt, amelyek nagysgrendben nem nagyobbak, mint g nem kisebbek, mint g
97

ALGORITMIZLS ALAPJAI

megegyeznek g nagysgrendjvel. Egy adott g fggvny esetn O(g)-vel jelljk (s nagy ord g-nek ejtjk) fggvnyeknek azt a halmazt, amelyre

O(g(n)) = {f(n): van olyan c > 0 s n0 0 lland, hogy


teljesl. Ha f O(g), akkor azt mondjuk, hogy g aszimptotikus fels korltja f-nek. Ebben az esetben szoksos mdon inkbb az f = O(g) jellst alkalmazzuk. Jellje (g) (ejtsd: omega g) azon fggvnyek halmazt, amelyekre

minden n n0 esetn 0 f(n) cg(n)}

(g(n)) = {f(n): van olyan c > 0 s n0 0 lland, hogy


ll fenn. Ha f (g) szoksos jellssel f = (g) , akkor azt mondjuk, hogy g aszimptotikus als korltja f-nek. Vgl, (g) (ejtsd: teta g) jelli azt a fggvnyhalmazt, amelyet a

minden n n0 esetn 0 cg(n) f(n)}

(g(n)) = {f(n): van olyan c1 > 0, c2 > 0 s n0 0 lland, hogy


sszefggs r le. Ha f (g) szoksos jellssel f = (g) , akkor azt mondjuk, hogy g aszimptotikusan les korltja f-nek. 50. kp Grafikus pldk a , O s jellsekre

minden n n0 esetn 0 c1g(n) f(n) c2g(n)}

Gyakori hiba, hogy algoritmusok mveletignynek jellemzsekor -t hasznlnak, de -t rtenek alatta. Az gy lert egyenlsg ltalban igaz, de mst (kevesebbet) fejez ki, mint amit a kzl rt alatta. Pl. a bubork rendezsre igaz, hogy MT (n) = (n 2 ) , de tbbet mond az, hogy MT (n) = (n 2 ) . A T ( n) jells hasznlata is hibt rejthet. T ( n) az sszes lehetsges futsi idt magban foglalja, amelyek nagysgrendben klnbzek lehetnek. Pl. ahogy korbban lttuk, a bubork rendezsre igaz (Cs helyett most T-vel), hogy: MT (n) = (n 2 ) s

AT (n) = (n 2 ) . A legkedvezbb esetben azonban nincs csere, vagyis mT (n) = 0 . Ekkor a T (n) = (n 2 ) (felletes) kijelents nem igaz, helyette a T (n) = (n 2 )
kijelentst kellene hasznlni, mely az sszes esetre helyes lesz. De ez kevesebb informcit tartalmaz, mint a fenti kt egyenlsg, ezrt ajnlatos MT (n) -t s AT (n) -t hasznlni. Befejezsl, konkrt pldaknt lssuk a gyorsrendezs elemzst bizonytsok nlkl.

98

ALGORITMIZLS ALAPJAI

Legrosszabb esetben (n2), tlagos esetben (n lg n). A futsi id attl fgg, hogy a feloszts kiegynslyozott-e, vagy sem. A feloszts az a mvelet, amely sorn a tmb egy elemt gy mozgatjuk vgleges helyre, hogy vele egytt a tbbi elemet is trendezzk: a nla kisebbek tle balra, a nla nagyobbak tle jobbra kerlnek. Ha minden feloszts esetn az adott elemtl balra s jobbra azonos szm elem lesz, a feloszts kiegyenslyozott. Ha a feloszts nem kiegyenslyozott, akkor a mdszer aszimptotikusan olyan lass lehet, mint a beszr rendezs. Az n. sszefslses rendezs s kupacrendezs (ezeket jegyzetnk nem trgyalja) legrosszabb esetben O(nlg n) idben rendezi az n elemet, a gyorsrendezsnek ez az tlagos futsi ideje. Lteznek olyan eljrsok, amelyek ennl is gyorsabban, lineris idben tudnak rendezni. Az rdekld olvask figyelmbe ajnljuk a leszmll rendezst, a szmjegyes rendezst s az n. ednyrendezst. 9.4

SSZEFOGLALS

Ennek a rvid lecknek az volt a clja, hogy bemutassa az algoritmusok mveletignynek meghatrozsra szolgl jellseket. Jegyzetnknek nem clja, hogy rszletesen trgyalja s bizonytsa az egyes eljrsok mveletignyt, de fontosnak tartjuk legalbb jellsek rtelmezsnek megadst, mert ezek ismerete nlkl nem rthet meg a klnbz szakirodalmakban tallhat eljrsok elemzse.

9.5 NELLENRZ KRDSEK


1. Gondolja t, hogy a megismert eljrsokban az elemszm fggvnyben hny sszehasonltst kell vgrehajtani. 2. Vizsglja meg a megismert rendez eljrsokat, hogy cserk szmt tekintve melyik hatkonyabb s melyik kevsb hatkony! 3. Mirt hatkonyabb a strzss keress, mint a teljes keress?

9.6 GYAKORL TESZTEK

99

ALGORITMIZLS ALAPJAI

10. LECKE: ALPROGRAMOK


10.1 CLKITZS Ez a lecke nem kapcsoldik szorosan az algoritmizls tmakrhez, sokkal inkbb programozssal, programozsi nyelvekkel kapcsolatos tudnivalkat tartalmaz. Mgis fontos az alapvet tudnivalk ttekintse, mert az alprogramok az sszes eljrsorintlt (procedurlis) nyelvben a strukturlt programozs alapeszkzei. Az objektumorientlt nyelvekben is megtalljuk a procedurlis nyelvekben hasznlatos alprogramokat, de nem az adatoktl klnvlasztva, hanem azokkal szoros egysgekbe, objektumokba zrva. Kiss pontatlan megfogalmazsban: ami a procedurlis nyelvekben az alprogram, az az objektumorientlt nyelvekben a metdus. 10.2 TARTALOM Alprogramok clja, jellemzi, fajti Formlis s aktulis paramterek Rekurzi Hatkr, lettartam

10.3 A TANANYAG KIFEJTSE


10.3.1 Alprogramok clja, jellemzi, fajti Az alprogramok minden eljrsorientlt nyelvben megtallhatk s a nyelvek alapeszkzei kz tartoznak. Hasznlatuk f okai az albbi kt tulajdonsguk: jrafelhasznlhatsg: ha egy programban kt vagy tbb helyen ugyanazt az utastssorozatot hasznljuk, akkor clszer ket kiemelni, nevet (azonostt) adni nekik, s a kiemels helyn ezzel az azonostval hivatkozni rjuk paramterezhetsg: ha a kiemelt utastssorozathoz paramtereket is rendelhetnk, nemcsak egy konrt mvelet, de mveletcsoport is helyettesthet ezzel a mdszerrel. Az alprogram teht olyan nyelvi szerkezet, amelynek segtsgvel nevet rendelhetnk egy kdrszlethez, hogy azt ksbb egyszeren vgrhajthassuk. A vgrhajts kezdemnyezse (alprogramhvs) az alprogram nevnek s esetleges paramtereinek megadsval trtnik. A fenti tulajdonsgaikon tl azrt alkalmazzuk ket, mert javtjk a programkd olvashatsgt. Egy jl megvlasztott alprogramnv kifejezbb lehet az olvas szmra, mint az alprogramot megvalst kd. A jegyzetnkben kzlt rendezeljrsokban gyakran volt szksg arra, hogy kt tmbelemet megcserljnk. A 8. leckben bemutatott pldkban elfordult, hogy egyidejleg tbb tmb elemein is kellett csert eszkzlnnk. Ilyenkor ezt a hrom rtkadst alkalmaztuk: S = A[I] A[I] = A[J] A[J] = S

100

ALGORITMIZLS ALAPJAI

Azokban a pldkban, ahol egynl tbb tmb elemeit kellett rendeznnk, vagyis az elemeket cserlnnk, a kdot rvidebb tehettk volna, ha ksztnk egy a csert megvalst eljrst. Azokban a kdokban, ahol csak egy tmbt kell rendeznnk, az olvashatsgon javtottunk volna. eljrs CSERE(A, B) S = A A = B B = S eljrs vge Ahol pedig az elemek tnyleges cserjt hajtottuk vgre, elegend lett volna hivatkozni erre az eljrsra (ms szval meghvni a csere eljrst): ... ha A[I] > A[J], akkor CSERE(A[I], A[J]) elgazs vge ... Ktfle alprogramot ismernk, az eljrst s a fggvnyt. Az eljrs a paramterein, vagy a program krnyezetn elvgzett transzformcikat ad meg. Adattranszformcit vagy tevkenysget vgez. Hvsakor az eljrs nevt mint utastst hasznlhatjuk. Turbo Pascal, Free Pascal program pelda; var a, b : integer; procedure csere(a, b : integer); var s : integer; begin s := a; a := b; b := s; end; begin ... csere(a, b); ... end. A fggvnyek ezzel szemben mindig visszatrsi rtket szmtanak ki s adnak meg. Transzformcit nem vgeznek, sem a program vltozinak rtkre, sem a program 101

ALGORITMIZLS ALAPJAI krnyezetre nincsenek hatssal. gy is mondjuk, hogy a fggvnyeknek nincs mellkhatsuk. A fggvnyeket kifejezsekben hasznljuk. Ha az eljrsokra gy tekintettnk, mint a programozsi nyelv utastskszletnek kibvtseit jelent eszkzket, akkor a fggvnyekre tekinthetnk gy is, mint a kifejezsekben hasznlhat opertorok krt kibvt eszkzk. fggvny GYK1(A, B, C) GYK1 = (B + SQRT(B * B 4 * A * C)) / (2 * A) // SQRT()-vel jelltk a ngyzetgykvonst fggvny vge fggvny GYK2(A, B, C) GYK2 = (B SQRT(B * B 4 * A * C)) / (2 * A) fggvny vge eljrs msodfokEgyenletMegoldsa be: A, B, C DISZKRIMINNS = (B * B) (4 * A * C) ha DISZKRIMINNS 0, akkor ki: GYK1(A, B, C), GYK2(A, B, C) klnben ki: "Nincs vals gyk." elgazs vge eljrs vge C# double gyk1(double a, b, c) { return (b + Math.Sqrt(b * b 4 * a * c)) / (2 * a); } Vannak olyan nyelvek, amelyekben kln kulcsszval definilhat az eljrs s a fggvny (pldul a Turbo Pascalban vagy Free Pascalban procedure az eljrs s function a fggvny definilsra). Ms nyelvekben nyelvi szintn nincs jelents klnbsg az eljrs s a fggvny defincija kztt. Ilyen nyelvek a C-szer nyelvek (C, C++, C#, Java). Ezekben az alprogramok defincijt gy adjuk meg: tpus azonost(paramterek) { trzs; [return visszatrsi rtk;] }

102

ALGORITMIZLS ALAPJAI

A tpus a fggvny visszatrsi rtknek tpusa. Ha a definilt alprogram nem fggvny, hanem eljrs, vagyis nincs visszatrsi rtke, akkor a tpus helyre a void kulcssz kerl. Ebben az esetben a fggvny trzsben nem kell szerepelnie a return kulcssznak sem. 10.3.2 Formlis s aktulis paramterek Az alprogram defincija formlisan gy nz ki: fej(paramterek) trzs vg A definciban a fej a specifikci eszkze. A specifikci arrl ad informcit, hogy az alprogramot hogyan kell hasznlni, hogyan kell meghvni. Hvskor az alprogram nevt s a vgrehajtshoz szksges paramtereket kell megadni. Az alprogramok paramterezhetsge minden procedurlis nyelvben hasznlhat eszkz, eltekintve a BASIC nyelv nhny rgi vltozatban. Amikor definiljuk az alprogramot, a specifikciban megadjuk az n. formlis paramterlistt. Itt azonostkat s tpusokat sorolunk fel, hasonlan a vltozk deklarcijhoz. A formlis paramterlistban felsorolt nevek az alprogram loklis nevei lesznek. A loklis s globlis vltozkrl a hatkr, lettartam fejezetben bvebben olvashatunk. Hvskor az alprogram neve mellett aktulis paramtereket adunk meg. Ezek azok a konkrt rtkek, amelyek felhasznlsval az alprogramot vgre kell hajtani. Fontos, hogy az aktulis paramterlista elemeinek konkrt rtkeknek (vagyis literloknak vagy rtkkel rendelkez vltozknak) kell lennik. Hvskor a peremterek egyeztetsre is sor kerl. A legegyszerbb eset, amikor a formlis paramterlista els elemnek rtke az aktulis paramterlista els rtke lesz, a formlis paramterlista msodik elemnek rtke az aktulis paramterlista msodik rtke lesz s gy tovbb. C# double kerlet(double x, y, z) { return x + y + z; } double terlet(double x, y, z) // a Hrn-kplettel { double s = (x + y + z) / 2.0; return Math.Sqrt(s * (s x) * (s y) * (s z)); } void Main() { 103

ALGORITMIZLS ALAPJAI double a, b, c; System.Console.Write("Adja meg a hromszg oldalait"); System.Console.Write("a="); a = Convert.ToDouble(System.Console.ReadLine()); System.Console.Write("b="); b = Convert.ToDouble(System.Console.ReadLine()); System.Console.Write("c="); c = Convert.ToDouble(System.Console.ReadLine()); System.Console.WriteLine("Kerlet: {0}", kerlet(a, b, c)); System.Console.WriteLine("Terlet: {0}", terlet(a, b, c)); } A fenti pldban hvskor a formlis paramterlista x, y, z vltozinak rtke rendre a, b s c lesz. A paramterkirtkels azonban a klnbz nyelvekben teljesen klnbz szablyok szerint trtnhet, ezrt jegyzetnkben nem trgyaljuk ezt a krdskrt. Az rdekld olvasknak javasoljuk, hogy nllan kutassanak az albbi kifejezsek jelentse utn: sorrendi kts, tpusegyeztets, szmbeli egyeztets, valamint paramtertads (cm szerint, rtk szerint, eredmny szerint, rtk/eredmny szerint, szveg szerint, nv szerint) s alprogramnevek tlterhelse. 10.3.3 Rekurzi A rekurzirl korbban mr esett sz. Alprogramok esetben akkor beszlnk rekurzirl, ha egy alprogram trzsben az alprogram sajt magt hvja meg. Az albbi egyszer plda az n! rtkt szmolja ki17. ANSI C int faktorialis(int n) { if(n <= 1) return 1; return n * faktorialis(n 1); } 10.3.4 Hatkr, lettartam A hatkr a program neveihez (vltozk, alprogramok) kapcsold fogalom. A hatkr a programnak az a rsze, ahol a jellt programelem (vltoz, alprogram, stb.) az adott nven elrhet. A hatkrkezels az a folyamat, amikor egy nvhez meghatrozzuk annak hatkrt. Beszlhetnk statikus s dinamikus hatkrkezelsrl.

17

Az int tpus az ANSI C-ben ktbjtos eljeles egszet jelent, rtke 32 768 .. 32 767 kztti lehet. A fenti plda emiatt csak n 7 esetn mkdik, mert 8! = 40 320.

104

ALGORITMIZLS ALAPJAI

A statikus hatkrkezels alapja a programegysgek egymsba gyazsa. Egy nv deklarcija az t kvet befoglal programegysg vgig van rvnyben. Azon kvl nem, de azon bell mg az t kvet begyazott programegysgekben is rvnyes nv. 51. kp Statikus hatkrkezels

A dinamikus hatkrkezels alapja nem a forrskd, hanem a hvsi lnc. Ha egy A programegysgben deklarlunk egy nevet, majd meghvjuk a B programegysget, akkor ez a nv B-ben is rvnyes lesz, fggetlenl attl, hogy B az A-ba van-e gyazva, vagy sem. Ezt a mdszert azonban viszonylag kevs programozsi nyelv alkalmazza. Az imperatv nyelvek ltalban statikus hatkrkezelst alkalmaznak. 52. kp Dinamikus hatkrkezels

Az lettartam a program vgrhajtsi idejnek az a rsze, ameddig egy adott trterletet arra hasznlunk, hogy az adott programelem (vltoz) rtkt trolja. Ms szval: az lettartam a futsi id azon rsze, amelyben a vltoz cmkomponenssel rendelkezik. 10.4 SSZEFOGLALS Ebben a leckben a programozsi nyelvek egyik fontos eszkzrl, az alprogramokrl beszltnk. Az alprogramok megvalstsa s jellemzi (pl. paramtertads, paramterkirtkels, hatkrkezels) az egyes programozsi nyelvekben nagyon klnbz is lehet, ezrt ebben a jegyzetben ezeket nem fejtettk ki rszletesen. Clunk ebben a leckben is csak a betekints volt.

10.5 NELLENRZ KRDSEK


1. Mi a klnbsg eljrs s fggvny kztt? 2. Lehet-e egy fggvny rekurzv, vagy csak eljrsoknl ltezik a rekurzi? 3. Mi a klnbsg statikus s dinamikus hatkrkezels kztt? 4. Milyen esetekben clszer s milyen esetekben nem clszer egy programrszbl alprogramot kszteni?

10.6 GYAKORL TESZTEK

105

ALGORITMIZLS ALAPJAI

11. LECKE: DINAMIKUS ADATSZERKEZETEK


11.1 CLKITZS Ebben a leckben betekintst nyjtunk a dinamikus adatszerkezetek kezelsbe. Mint azt korbban hangslyoztuk, egy adatszerkezet statikus vagy dinamikus volta nem befolysolja a trolsi mdot, a reprezentcit. A reprezentci azt mutatja meg, hogy egy adott adatszerkezet elemeit milyen mdon rhetjk el. Ahhoz, hogy az elemeket elrjk, azokat trolni kell a memriban. A trols lehet folytonos, ekkor az elemek a trban fizikailag egyms utn vannak trolva, de nem biztos, hogy az elrs sorrendjben, vagyis a logikai sorrend eltrhet a fizikai sorrendtl. A trols lehet sztszrt is, ekkor az elemek fizikailag a tr klnbz, nem egymst kvet rekeszeiben vannak eltrolva. Ebben az estben gondoskodnunk kell arrl, hogy meghatrozhat legyen, hogy melyik elemnek melyik a megelzje s melyik a rkvetkezje. 53. kp Folytonos trols

54. kp

Sztszrt trols

Brmely adatszerkezet esetben alkalmazhat a folytonos s a sztszrt trols is, de vannak, amelyekhez clszerbb az egyik, mg msokhoz a msik trolsi md alkalmazsa. Pldul a tmbk trolsa a programozsi nyelvekben ltalban a folytonos a memriban. (Az egyes elemek trbeli cmnek meghatrozsra szolgl az n. cmaritmetika. Ha ismerjk az els elem cmt a trban, s tudjuk, hogy az egyes elemek hny bjtot foglalnak, brmely elem memriacme knnyen meghatrozhat.) Dinamikus adatszerkezetek esetben gyakori a sztszrt trols, hiszen a dinamikus adatszerkezetek elemszma brmikor nvelhet. Elre nem tudhatjuk, hogy hny eleme lesz egy adatszerkezetnek, gy elre nem lehet pontos mret sszefgg adatterletet foglalni az elemek szmra. 55. kp Cmaritmetika

Ebben a fejezetben bemutatjuk nhny gyakori dinamikus adatszerkezet kezelst, s szt ejtnk a trols krdseirl is.

11.2 TARTALOM
Halmaz Lista Verem Sor Fa Hl

106

ALGORITMIZLS ALAPJAI

11.3 A TANANYAG KIFEJTSE


11.3.1 Halmaz

11.3.1.1 Halmazok reprezentcija


A halmaz egy struktra nlkli adatszerkezet. Ez azt jelenti, hogy az elemek kztt nincs kapcsolat, nem tudjuk meghatrozni a sorrendjket. Meg tudjuk viszont llaptani, hogy egy elem eleme-e a halmaznak. A halmazban minden elem egyszer fordulhat el, gy egy tetszleges elem vagy eleme a halmaznak, vagy nem. A multihalmaz olyan specilis adatszerkezet, amelyben megengedett egy elem tbbszri elfordulsa. Br a matematikban ismeretes a vgtelen halmaz (st: megszmllhat s kontinuum vgtelen halmaz is) fogalma, a 3.3.3.2 fejezetben lertak alapjn vgtelen halmaz adatszerkezetknt nem ltezik. 56. kp Halmaz, multihalmaz

Hagyomnyos halmazok s multihalmazok esetben is ltalban folytonos reprezentcit alkalmaznak trolskor. Jegyzetnkben csak a halmazon rtelmezett mveleteket mutatjuk be, a multihalmaz mveleteinek implementlst az Olvasra bzzuk. A halmaz lekpezhet pl. tmbre (vektrorra). Ilyenkor a vektor trolja a halmaz elemeit. A vektort elegenden nagy elemszmra kell deklarlnunk, hiszen a tmb statikus adatszerkezet, gy a deklarlt elemszm nagysgt futs alatt nem lehet tovbb nvelni. A vektor nem hasznlt elemeinek olyan rtket kell felvennik, amely a halmaznak nem lehet eleme (pl. ha a halmaz csak termszetes szmokat s nullt tartalmazhat, akkor a nem halmazelemeket reprezentl tmbelem rtke lehet 1), vagy nyilvn kell tartanunk egy kln vltozban, hogy hny eleme van a halmaznak. Megjegyzs: ltezik ettl alapveten eltr brzolsi/trolsi mdszer is, melynek alapja az n. karakterisztikus fggvny. Ennek segtsgvel a memriban minden egyes elem szmra csak egy bitet (!) foglalunk. A troland elemeket sorba rendezzk. A karakterisztikus fggvny segtsgvel hatrozzuk meg, hogy az egyes elemeket melyik bit jelli a lefoglalt terleten. Ha az adott elem megtallhat a halmazban, akkor a bitet 1-re lltjuk, ha nem, akkor 0-ra. 57. kp Halmaz reprezentcija karakterisztikus fggvnnyel

A halmaz inicializlsa (res halmaz ltrehozsa) trtnhet gy, hogy a vektor sszes elemt kezdrtkkel tljk fel, s/vagy az elemszmot mutat vltoz rtkt nullra lltjuk. Felttelezzk, hogy a halmaz maximum N elem lehet. eljrs inicializls ciklus I = 0-tl (N 1)-ig A[I] = <kezdrtk> ciklus vge elemszmA = 0 107

ALGORITMIZLS ALAPJAI eljrs vge A halmaz bvtse trtnhet unival (a jelenlegi halmaz unija a felveend rtkkel, mint egyelem halmazzal). A = {5, 9, 17, 34, 62} j elem: 41 A := A {41} Ha egy elemet trlni akarunk a halmazbl, kpeznnk kell az eredeti halmaz s a trlen elem, mint egyelem halmaz klnbsgt. trelnd elem: 62 A := A \ {62} Az A s B halmazok egyenlk, ha pontosan ugyanazokat az elemeket tartalmazzk. Jellse: A = B. Alapvet halmazelmleti opertor az (eleme). Mivel a halmaz reprezentcija egy rendezetlen vektor, s elfordulhat az az eset, hogy egy elem nem eleme a halmaznak, a mvelet implementlsa csak teljes keresssel trtnhet. Definiljunk egy logikai fggvnyt, amelynek paramterei az A halmaz, ennek elemszma: N s az X elem. Visszatrsi rtke IGAZ, ha az X eleme A-nak, HAMIS egybknt. fggvny eleme(A, N, X) I = 0 ciklus, amg (I < N) s (A[I] X) I = I + 1 ciklus vge eleme = (I < N) fggvny vge A fggvny egy teljes keress, figyeljk meg, hogyan kap visszatrsi rtket! Ha a keress sikeres volt, vagyis az X eleme A-nak, akkor az I < N felttel igaz, s ez a logikai rtk lesz a fggvny visszatrsi rtke. Ha a keress sikertelen volt, akkor az I < N felttel hamis, gy ez lesz a fggvny visszatrsi rtke.

8.3.1.2 Egyests (uni)


Hasonl a korbban trgyalt sszefuttatshoz, de mgsem ugyanaz, mert a halmazokat reprezentl vektorok esetben nem kvetelmny a rendezettsg. Az algoritmus A s B halmazokbl ltrehozza azt a C halmazt, amelynek elemei megtallhatk A-ban vagy B-ben, vagy mindkt halmazban. 58. kp 108 Halmazok egyestse

ALGORITMIZLS ALAPJAI

Ebbl kvetkezen C-nek eleme lesz az A sszes eleme, illetve B-bl azok az elemek, amelyek az A-ban nem szerepelnek. (A halmazban minden elem csak egyszer szerepel, gy azok az elemek is, amelyek mindkt halmaznak elemei.) Ezrt az algoritmus elszr tmsolja C-be A sszes elemt, majd B-bl azokat, amelyek nem elemei A-nak. eljrs egyests ciklus I = 0-tl (ELEMSZMA 1)-ig C[I] = A[I] ciklus vge ELEMSZMC = ELEMSZMA ciklus I = 0-tl (ELEMSZMB 1)-ig ha nem eleme(A, ELEMSZMA, B[I]), akkor C[ELEMSZMC] = B[I] ELEMSZMC = ELEMSZMC + 1 elgazs vge ciklus vge eljrs vge

11.3.1.3 Metszet
A s B halmaz metszete az a C halmaz, amelynek elemei mind az A, mind a B halmaznak elemei. 59. kp Halmazok egyestse

A metszetkpzs sorn a ltrejv C halmaz elemszma nem lesz nagyobb, mint a kt eredeti halmaz kzl a kisebb elemszm. Annak eldntsre, hogy az A egyik eleme B-nek is eleme-e, a korbban lert eleme() fggvnyt hasznljuk. Mivel ebben egy teljes keresst implementltunk, clszer a nagyobb elemszm halmaz elemeit keresni a kisebb elemszm halmazban, mert gy az sszes keressi lpsek szma kisebb lesz. eljrs metszet ELEMSZMC = 0 ha ELEMSZMA < ELEMSZMB, akkor ciklus I = 0-tl (ELEMSZMB 1)-ig ha eleme(A, ELEMSZMA, B[I]), akkor C[ELEMSZMC] = B[I] ELEMSZMC = ELEMSZMC + 1 elgazs vge ciklus vge klnben ciklus I = 0-tl (ELEMSZMA 1)-ig ha eleme(B, ELEMSZMB, A[I]), akkor 109

ALGORITMIZLS ALAPJAI C[ELEMSZMC] = A[I] ELEMSZMC = ELEMSZMC + 1 elgazs vge ciklus vge elgazs vge eljrs vge

11.3.1.4 Halmazok klnbsge


A s B halmaz klnbsge az a C halmaz, amelynek elemei szerepelnek A-ban, de nem szerepelnek B-ben. 60. kp Halmazok klnbsge

Az eljrs megadshoz ismt felhasznljuk az eleme() fggvnyt. C elemszma legfeljebb akkora lehet, mint A-. eljrs klnbsg ELEMSZMC = 0 ciklus I = 0-tl (ELEMSZMA 1)-ig ha nem eleme(B, ELEMSZMB, A[I]), akkor C[ELEMSZMC] = A[I] ELEMSZMC = ELEMSZMC + 1 elgazs vge ciklus vge eljrs vge

11.3.1.5 Rszhalmazvizsglat
Azt mondjuk, hogy B rszhalmaza A-nak (jellse: B A), ha B minden eleme egyben eleme A-nak is. B A teljesl akkor is, ha B = A. Ilyenkor azt mondjuk, hogy B nem valdi rszhalmaza A-nak. A vizsglat egy eldnts, meg kell vizsglnunk, hogy B minden eleme szerepel-e Aban. Ha igen, akkor B rszhalmaza A-nak, klnben nem. A defincibl kvetkezik, hogy ha B-nek nagyobb az elemszma, mint A-nak, akkor semmikppen sem teljeslhet, hogy B A. 61. kp Rszhalmazok

Adjunk meg egy logikai visszatrsi rtk fggvnyt, amely eldnti, hogy B rszhalmaza-e A-nak! fggvny rszhalmaz(A, ELEMSZMA, B, ELEMSZMB) ha ELEMSZMB > ELEMSZMA, akkor rszhalmaz = hamis 110

ALGORITMIZLS ALAPJAI

klnben I = 0 ciklus, amg (I < ELEMSZMB) s (nem eleme(A, ELEMSZMA, B[I]) I = I + 1 ciklus vge rszhalmaz = (I < ELEMSZMB) elgazs vge fggvny vge

11.3.1.6 Feladatok
A fent lertak felhasznlsval 1. Ksztsnk fggvnyt, amely eldnti, hogy az A s B halmazok diszjunktak-e. Kt halmazt akkor neveznk diszjunktnak, ha nincs kzs elemk. A fggvnyt adjuk meg tbbfle mdon is! (Pl. A s B diszjunkt, ha A-nak egy eleme sem szerepel B-ben, vagy ha A B = , vagy ha A-nak s B-nek nincs kzs rszhalmaza.) 2. Ksztsnk fggvnyt, amely eldnti, hogy B valdi rszhalmaza-e A-nak! B akkor valdi rszhalmaza A-nak, ha teljesl, hogy B A s B A. 11.3.2 Lista A lista adatszerkezet dinamikus, homogn. Az adatszerkezet elemei kztt rtelmezhet sorrend, s minden elemre igaz, hogy pontosan egy megelzje s pontosan egy rkvetkezje van, kivve az els s az utols elemet. Az els elemnek nincs megelzje, az utols elemnek nincs rkvetkezje. Minden listnak van els s utols eleme, kivve az res listt (empty list), melynek egyetlen eleme sincs. A lista els eleme a listafej (head). A lista vge (end) az utols elem. A lista farka (tail) az els n elem elhagysval kapott lista. A lista esetben is tudnunk kell annak mrett, amely a benne trolt elemek szmt jelenti. Szeretnnk ismt hangslyozni, hogy ez a lers a lista adatszerkezetre vonatkozik, s nem annak trolsi mdjra. A trolsi md (reprezentci) ennl az adatszerkezetnl is lehet folytonos s sztszrt is.

11.3.2.1 Lncolt listk


A sztszrt trols egyik gyakran alkalmazott mdszere az n. lncolt lista, amely lehet egyirnyban vagy ktirnyban lncolt. Beszlnk tovbb cirkulris (krkrs) listrl is, mely szintn lehet egy- s ktirnyban lncolt is. Lncolt listval azonban nemcsak lista adatszerkezetet, hanem brmilyen adatszerkezetet (tmbt, halmazt, stb.) reprezentlhatunk. Lsd: 11.1 fejezet. 62. kp 63. kp Egyirnyban lncolt lista Ktirnyban lncolt lista Cirkulris lista 111

64. kp

ALGORITMIZLS ALAPJAI A lncolt lista trolsi mdszer esetben minden elem tartalmaz egy adattagot s egy vagy kt mutattagot. Az adattag az elem ltal trolt rtk, mg a mutat(k) szerepe a kvetkez (s elz) elem kijellse. Specilis az els elem, melynek nincs megelzje, s az utols elem, melynek nincs kvetkezje. Az utols elem mutattagja egy specilis elemre,a NIL-re mutat. (Minden olyan programozsi nyelvben ltezik implementcija a NIL-nek, amelyek tmogatjk a mutatk hasznlatt.) A lista belpsi pontja a fejnl van. Ezt a fejre mutat olyan elemmel valsthatjuk meg, amelynek csak mutattagja van, adattagja nincs. 65. kp Listaelemek lncolt listban

Cirkulris listnl az utols elem kvetkezelem-mutatja nem a NIL-re, hanem az els elemre mutat. Ktirny lncols esetben az els elem elzelem-mutatjt az utols elemre lltjuk. A cirkulris listba is a fejmutatn keresztl lphetnk be. A lista bejrsa a listaelemek elrst jelenti. Ha csak egy irnyban (az elstl az utols fel) kell bejrnunk a listt, elegend az egyirny lncols. Ha szksges ismernnk egy elem megelzjt is, akkor viszont clszer a ktirny lncols, br enlkl is bejrhat a lista a lncolssal ellenttes irnyban is: a megelz elem az az elem, amelynek kvetkezelem-mutatja ppen az aktulis elemre mutat. Ha viszont ezt a mdszert hasznljuk, akkor az elz elem megtallshoz be kell jrnunk a lista sszes, az aktulis elem eltti elemt. Egy elem beszrsa brhov megtrtnhet a listban. Specilis eset, ha a fej el (j els elemknt) vagy a vg mg (j utols elemknt) szrunk be elemet. A beszrs azrt hatkonyabb, mint pldul a tmbnl, mert a mr listban lv elemek fizikai mozgatsra nincs szksg. A beszrs sorn helyet kell foglalnunk a memriban az j elemnek, majd be kell lltani a megelz elem (illetve ktirny lncolsnl a rkvetkez elem) mutatjt erre a most beszrt elemre. A fejnl s a vgnl ettl klnbz mdon kellhet eljrnunk. (Cirkulris lista esetben nem.) 66. kp Elem beszrsa a lncolt listba

Az elem trlse nem ignyel fizikai trlst. Bejrssal megkeressk a trlend elem megelzjt, majd annak kvetkezelem-mutatjt a trlend elem rkvetkezzje lltjuk. Ha a lista ktirnyban lncolt, akkor a trlend elem rkvetkezjnek elzelemutatjt a trlend elemet megelz elemre lltjuk. A fejnl s a vgnl itt is ettl eltr teendnk lehet. 67. kp Elem trlse a lncolt listbl 11.3.3 Verem A verem (stack, LIFO) adatszerkezet egy olyan lista adatszerkezet, amelyben az j elemet mindig a lista elejre helyezhetjk el, illetve elemet is csak a lista tetjrl rhetnk el. A verem adatszerkezetben elszr mindig a legutoljra eltrolt elemhez frhetnk hozz, miutn ezt kivettk (trltk), jhet az utols elttinek eltrolt elem s gy tovbb. 68. kp 112 Verem

ALGORITMIZLS ALAPJAI

A verem reprezentcija trtnhet folytonos s sztszrt trolsi mdszerrel is. 11.3.4 Sor A sor (queue, FIFO) adatszerkezet olyan lista, amely a fejnl bvthet, de a vgnl rhetk el az elemei. Azt az elemet rthetjk el elszr, amelyet elszr troltunk el benne. A sor adatszerkezet segtsgvel valsthat meg pl. a billentyzetpuffer, amely a billentyzeten lenyomott gombok kdjt trolja a felhasznlsig. 69. kp 11.3.5 Fa Az informatikban nagyon gyakran hasznlt adatszerkezet. Tallkozhatunk vele pldul az opercis rendszerek logikai fjlkezelsnl a knyvtrak szerkezetnek tanulnyozsakor. A fa egy krmentes irnytott grf, a fa adatszerkezet hierarchikus. Az elemek alfl rendeltsgi viszonyban vannak. A grf kiindul eleme a gykr, ennek nincs szleleme. A grf tbbi elemre igaz, hogy pontosan egy szl, s tetszleges szm leszmrazott (utd) eleme lehet, kivve a levlelemeket. A levlelemeknek nincs utdja. 70. kp Fa Sor

Az informatikban fontos szerepe van az n. binris fknak. Ezekben minden elemnek legfeljebb kt rkvetkezje lehet (a szigoran binris fknl ez a szm pontosan 0 vagy pontosan 2 lehet). Ezeket a rkvetkezket szoks bal s jobb oldali rkvetkezknek jellni. A fa reprezentlsa trtnhet folyamatos s sztszrt brzolsi mdszerrel is. Minden elemnl trolni kell az adattagot, s szksg van egy bal s egy jobb oldali rkvetkezelem-mutatra. A levlelemek mutati NIL-ek. 71. kp Binris fa reprezentlsa

A fk esetben az elemek elrse szintn bejrssal trtnik. A fabejrs tbbfle mdon trtnhet annak fggvnyben, hogy milyen cllal hoztuk ltre a ft. Preorder bejrs: ha a fa res, akkor vge az eljrsnak. Ha nem, akkor dolgozzuk fel a gykrelemet, majd preorder eljrssal jrjuk be a bal oldali rszft, majd a jobboldali rszft. 72. kp Preorder fabejrs Inorder bejrs: ha a fa res, akkor vge az eljrsnak. Ha nem, akkor jrjuk be inorder mdon a bal oldali rszft, dolgozzuk meg a gykrelemet, vgl jrjuk be inorder mdon a jobboldali rszft. 73. kp Inorder fabejrs

113

ALGORITMIZLS ALAPJAI Posztorder bejrs: ha a fa res, akkor vge az eljrsnak. Ha nem, akkor posztorder mdon jrjuk be a bal oldali, majd a jobb oldali rszft, vgl dolgozzuk fel a gykrelemet. 74. kp Posztorder fabejrs 11.3.6 Hl A fa adatszerkezettel szemben ennl az adatszerkezetnek akrhny megelzje s rkvetkezje lehet. Egy elem akr sajt maga megelzje s rkvetkezje is lehet. Reprezentcija n. szomszdossgi listval vagy szomszdossgi mtrixszal trtnhet. 75. kp Hl s reprezentcija

A grf egy tja egy listt alkot elemsorozat: hogyan juthatok el az A csompontbl B-be. A hl nem krmentes, vagyis ltez(het)nek benne krk. A krt olyan t, amelynek utols eleme egyben az els is. 11.4 SSZEFOGLALS Ebben a leckben betekintst adtunk az informatikban gyakran hasznlt dinamikus adatszerkezetek vilgba. Szt ejtettnk a klnbz adatszerkezetek reprezentciirl is. Mivel azonban ezek az adatszerkezetek, illetve ezek kzl nem mindegyik ll rendelkezsnkre a klnbz programozsi nyelvek szolgltatsaknt (van olyan nyelv, amelyik kszen adja a programoznak pldul a listt vagy a vermet, mg ms nyelveknl a programoz dolga a megvalsts), ezek implementlstl s kezelsnek algoritmusszint bemutatstl eltekintettnk. Az rdekldk szmos irodalomban megtalljk ezeket az algoritmusokat, de ezek megrtshez, fknt sztszrt trolsi mdszerek alkalmazsa mellett ltalban szksges az adott nyelv mlyebb ismerete.

11.5 NELLENRZ KRDSEK


1. Milyen esetekben indokolt dinamikus adatszerkezetek hasznlata? 2. Gondolja t, milyen adatszerkezetek alkalmazsa lehet szksges egy olyan szoftverben, amely nyilvntartja egy knyvtr llomnyt, s a klcsnzsek adatait is, az ezekhez kapcsold egyb adatokkal egytt. 3. Mi a klnbsg fa s binris fa kztt? 4. Mi a klnbsg sor s verem kztt?

11.6 GYAKORL TESZTEK

114

ALGORITMIZLS ALAPJAI

12. SSZEFOGLALS
12.1 A KURZUSBAN KITZTT CLOK SSZEFOGLALSA Az algoritmizls alapjainak megismerse minden informatikval foglalkoz szakember szmra szksges lehet munkja sorn. A szoftvertechnolgia fejldsvel talakulban van ez a szksglet, hiszen az jabb szoftverek jabb eszkzei sok olyan feladat megoldst automatizljk, amelyeket korbban csak programozsi eszkzkkel lehetett megvalstani. Nem szabad azonban megfeledkeznnk arrl, hogy az algoritmusok tervezse s megvalstsa nem azonos tevkenysg a programozssal, mg akkor sem, ha a programozs sorn nagyon gyakran van szksgnk algoritmusokra. Az algoritmizls nem ktdik csupn egyetlen programozsi nyevhez, s algoritmusokat nemcsak programozsi feladatok megoldsakor hasznlunk. Jegyzetnk clja, hogy bevezetst adjunk az algoritmusok megismershez. A jegyzetet elssorban az informatikval, s fknt a programozssal nem szakmaszeren foglalkoz szakemberek kpzsben tartjuk felhasznlhatnak, br a jegyzetben szerepl ismereteket azok is fel tudjk hasznlni, akik a programozssal (s gy az algoritmusokkal) szorosabb kapcsolatban llnak tanulmnyaik sorn. Mivel az algoritmusok tgabb rtelemben adatokon vgzett manipulcik sorozata, szksges, hogy az informatikban gyakran alkalmazott adatszerkezetekbe is betekintst nyerjnk. Jegyzetnk azokat az adatszerkezeteket trgyalta, amelyek az alapvet algoritmusok megadshoz s elemzshez szksgesek. Az adattpusokat, adatszerkezeteket vizsgl s az ehhez kapcsold tudomnyok (pl. tpuselmlet) a formlis matematika eszkzeit alkalmazzk. Jegyzetnkben ezeket az eszkzket nem hasznltuk, az absztrakt s formlis megkzelts helyett a gyakorlati alkalmazsok bemutatsa volt a clunk.

12.2 TARTALMI SSZEFOGLALS 12.3 A TANANYAGBAN TANULTAK RSZLETES SSZEFOGLALSA


12.3.1 Bevezets A leckben ttekintettk a kurzus cljait. Szt ejtettnk arrl, hogy az informatika mely terletein lehet szksg algoritmusok ismeretre, illetve milyen kapcsolat van az algoritmusok s az n. imperatv programozsi nyelvek kztt. 12.3.2 Algoritmusok jellemzi s lersuk Ebben a leckben az algoritmusok jellemzirl, illetve a megadsukkal kapcsolatos legfbb jellemzkrl beszltnk. Az algoritmusokkal szemben tmasztott kvetelmnyek kzl az egyik legfontosabb az egyrtelmsg. Ez vonatkozik mind a problma felvetse, mind pedig a megolds krdseire. Ha nem definiljuk egyrtelmen, hogy mi a feladat, akkor algoritmust sem tudunk r adni.

115

ALGORITMIZLS ALAPJAI Ha megadjuk egy problma megoldsnak egy algoritmust, akkor tudnunk kell azt pontosan lerni is. Ehhez klnfle algoritmusler eszkzket hasznlhatunk, a 2. lecke ezen eszkzket s jellemziket is bemutatta. 12.3.3 Adatok, adatszerkezetek Ebben a leckben az algoritmusokban s a programokban megjelen adatokrl s azok jellemzirl beszltnk. Az algoritmusok absztrakt eszkzk, de a bellk kszlt programok konkrt utastssorozatok. Az adatok kapcsn is megfigyelhet ilyen kettssg: mg az algoritmusok megadsakor nem tulajdontottunk jelentsget az feldolgozand adatok tpusnak (kivve az egyrtelm helyzeteket: pl. sszegzs nem hajthat vgre sztringeken), a konkrt nyelvi implementcikban kzponti krds is lehet, hogy milyen adattpusokat, adatszerkezeteket hasznljunk s ezeket hogyan deklarljuk. A lecke bemutatta az algoritmizlsban s a programozsban alkalmazott gyakori adattpusokat s adatszerkezeteket. Szt ejtettnk a literlokrl s vltozkrl, a vltozk azonostirl, jellemzikrl adattpus: rtkkszlet s rtelmezett mveletek kre, hatkr, lettartam , memriabeli reprezentlsukrl s az ltaluk felvehet rtkekrl. 12.3.4 Adatsorhoz egy adatot rendel eljrsok 1. Az elemi algoritmusok kztt ebben a leckben az sszegzs, eldnts, megszmlls, kivlaszts s szlsrtk-kivlaszts tteleivel ismerkedtnk meg. 12.3.5 Adatsorhoz egy adatot rendel eljrsok 2. Keressek Ez a lecke a kereseljrsokat, illetve azok kzl az egyszerbbeket mutatta be. A keress az infromatikban a leggyakoribb mveletk kz tartozik. Azrt hasznlunk adatbzisokat, azrt fontos az adatbzisok minl hatkonyabb gpi megvalstsa, hogy minl gyorsabban talljunk meg bennk keresett adatokat. 12.3.6 Adatsorhoz adatsort rendel eljrsok 1. Ebben a leckben kt gyakran hasznlt eljrs algoritmust tekintettk t: a kivlogatst s az sszefuttatst. 12.3.7 Adatsorhoz adatsort rendel eljrsok 2. Rendez eljrsok A keresseket bemutat leckben szt ejtettnk az adatok rendezettsgnek fontossgrl. Rendezett adatsorokon gyorsabb tehet a keress, mint rendezetleneken, ezrt fontos a klnbz rendez eljrsok ismerete. 12.3.8 Pldk az eljrsok alkalmazsra Ebben a leckben szmos konkrt pldval tallkozhat az olvas. A pldk esetben nem fontosak a konkrt trolt rtkek, ezek pontos ismerete nlkl is kszthetnk algoritmusokat. A konkrt adatok csak azrt szerepeltek ebben a leckben, hogy az algoritmusokkal generlt eredmnyek sszevethetk legyenek az Olvas ltal helyesnek vlt eredmnyekkel, gy az algoritmusok ellenrizhetbbek.

116

ALGORITMIZLS ALAPJAI

12.3.9 Algoritmusok hatkonysga Ez a rvid lecke csak betekintst nyjt az n. bonyolultsgelmletbe. Az algoritmusok hatkonysgnak mrse nagyon fontos, mert ezzel egy algoritmusnak nemcsak a gyorsasga mrhet, hanem ms kltsge is. 12.3.10 Alprogramok A strukturlt programozs egyik fontos eszkze volt az alprogramok megjelense a magasszint programozsi nyelvekben. A strukturlt programozs ta mr megjelent egy jabb paradigma, az n. objektumorientlt programozs, de az alprogramok szerepe nem cskkent. A programokban ktfle alprogram hasznlhat, az eljrs s a fggvny. Az eljrs tulajdonkppen egy nvvel elltott kdrszlet, gy tekinthet a programozsi nyelv utastskszlett kibvt eszkznek is. A fggvnyeknek nincs mellkhatsuk, van viszont visszatrsi rtkk, gy a fggvnyeket a programozsi nyelvben hasznlhat opertorok krt kibvt eszkzknt is felfoghatjuk. Az alprogramok paramterezhetk. Ebben a leckben szt ejtettnk a formlis s aktulis paramterlistrl, illetve rintlegesen a paramterkirtkels krdseirl is. Szintn ebben a fejezetben trgyltuk a hatkr s az lettartam krdseit is. 12.3.11 Dinamikus adatszerkezetek A utols fejezetben az informatikban gyakran hasznlt dinamikus adatszerkezetek legfontosabb jellemzit tekintettk t.

12.4 ZRS
A jegyzet, mint azt a bevezetben is lertuk, fknt azon hallgatk szmra kszlt, akiknek tanulnyaik sorn tallkozniuk kell algoritmusokkal, de az algoritmizls s a programozs nem tartozik a f trgyaik kz. A jegyzet szmos pontjt tallkozhatunk nyitva hagyott krdsekkel, melyek kutatst az olvasra bztuk. Ennek az az oka, hogy ezek a krdsek ltalban messze tlmutatnak jelen ktet hatrain s cljain, viszont fontosnak tartottuk megemltsket, mert a tmhoz szorosan kapcsold krdsekrl van sz. Remnyeink szerint a tananyagot feldolgoz hallgatk ms informatikai kurzusok tanulmnyozsa sorn is hasznt veszik az itt lertaknak.

12.5 EGYB

117

ALGORITMIZLS ALAPJAI

13. KIEGSZTSEK

13.1 IRODALOMJEGYZK
13.1.1 Hivatkozsok

Knyv
DONALD E. KNUTH:

A szmtgp-programozs mvszete. 13. ktet. Mszaki Knyvkiad, Budapest, 1987, 1988 FEKETE ISTVN: Algotimusok s adatszerkezetek I. Egyetemi jegyzet. Etvs Lornd Tudomnyegyetem, 2009 IVNYI ANTAL et al.: Informatikai algoritmusok 1. ELTE Etvs Kiad, Budapest, 2004 JRDN TAMS POMAHZI SNDOR: Adatszerkezetek s algoritmusok. EKTF Lceum Kiad, Eger, 1996 JUHSZ ISTVN: Informatika II. Adatszerkezetek s algoritmusok. Egyetemi jegyzet, Kossuth Lajos Tudomnyegyetem, 2000 JUHSZ ISTVN KSA MRK PNOVICS JNOS: C pldatr. Panem Knyvkiad, Budapest, 2005 NYKYN GAIZLER JUDIT szerk.: Programozsi nyelvek. Kiskapu Kiad, Budapest, 2003 THOMAS H. CORMEN CHARLES E. LEISERSON RONALD L. RIVEST: Algoritmusok. Mszaki Knyvkiad, Budapest, 1997

118