Bevezetés az algoritmikába - kolcsey.ro · sonlításos rendezési módszerek közül a...

256
Bevezetés az algoritmikába Egyetemi jegyzet Ionescu Klára [email protected] Kolozsvár, 2007

Transcript of Bevezetés az algoritmikába - kolcsey.ro · sonlításos rendezési módszerek közül a...

  • Bevezets az algoritmikbaEgyetemi jegyzet

    Ionescu Klra

    [email protected]

    Kolozsvr, 2007

  • Bevezets az algoritmikba

  • Mszaki szerkeszt: Ionescu Klra s Buzogny Lszl

    Formtuma: B5 vgott

    Nyomtatta s kttte: Egyetemi Knyvkiad Kolozsvr

    Szaklektorok: dr. Ksa Zoltn, Buzogny Lszl s Takcs Andrea

  • TartalomjegyzkBevezets............................................................................................................9

    1. A SZMTGPES FELADATMEGOLDS LPSEI...........................131.1. A programozi tevkenysg...............................................................131.2. A feladatmegolds lpsei szmtgpes krnyezetben.....................141.3. Alkalmazsok minsgi szempontjai.................................................15

    2. AZ ALGORITMUSOK BRZOLSA....................................................172.1. Algoritmusok.....................................................................................17

    2.1.1. Az algoritmus fogalma....................................................................................................172.1.2. Az algoritmusok lersnl hasznlt elemek...................................................................19

    2.2. Algoritmusok brzolsa folyamatbrk s pszeudokd nyelvek segtsgvel..........................................................................................23

    2.3. A strukturlt programozs alapelvei...................................................262.3.1. Lineris struktrk...........................................................................................................272.3.2. Elgazsi struktrk........................................................................................................272.3.3. Ismtl struktrk............................................................................................................282.3.4. Az alapstruktrk jellse pszeudokdban.....................................................................322.3.5. Egyszer alapszablyok..................................................................................................35

    2.4. A feladatok szmtgpes megoldshoz fzd ltalnos krdsek. 352.4.1. Algoritmusok helyessge................................................................................................362.4.2. Az algoritmus vgrehajtshoz szksges id................................................................392.4.3. Az algoritmus ltal feldolgozott adatok szmra szksges memria mrete...............432.4.4. Algoritmusok egyszersge............................................................................................432.4.5. Algoritmusok optimalitsa..............................................................................................432.4.6. Algoritmusok ltezse.....................................................................................................44

    2.5. Megoldott feladatok...........................................................................452.5.1. Felcserls.......................................................................................................................452.5.2. Maximumrtk................................................................................................................452.5.3. Elnkvlaszts.................................................................................................................47

    2.6. Kitztt feladatok..............................................................................49

    3. LPSEK FINOMTSA...........................................................................513.1. Bevezets...........................................................................................513.2. Megoldott feladatok...........................................................................51

    3.2.1. Eukleidsz algoritmusa...................................................................................................513.2.2. Prmszmok.....................................................................................................................533.2.3. Fibonacci-szmok............................................................................................................593.2.4. Hromszg.......................................................................................................................623.2.5. Fordtott szm..................................................................................................................633.2.6. Trzstnyezk.................................................................................................................653.2.7. Konverzi........................................................................................................................66

  • 6 TARTALOMJEGYZK

    3.2.8. Gyors hatvnyozs..........................................................................................................69

    3.3. Kitztt feladatok..............................................................................69

    4. PROGRAMOZSI TTELEK....................................................................734.1. Bevezets...........................................................................................734.2. Egyszer programozsi ttelek..........................................................73

    4.2.1. sszeg s szorzat.............................................................................................................734.2.2. Dnts..............................................................................................................................754.2.3. Kivlaszts.......................................................................................................................784.2.4. Szekvencilis (lineris) keress......................................................................................794.2.5. Megszmlls..................................................................................................................824.2.6. Minimum- s maximumkivlaszts................................................................................834.2.7. Kivlogats......................................................................................................................85

    4.3. sszetett programozsi ttelek...........................................................874.3.1. Sztvlogats...................................................................................................................874.3.2. Sorozat halmazz alaktsa.............................................................................................904.3.3. Keresztmetszet................................................................................................................924.3.4. Egyests..........................................................................................................................934.3.5. sszefsls....................................................................................................................94

    4.4. Megoldott feladatok...........................................................................974.4.1. sszeg..............................................................................................................................974.4.2. Prok................................................................................................................................984.4.3. Arny...............................................................................................................................984.4.4. Hmrsklet.....................................................................................................................984.4.5. Teljes ngyzet..................................................................................................................994.4.6. Ngyzetgyk..................................................................................................................1004.4.7. Statisztika......................................................................................................................1014.4.8. Osztlyfnk.................................................................................................................1024.4.9. Bvs ngyzet...............................................................................................................1034.4.10. Maximlis sszeg leghosszabb rszsorozat................................................................104

    4.5. Kitztt feladatok............................................................................107

    5. ALPROGRAMOK.....................................................................................1115.1. Bevezets.........................................................................................1115.2. Algoritmusok s programok fejlesztsi mdozatai...........................113

    5.2.1. A top-down tpus (fentrl lefele) programozs..........................................................1135.2.2. A bottom-up (lentrl felfele) programozs...................................................................1135.2.3. Modulris algoritmustervezs.......................................................................................1145.2.4. Megoldott feladat..........................................................................................................114

    5.3. A modulris programozs alapszablyai..........................................1175.3.1. Modulris dekompozci...............................................................................................1175.3.2. Modulris kompozci..................................................................................................1185.3.3. Modulok tulajdonsgai..................................................................................................1185.3.4. A modularits alapelvei.................................................................................................118

    5.4. Algoritmusok helyessgnek ellenrzse.........................................1195.4.1. A fekete doboz mdszere..............................................................................................1195.4.2. Az tltsz doboz mdszere..........................................................................................119

    5.5. Megoldott feladatok.........................................................................120

  • TARTALOMJEGYZK 7

    5.5.1. Polinom rtke adott pontban.......................................................................................1205.5.2. Polinomok sszege........................................................................................................1215.5.3. Polinomok szorzata.......................................................................................................1215.5.4. Determinns..................................................................................................................122

    5.6. Kitztt feladatok............................................................................126

    6. RENDEZSI ALGORITMUSOK.............................................................1316.1. Bevezets.........................................................................................1316.2. sszehasonltsos rendezsi mdszerek...........................................131

    6.2.1. Buborkrendezs (Bubble-sort)....................................................................................1316.2.2. Egyszer felcserlses rendezs...................................................................................1346.2.3. Vlogatsos rendezs....................................................................................................1356.2.4. Minimum/maximum kivlasztsra pl rendezs......................................................1366.2.5. Beszr rendezs...........................................................................................................136

    6.3. Rendezsek lineris idben..............................................................1376.3.1. Leszmll rendezs (ldarendezs, Binsort)...............................................................1386.3.2. Szmjegyes rendezs (Radix-sort)................................................................................138

    7. REKURZI...............................................................................................1417.1. Bevezets.........................................................................................1417.2. Kzvetlen rekurzi...........................................................................1427.3. Megoldott feladatok.........................................................................145

    7.3.1. Egy sz betinek megfordtsa.....................................................................................1457.3.2. Szavak sorrendjnek megfordtsa...............................................................................1477.3.3. Faktorilis......................................................................................................................1477.3.4. Legnagyobb kzs oszt...............................................................................................1487.3.5. Szmjegysszeg............................................................................................................1487.3.6. Descartes-szorzat...........................................................................................................1497.3.7. k elem rszhalmazok...................................................................................................1517.3.8. Konverzi......................................................................................................................1537.3.9. Fibonacci-sorozat (Vigyzat: ellenplda!)....................................................................153

    7.4. Rekurzv szerkezet feladatok.........................................................1557.4.1. A {0, 1, 2} halmaz elemeivel generlt sorozatok.........................................................1557.4.2. Az {1, 2, ..., n} halmaz minden rszhalmaza................................................................1567.4.3. Partcik.........................................................................................................................1567.4.4. Halmazpartcik............................................................................................................1577.4.5. Kamatos kamat..............................................................................................................159

    7.5. Kitztt feladatok............................................................................160

    8. A VISSZALPSES KERESS MDSZERE (BACKTRACKING)......1618.1. Bevezets.........................................................................................1618.2. A visszalpses keress ltalnos bemutatsa..................................161

    8.2.1. Iteratv algoritmus.........................................................................................................1628.2.2. Rekurzv algoritmus......................................................................................................1638.2.3. 8 kirlyn a sakktbln..................................................................................................1658.2.4. Varicik.......................................................................................................................1688.2.5. Zrjelek........................................................................................................................171

  • 8 TARTALOMJEGYZK

    8.2.6. Legrvidebb utak...........................................................................................................1728.2.7. Jtkok...........................................................................................................................1738.2.8. Szrjektv fggvnyek..................................................................................................174

    8.3. A visszalpses keress bvtse......................................................1758.3.1. S pnzsszeg kifizetse.................................................................................................1778.3.2. sszegkifizets, minimum szm bankjeggyel............................................................179

    8.4. Visszalpses keress a skban.........................................................1808.4.1. Labirintus.......................................................................................................................1808.4.2. Fnykp.........................................................................................................................1838.4.3. Legnagyobb mret trgyak..........................................................................................184

    8.5. Kitztt feladatok............................................................................186

    9. AZ OSZD MEG S URALKODJ MDSZER (DIVIDE ET IMPERA).. .1919.1. Bevezets.........................................................................................1919.2. Az oszd meg s uralkodj mdszer ltalnos bemutatsa..................1919.3. Megoldott feladatok.........................................................................192

    9.3.1. Szorzat...........................................................................................................................1929.3.2. Minimumszmols........................................................................................................1939.3.3. Hatvnyozs..................................................................................................................1949.3.4. Binris keress...............................................................................................................1959.3.5. sszefslsen alapul rendezs (MergeSort).............................................................2009.3.6. Gyorsrendezs (QuickSort)...........................................................................................2019.3.7. Hanoi tornyok................................................................................................................2059.3.8. szmedence................................................................................................................207

    9.4. Kitztt feladatok............................................................................210

    10.MOH ALGORITMUSOK (GREEDY MDSZER)...............................21310.1. Bevezets.........................................................................................21310.2. A moh algoritmus ltalnos bemutatsa.........................................21410.3. Megoldott feladatok.........................................................................216

    10.3.1. sszeg...........................................................................................................................21610.3.2. Az tlagos vrakozsi id minimalizlsa....................................................................21610.3.3. Buszmegllk................................................................................................................22010.3.4. Aut brbeadsa............................................................................................................22110.3.5. Htizsk.........................................................................................................................22410.3.6. Minimlis fesztfk (Kruskal s Prim)........................................................................22610.3.7. Minimlis hosszsg utak (Dijkstra algoritmusa)......................................................230

    10.4. Heurisztikus moh algoritmusok.....................................................23610.4.1. Utazgynk.................................................................................................................23610.4.2. Grfsznezs..................................................................................................................23910.4.3. sszegkifizets legkevesebb szm bankjeggyel.........................................................240

    10.5. Kitztt feladatok............................................................................241Algoritmusok listja........................................................................................249Szakirodalom..................................................................................................251

  • BevezetsA szmtgp megjelense, de fleg erteljes behatolsa a gazdasgba, majdnem minden munkahelyre s az emberek szemlyes letbe ma mr azt jelenti, hogy a szmtgppel megoldhat feladatok s alkalmazsok egyre vltozatosabbakk, egyre sszetettebbekk s elengedhetetlenl szksgesekk vltak. Amikor egy szmtgpet hasznlunk, nemcsak a gp mkdik, hanem azok a programok is, amelyek biztostjk, ellenrzik s sszehangoljk a szmtgp mkdst, s lehetv teszik azoknak a programoknak a vgrehajtst, amelyek kzvetlenl fontosak az alkalmazsaink szempontjbl. Ebbl kvetkezik, hogy a tvoli jvben is egszen biztosan egyre tbb programra lesz szksg a vilgban. Ez jl hangzik a kezd programoz szmra, de szmolnunk kell egy sor sajtos kvetkezmnnyel. Mr ma sem lehet csak gy sszedoblni egy programot, de a jvben mg tbb szably, mdszer s megszorts vrhat, amelyek a csoportmunkt, olvashat programok rst s a knny frisstseket hivatottak biztostani.

    A programokat, ltalban egy megrendel szmra rja a programoz cg, teht az els legfontosabb cl a megrendel ignyeit kielgteni. De ahhoz, hogy egy cgnek ez eredmnyesen sikerljn, megfelel tervezsi s megvalstsi stratgit kell kvetnie.

    Egy alkalmazs kivitelezshez nem elg a programozsi krnyezet ismerete. Ennl fontosabb elsajttani a feladatok elemzsi mdszereit, megtanulni kivlogatni a legelnysebb eszkzket (programozsi nyelvet, illetve krnyezetet, a krnyezet knyvtraiban ltez alprogramokat, korbban megrt programrszleteket, sajt unitokat stb.), megtallni a leghatkonyabb algoritmusokat s eredmnyesen kdolni ezeket.

    Ennek a jegyzetnek az egyik clja felkszteni a kezd programozt arra, hogy a fent felsorolt kvetelmnyeknek eleget tehessen. Ltni fogjuk, hogy ezek kztt a legignyesebb tevkenysg az algoritmus megtervezse s annak beltsa, hogy az valban helyes s megfelelen hatkony. Ehhez elssorban gondolkodnunk kell, de a gyakorlat is rendkvl fontos.

    A jegyzet teht az algoritmusokkal foglakozik. A hallgat implementlhatja ezeket valamely, mr eddig megismert programozsi krnyezetben, illetve, ennek hinyban, ajnljuk a Pascal nyelv elsajttst. (A jegyzet nem tartalmazza egyetlen programozsi nyelv szintaxist sem.) A kitztt feladatok megoldsa

  • 10 BEVEZETS

    az algoritmus megtervezst s a megfelel program megvalstst jelenti. Ezrt a jegyzetbe programozsra vonatkoz sajtos tancsok is bekerltek.

    Egy adott feladat megoldsra lehetsges tbb, klnbz programot rni: valjban k programoz k klnbz megoldst fog adni, de ezeknek az alapja sok esetben ugyanaz az algoritmus. De az algoritmusok is klnbzhetnek ugyanazon feladat megoldsakor. Ezek lehetnek egyenrtkek, vagyis azonos hatkonysgak, de lehetnek klnbzk a hatkonysg szempontjbl is. Ilyenkor mondjuk, hogy egyik algoritmus kisebb bonyolultsg mint a msik. A bonyolultsg fogalmnak trgyalsa nem clja a jegyzetnek, de a feladatok elemzse s megoldsa sorn elkerlhetetlen a bonyolultsg megllaptsa, fleg akkor, amikor kt vagy tbb algoritmust ssze fogunk hasonltani. Bemutatsra kerl nhny alapvet krds az algoritmusok ltezsnek, helyessgnek, futsi idejnek s optimalitsnak bizonytst illeten.

    Az algoritmusokat a tervezs sorn nem szoktuk azonnal egy adott programozsi nyelvben rni, hanem valamilyen brzolsi mdszert vlasztunk. E mdszerek kzl egyesek grafikai eszkzket hasznlnak (pldul a folyamatbrk), msok lerjk vzlatosan az algoritmust (pszeudokd nyelvek). Ezen brzolsmdokban egyszerstseket s a programozsi nyelveknl kevsb szigor szablyokat alkalmazunk. A jegyzetben az algoritmusokat egy egyszer pszeudokd nyelvben rjuk le, amelynek szintaxist a 2. fejezetben adjuk meg.

    A programfejleszts egyik mdja, amelyet ebben a jegyzetben alkalmazunk a strukturlt programozs alapszablyaihoz igazodik. A strukturlt programozs elemeit, valamint a modulris programozs elnyeit szintn a 2. fejezetben trgyaljuk. A fejezet vgn megoldott feladatok egyszerek, a kezdknek sem okoznak gondot, a kitztt feladatok pedig alkalmat adnak a gyakorlsra.

    Algoritmustervezskor elszr egy vzlatot ksztnk, ezt ellenrizzk, kiegsztjk, mdostjuk, tbbszr javtgatjuk. Az algoritmust kdols utn is tovbb finomtjuk. A lpsenknti finomts elvvel a 3. fejezetben ismerkednk meg.

    Ahhoz, hogy valban hasznos tagjai lehessnk egy programoz csoportnak, nem elg, hogy rtsnk az algoritmusok tervezshez s elemzshez. Olyan algoritmusokat kell megvalstanunk, amelyek knnyen olvashatk s amelyek bizonyos mintkhoz (szablyokhoz) igazodnak. Ezeket a mintkat programozsi ttelek elnevezs alatt a 4. fejezetben mutatjuk be. A programozsi ttelek egyszer feladatok hatkony algoritmusai, amelyek rszalgoritmusok formjban felhasznlhatk ksbbi feladataink megoldsaiban.

    Az 5. fejezetben tulajdonkppen mr a programozsi gyakorlatra kszlnk. Megismerkednk a feladatok rszfeladatokra bontsnak kvetkezmnyeknt megvalstand olyan algoritmusokkal, amelyeket alprogramokkal implement

  • BEVEZETS 11

    lunk s ezeknek az sszefzsi mdjaival (top-down s bottom-up programozsi stlus).

    A 6. fejezet a legfontosabb rendezsi algoritmusokat trgyalja: az sszehasonltsos rendezsi mdszerek kzl a buborkrendezst, az egyszer felcserlses rendezst, a vlogatsos rendezst, a minimum/maximumkivlasztsra pl rendezst s a beszr rendezst fogjuk megismerni. A lineris rendezsek kzl bemutatsra kerl a leszmll rendezs s a szmjegyes rendezs.

    Miutn a 7. fejezetben megismerkednk a rekurzi fogalmval, a 8. fejezetben elsajttjuk a visszalpses keress (backtracking) technikjt, a 9. fejezetben az oszd meg s uralkodj mdszert (divide et impera) tanulmnyozzuk, a 10.-ben pedig a moh algoritmusokat (greedy). A fejezetek vgn tbb megoldott feladatot mutatunk be, s ms feladatokat pedig megoldsra ajnlunk.

    Az algoritmusok tanulmnyozsa nem r vget ezzel a jegyzettel. A ksbbiekben az adatszerkezetek tanulmnyozsa vr rnk. Ezeket az adatszerkezeteket sajtos algoritmusokkal dolgozzuk fel. Algoritmusok tervezse s elemzse cmmel jabb eladssorozat keretn bell ms algoritmusokkal s mdszerekkel (pldul a dinamikus programozs mdszervel, a Branch and Bound-dal, Dirichlet skatulya-elvvel, vletlenszm genertorra pl nemdeterminisztikus algoritmusokkal stb.) fogunk tallkozni. Ugyanott jabb elemzsi mdszereket s az algoritmusok helyessgnek bizonytsait fogjuk elsajttani.

    Nem lltom, hogy minden csak gy igaz, ahogy ebben a jegyzetben le van rva. Vrom az olvask szrevteleit, s elre ksznm a javaslatokat.

    Kvnok sikeres tanulst s sok rmt az algoritmusok szpsgeinek felfedezse sorn!

    * * *

    Ksznm Ksa Zoltn s Horia Georgescu tanr urak sok ve tart megtisztel bartsgt, szakmai tancsaikat, Buzogny Lszlnak s Ksa Zoltnnak a figyelmes szaklektorlst.

    Ksznm Takcs Andrenak a msodik kiads eltt vgzett pontos s ignyes ellenrz munkjt.

    Kolozsvr, 2007. augusztus 28. I. K.

  • 12 BEVEZETS

  • 1 A SZMTGPES FELADATMEGOLDS LPSEI1.1. A programozi tevkenysgA szmtgp egy feladatot akkor kpes megoldani, ha vgrehajtjuk rajta azt a programot, amelyet abbl a clbl rtunk, hogy a feladatot megoldja. A felhasznl a programon keresztl irnytja a szmtgp ltal elvgzend lpseket s biztostja a feladat automatikus mdon val megoldst.

    Tudvalev, hogy egy alkalmazs nem egyetlen program megrst jelenti, hanem tbb szemly, tbbhetes, esetleg tbbves munkjt egy teljes programrendszer ltrehozsra. Ha pldul egy olyan rendszert kell megvalstani, amely egy vros vzelltst hivatott ellenrizni s irnytani, a programokba a legaprbb rszletekig be kell vinni minden lehetsges rszfeladat megoldst gy, hogy az eredmny a lehet legrvidebb id alatt megszlessen. De ezt a programrendszert a vrosban megjelen j pletek szmra llandan bvteni kell, ms pletek mdosulhatnak, illetve eltnhetnek, teht az ilyen tpus mdostsokat is folyamatosan el kell vgezni.

    A programozk ma mr fleg csapatban dolgoznak, gy szksgess vlt a programozi tevkenysg szablyozsa, egy bizonyos sajtos fegyelem megkvetelse, a programozk kzti kommunikci szabvnyostsa, valamint a megoldand feladatok szvegeinek megfelel specifiklsa.

    A programozs trtnetben az els ksrlet, amely a programozsi munka egyszerstst tzte ki cljul a modulris programozs elveknt vlt ismertt (1956). Ennek az elvnek az rtelmben az eredetileg bonyolult feladatot rszfeladatokra bontjuk, s az ezeket megold algoritmusokat alprogramokkal kdoljuk. A rszfeladatokat megold alprogramokat sszefzve, megkapjuk az eredeti feladat megoldst.

    A kvetkez fontos lpst a strukturlt programozs megjelense jelentette 1972-ben, amikor E. W. Dijkstra olyan algoritmusokat javasolt, amelyekbl mr

  • 14 1. A SZMTGPES FELADATMEGOLDS LPSEI

    hinyzik a goto utasts1. Ezltal nagymrtkben megntt a programok olvashatsga, frissthetsge, st knnyebb lett azok karbantartsa is. A strukturlt programozs elmleti megalapozst folytatta Bhm s Jacopini, akik bebizonytottk, hogy brmely algoritmus megvalsthat a hrom alapstruktrval, amelyek: a szekvencia, az elgazs (vagy dnts) s az elltesztel ismeretlen lpsszm ciklus (iterci).

    1.2. A feladatmegolds lpsei szmtgpes krnyezetben

    Ha egy bizonyos feladatot szmtgppel szeretnnk megoldani, az ember ltal elvgzend lpsek a kvetkez mdon csoportosthatk [7]:

    a) A kvetelmnyek s a feladat megfogalmazsa A megrendel lerja a kivitelez szmra (sokszor pontatlanul s ellentmondsosan) azt a feladatot, amelyet szmtgpes programmal szeretne megoldani a jvben. A lers (ltalban) a kimenetre sszpontost.

    b) A feladat specifikcija Tbb beszlgets szksges ahhoz, hogy a programoz csoport rendszertervezje pontosan megfogalmazhassa a feladatot (ismernie kell milyen krlmnyek kztt, mekkora mret adatokkal, milyen szmtgpen kerl flhasznlsra az elksztend program). A kvetkez lpsben a rendszertervezk elemzik a megrendel kvetelmnyeit s lefordtjk sajt nyelvkre a feladatot, vagyis ltrehozzk azt a bels hasznlatra kszl dokumentcit, amely a feladat pontos s helyes specifikcijt tartalmazza. Itt mr bemeneti s kimeneti adatokrl, valamint megszortsokrl (a bemeneti adatok s az adatszerkezetek mretrl, az elfogadhat legnagyobb futsi idrl stb.) van sz. A specifikcit ellenrzi a megrendel, ellenrzi a programoz csoport vezetje, de sokszor szksges, hogy egy, a csoporttl fggetlen szakember is elmondja a vlemnyt.

    c) Az algoritmus megtervezse (elemzs, modellek s mdszerek megllaptsa) A specifikci ltrejtte utn a csoport tagjai kivlasztjk a megfelel matematikai modelleket, megtervezik az adatszerkezeteket s eldntik, hogy milyen programozsi krnyezetben milyen mdszereket fognak alkalmazni. A mdszerek s az adatszerkezetek egymst befolysoljk, ezrt gyakran elfordul, hogy tbb megoldsi lehetsg is elemzsre kerl. Az a megolds lesz a jobb, amely a szmtgp erforrsait (memria s id) a leghatkonyabban hasznljk. A feladatot rszfeladatokra bontjk s megtervezik a

    1 A goto utasts hatsra a szmtgp nem a programban kvetkez utastst, hanem a goto-ban feltntetett cmkvel azonostottat hajtja vgre.

  • 1. A SZMTGPES FELADATMEGOLDS LPSEI 15

    megoldsokat. A matematikai modellek, az adatszerkezetek s az algoritmusok kivlasztsa ltalban sszefondik. Ekkor alakulnak ki a modulok s a kztk lev kapcsolatok. A tervezs sorn elkszl egy dokumentci, amely tartalmazza a megolds vzt, a vlasztsok indoklst. Minderre a kdols sorn, valamint a program karbantartsakor lesz szksg.

    d) Kdols (az algoritmus implementlsa egy programozsi nyelvben) Ebben a fzisban az algoritmust trjuk valamilyen programozsi nyelvre, amelyet a feladat jellegnek megfelelen gondosan vlasztunk ki.

    e) Tesztels (ellenrzs s rvnyests, vagyis annak ellenrzse, hogy a bemeneti s kimeneti adatok megfelelnek-e a specifikciknak) E tevkenysg sorn a programoz klnbz tesztadatok esetben tanulmnyozza a program mkdst. Termszetesen, arra szmt, hogy a program a vrt (helyes) adatokat adja, de ezen tlmenen megfigyeli a futsi idt, a biztonsgos mkdst stb. A felfedezett hibkat kijavtja, majd jra ellenrzi az eredmnyt. Sok esetben a tesztels beindulhat sokkal hamarabb, egy-egy rszfeladat megoldsa utn. Tulajdonkppen olyan ellenrzsrl van sz, amely nem ll egy klnll fzisbl, hanem egy folyamatos tevkenysg, amely a tervezs, kdols s karbantarts sorn zajlik. Az ellenrzs lnyeges sszetevje az gynevezett rvnyests. Ezt elbb elvgzi a kivitelez, ksbb a felhasznls sorn a megrendel. Megjegyzend, hogy a megrendel nem vgez ellenrzseket, hanem vals adatokkal futtatja a programot s azt vrja, hogy a program a megfelel alakban rja ki az eredmnyeket.

    f) A tervezi s a felhasznli dokumentci elksztse A dokumentcik a program fontos tartozkai, amelyek a programhoz kapcsold fontos informcikat tartalmazzk. A fejleszti dokumentci lerja, hogyan volt megtervezve a program, a felhasznli dokumentci elmagyarzza, hogyan kell hasznlni a programot.

    g) Felhasznls s karbantarts A megrendel a programot a felhasznls kzben vals adatokkal futtatja. Ez termszetesen hosszabb ideig zajlik, s elfordulhat, hogy a felhasznls sorn bizonyos programrszeket a programoznak meg kell vltoztatnia.

    1.3. Alkalmazsok minsgi szempontjaiHelyessg A program helyes, ha pontosan megoldja a feladatot, megfelel a pontos s helyes specifikcinak.

  • 16 1. A SZMTGPES FELADATMEGOLDS LPSEI

    Megbzhatsg Egy programot megbzhatnak neveznk, ha helyes eredmnyt hatroz meg, s a specifikciban nem lert helyzetekben is intelligens mdon viselkedik.

    Karbantarthatsg A karbantarthatsg annak mrszma, hogy milyen knny a programtermket a specifikci esetleges vltoztatshoz adaptlni. Egyes felmrsek szerint a szoftverkltsgek 70%-t a szoftverek karbantartsra fordtjk! A karbantarthatsg nvelse szempontjbl a kt legfontosabb alapelv: a tervezsi egyszersg s a decentralizci (minl nllbb modulok ltrehozsa).

    jrafelhasznlhatsg Az jrafelhasznlhatsg a szoftvertermkek azon kpessge, hogy egszben vagy rszben jrafelhasznlhatk j alkalmazsokban.

    Kompatibilits A kompatibilits azt mutatja meg, hogy milyen knny a szoftvertermkeket egyms kztt kombinlni.

    Hordozhatsg A program hordozhatsga arra vonatkozik, hogy menynyire knny a programot ms gphez, konfigurcihoz, vagy opercis rendszerhez ltalban ms fizikai krnyezethez igaztani.

    Hatkonysg A program hatkonysga a futsi idvel s a felhasznlt memria mretvel arnyos minl gyorsabb, illetve minl kevesebb memrit hasznl, annl hatkonyabb.

    Bartsgossg A program emberkzelisge, bartsgossga a felhasznl szmra rendkvl fontos: ez megkveteli, hogy a bemenet logikus s egyszer, az eredmnyek formja ttekinthet legyen.

    Tesztelhetsg A tesztelhetsg, a program karbantarti, fejleszti szmra fontos.

  • 2 AZ ALGORITMUSOK BRZOLSA2.1. AlgoritmusokMivel a szmtstechnika egyik bvs szava az algoritmus, lssuk hogyan is alakult ki ez a sz. D. E. Knuth gy vlekedik a sz eredetrl: Az algoritmus sz mr nmagban is nagyon rdekes. gy tnhet egy pillanatig, hogy a logaritmus szt akarta valaki lerni, de nem sikerlt neki, mert sszezagyvlta az els ngy bett.

    A matematikatrtnszek azt lltjk, hogy az algoritmus sz Abu-Ja far Mohammed ibn Mura al-Kvarzmi (780 k.850 k.) arab matematikus nevnek, al-Kvarzmi latinos elferdtsbl szrmazik.

    2.1.1. Az algoritmus fogalmaA mindennapi letben gyakran kerlnk olyan helyzetbe, amikor meglv ismereteink alapjn nem tudjuk azonnal megmondani, hogy elrhet-e a kitztt clunk, s ha igen, hogyan.

    A megolds kt dolgot felttelez: az eredmny milyensgnek, azaz elvrsainknak pontos ismerett; annak a folyamatnak a tervt, amely az eredmny elrshez vezet.

    A cl elrse rdekben megtervezzk az elvgzend cselekvsek sorozatt, vagyis megtervezzk az algoritmust, amely a kvnt eredmnyhez vezet.

    Olyan problmamegold eljrst (algoritmust) kell kidolgoznunk, amely vges szm lpsben befejezdik, s a rendelkezsre ll (bemeneti) adatokbl ellltja az gynevezett eredmnyt (kimeneti adatokat), vagyis megoldja a feladatot. [18]

    Azt gondolhatnnk, hogy mi sem egyszerbb, mint a feladat megoldst a szmtgpre bzni. Igen m, de a szmtgp csak azt tudja elvgezni, amit a felhasznl megnevezett! Ezrt, amikor a szmtgpnek kell megmondanunk, hogy mit csinljon, akkor egyrtelm lerst kell adnunk gy, hogy gpnk szmra is kvethet legyen az elkpzelsnk.

  • 18 2. AZ ALGORITMUSOK BRZOLSA

    Az algoritmust gy is definilhatjuk, mint egy adott feladatkr megoldsra kidolgozott olyan eljrst, amely utastsszeren elre megadott lpsek sorozatbl ll. De ahhoz, hogy az algoritmus fogalmt tisztzhassuk, mg tbb tulajdonsgra is oda kell figyelnnk.

    Mieltt sorra vennnk az algoritmusok fbb jellemzit, prbljuk megadni az algoritmus pontosabb lerst.

    Napjainkban algoritmus alatt egy vges, bizonyos sorrendben megadott egyrtelm mveletsort rtnk, amelyek mechanikusan elvgezhetk (anlkl, hogy az ember arra szorulna, hogy sajt maga dntseket hozzon), s amelyek a rendelkezsre ll adatokbl j adatokat hoznak ltre, vagy ms formban vezetnek a kvnt eredmnyhez.

    Az algoritmusokat valamilyen feladat megoldsnak cljbl tervezzk, majd valamilyen programozsi nyelv segtsgvel kdoljuk, hogy szmtgpen vgrehajthassuk.

    Mieltt szmba vennnk az algoritmusok tulajdonsgait, hangslyozzuk, hogy a szmtgpes vilg ismer szekvencilis s prhuzamos algoritmusokat. Egy szekvencilis algoritmus az utastsait egyms utn hajtja vgre, mg egy prhuzamos algoritmus esetben tbb utasts is vgrehajtdik ugyanabban a pillanatban, mivel ezeket tbb processzor vgzi prhuzamosan.

    Valamely szekvencilis algoritmus akkor helyes, ha eleget tesz az albbi kvetelmnyeknek:

    a) elvgezhet vagyis az ember is kpes eljutni az eredmnyhez, paprral s ceruzval a kezben kvetve az algoritmusban lert mveletek hatst;

    b) meghatrozott azaz, brmelyik pillanatban tudjuk, hogy ppen mi fog trtnni (ez csak a determinisztikus algoritmusokra rvnyes);

    c) ltalnos egy adott feladatkr megoldsra kpes;d) vges az algoritmus vges szm lpsben vezet eredmnyre, brmilyen

    kezdeti rtkekbl kiindulva.

    Ezekhez hozztesszk, hogy egy algoritmust a helyessgn kvl a kvetkez tulajdonsgok is jellemezhetik:

    e) vilgos az algoritmus lersa pontos, rthet, kvethet;f) hatkony egy bizonyos feladatot tbb algoritmussal is megoldhatunk, de

    ezek kzl mindig megkeressk azt, amely a legkevsb veszi ignybe a szmtgp erforrsait, vagyis nem terheli flsleges mveletek elvgzsvel, illetve flsleges adatok trolsval; azt mondjuk, hogy ezek az algoritmusok hatkonyak, optimlisak, vagyis a bonyolultsguk a lehet legkisebb.

  • 2. AZ ALGORITMUSOK BRZOLSA 19

    Az algoritmusok helyessgnek bizonytst ksbb fogjuk alaposabban tanulmnyozni. Egyelre marad a lehetsg, miszerint az algoritmusokat teszteljk, ellenrizzk.

    Egy algoritmus kezdeti rtkeket ignyel, ezekbl szrmaztatja az eredmnyt. A kezdeti rtkeket bemeneti (bemen) adatoknak nevezzk. Ide sorolhatjuk azokat a konstans rtkeket is, amelyekkel inicializlunk. Az algoritmus ltal szolgltatott adatokat (eredmnyt) kimeneti (kimen) adatoknak nevezzk.

    Mindaz amit az algoritmus elvgez, a funkcijaknt nevezhet meg.

    2.1.2. Az algoritmusok lersnl hasznlt elemek

    A. Adatok

    Az adatokat tpusuk szerint a kvetkezkppen osztlyozhatjuk:

    a) A numerikus adatok csoportjba tartoznak az egsz tpus adatok, azaz egsz szmok, valamint a vals tpus adatok, azaz a tizedes szmok. A vals tpus adatok jellsekor tizedesvessz helyett tizedespontot hasznlunk (pldul 3,47 helyett 3.47-et).

    b) A logikai adatok mindssze kt rtket vehetnek fel: a logikai igaz (true), valamint a logikai hamis (false) rtkeket.

    c) A karakterlncok egyszeres idzjelek (aposztrfok) kz zrt karaktersort jelentenek (pldul 'ez egy szoveg').

    B. llandk (konstansok)

    Algoritmusok rsakor numerikus, logikai s karakterlnc tpus llandkat hasznlhatunk. Ezek nem vltoztatjk rtkket az algoritmusban.

    C. Vltozk

    Az algoritmusok lersakor hasznlt olyan elemeket, amelyeknek rtke az algoritmus vgrehajtsa sorn idben mdosulhat, vltozknak nevezzk.

    Amikor az algoritmus alapjn programot runk, amelyet a tovbbiakban szmtgpnkn szeretnnk futtatni, akkor minden vltoznak helyet kell foglalnunk a memriban. A lefoglalt hely mrete attl fgg, hogy milyen tpus2 adatot fogunk az illet vltozban trolni. Azok a vltozk, amelyek mg nem kaptak rtket, inicializlatlanok (nincs kezdrtkk).

    2 Egy tpus meghatrozza azoknak az rtkeknek a halmazt, amelybl rtkeket kaphat a vltoz, valamint azokat a mveleteket, amelyeket ezekkel az rtkekkel elvgezhetnk.

  • 20 2. AZ ALGORITMUSOK BRZOLSA

    sszefoglalva: minden vltoznak van neve, attribtumhalmaza (pldul tpus), helye (cme) a memriban, rtke.

    A vltozk tpusa, a konstansokhoz hasonlan lehet numerikus, logikai s karakterlnc tpus. Ezeket a tpusokat standard tpusoknak nevezzk. Mellettk mg vgtelen sok tpust definilhat maga a programoz.

    D. Kifejezsek

    A kifejezs egy szmts jellse: elrja valamely rtk kiszmtsnak mdjt.

    A kifejezs mveletekbl s operandusokbl ll. Az operandusok lehetnek konstansok, vltozk vagy fggvnyhvsok (a fggvnykifejezs valamely fggvny kirtkelsrl gondoskodik). A kifejezs kirtkelse a megszokott matematikai szablyoknak megfelelen, az ismert precedencia figyelembevtelvel trtnik. Azonos priorits mveletek esetben a kifejezs kirtkelst balrl jobbra haladva vgezzk.

    Az algoritmusok lersakor numerikus, logikai s karakterlnc tpus kifejezseket hasznlhatunk.

    D1. Egsz tpus kifejezsek

    Az egsz tpus kifejezsek operandusai egsz tpusak. Az egsz tpus kifejezsekben a kvetkez mveleteket hasznlhatjuk:

    Mvelet jele Jelentse+ sszeads kivons* szorzs

    [a/b] egsz szmok osztsnak hnyadosamaradk[a/b] egsz szmok osztsi maradka

    D2. Vals tpus kifejezsek

    A vals tpus kifejezsek operandusai vals tpus vltozk vagy llandk, de ezek kz kerlhetnek egsz tpusak is. A vals tpus kifejezsekben a kvetkez mveleteket hasznlhatjuk:

    Mvelet jele Jelentse+ sszeads kivons* szorzs/ oszts

  • 2. AZ ALGORITMUSOK BRZOLSA 21

    Megjegyzs A kifejezs tpust, a kifejezsben szerepl operandusok tpusa, valamint a mveletek hatrozzk meg!

    D3. Logikai kifejezsek

    A logikai kifejezsek operandusai logikai tpusak. A logikai kifejezsek lersban a kvetkez mveleteket hasznlhatjuk:

    relcis mveletek: , , , =, ; logikai mveletek: vagy, s, nem (vagyis az eredeti llts tagadsa,

    ellenkezje), xor (kizrlagos vagy); a logikai mveletek eredmnyeit a kvetkez tblzatok tartalmazzk:

    or

    I H and

    I H not

    I H xor

    I H

    I I I I I H H I I H IH I H H H H H I H

    Ha egy logikai kifejezs tbb rszkifejezsbl ll, ezeket zrjelek kz tesszk, mivel a logikai mveleteknek elsbbsgk van. A leghamarabb a nem (not) hajtdik vgre, utna az s (and), vgl a vagy (or). A relcis mveletek az aritmetikai kifejezsek kirtkelse utn kerlnek sorra.

    D4. Karakterlnc tpus kifejezsek

    A karakterlnc tpus kifejezsek operandusai karakterlncok. Ha a egy karakterlnc tpus vltoz s rtke pldul ' Ez egy ', akkor pldul az a + 'barack' kifejezs rtke ' Ez egy barack' lesz.

    A karakterlncok szerepelhetnek relcis kifejezsekben, ilyenkor a lexikogrfikus sorrendnek megfelelen trtnik az sszehasonlts:

    Legyen a s b kt karakterlnc tpus vltoz:a = 'barack', b = 'di', ebben az esetben a < b. Az a = b relcis kifejezs

    rtke hamis, az a b rtke igaz.

    E. Mveletek

    Az algoritmusok lersakor az albbi mveleteket hasznlhatjuk:

    ki/bemeneti mveletek;

    rtkads;

    dntshozatal.

  • 22 2. AZ ALGORITMUSOK BRZOLSA

    E1. Ki/bemeneti mveletek

    A bemeneti mvelet szerepe bekrni a szksges bemeneti adatokat. Ezeket billentyzetrl vagy llomnyokbl olvashatjuk be.

    A kimeneti mvelet szerepe a feldolgozott adatokat, eredmnyeket megjelenteni. Ez a kirs trtnhet a kpernyre, paprra vagy valamilyen llomnyba.

    E2. rtkads

    Az rtkad mvelet a (vagy :=) mveleti jel bal oldaln tallhat vltozhoz hozzrendeli a jobb oldalon lv kifejezs rtkt.

    Plda Az a 10 rtkads hatsra a elveszti (esetleges) rgi rtkt, mivel az rtkads vgrehajtsa kvetkeztben az rtke 10 lesz. Az a a + 1 rtkads hatsra a j rtke a rgi rtknl 1-gyel nagyobb lesz.

    E3. Dntshozatal

    A dntshoz mvelet lnyege, hogy adott felttelek teljeslsekor egy bizonyos mveletsort kell elvgeznnk, egybknt egy msik mveletsort. Ha valamelyik g res, akkor termszetesen azon az gon nem trtnik semmi.

    F. Adatszerkezetek3

    Adatszerkezet alatt az adatok olyan csoportosulst rtjk, amelyben pontos szablyok szerint szervezzk a feldolgozand adatokat. Egy adattpuson bell azonos tulajdonsg rtkeket foglalunk egybe, amelyekhez hozzrendeljk az elvgezhet mveleteket.

    Megklnbztetnk: egyszer adattpusokat (pldul az egsz tpus szmot nem tekintjk

    szmjegyek sorozataknt). sszetett adattpusokat (az rtkek elemekre bonthatk, az elemek egy

    adott szerkezetnek megfelelen csoportosulnak).

    gy az adatszerkezet egy olyan adattpus, amelynek az rtkei felbonthatk adatelemek rtkeinek halmazra, amelyeknek tpusa lehet egyszer vagy sszetett. Az adatszerkezeten bell ismerjk az elemek kzti kapcsolatot (szerkezetet).

    3 Az adatszerkezeteket egy msik tantrgy keretn bell fogjuk alaposabban tanulmnyozni.

  • 2. AZ ALGORITMUSOK BRZOLSA 23

    Pldul az Integer egy egsz adattpus, amelyet a Pascal programozsi nyelv ismer. Ha tbb egsz szmot szeretnnk egy adatkent kezelni, akkor egy sorozatot kpeznk bellk. Ekkor a sorozat egy adatszerkezet (vektor), amelynek az elemei az egsz szmok. Az elemek kzti kapcsolat az, hogy egyms utn kvetkeznek. Mveletek: elemek lekrdezse a sorszmuk (indexk) segtsgvel, rtkads stb.

    2.2. Algoritmusok brzolsa folyamatbrk s pszeudokd nyelvek segtsgvel

    Az algoritmusokat tbbflekppen lehet brzolni. Ismeretesek a folyamatbrk, a pszeudokd nyelv, klnbz tpus diagrammok, de a htkznap hasznlt nyelv is elfordul. Mivel ez utbbi nehzkes lehet, hossz s nem elgg szabatos, az els kt brzolssal fogunk gyakrabban tallkozni. A folyamatbra az algoritmusok lersnak egyik legegyszerbb s legszemlletesebb mdja.

    A folyamatbra grafikus brzolsmd, amelynek segtsgvel nem csupn az egyes mveleteket, hanem ezek elvgzsnek sorrendjt s sszefggst is feltntetjk. Folyamatbrk ksztsekor az egyes mveleteket blokknak nevezett brk segtsgvel jelljk, amelyeknek alakja a mvelet tpusra, tartalma pedig a mvelet lersra utal.

    A folyamatbra hasonlt egy grfhoz, ahol a lerajzolt nyilak irnytsnak megfelelen egy kiindul helyzetbl eljutunk az algoritmus vgre gy, hogy menet kzben feltntetjk az elvgzend mveleteket. Az alapmveleteknek klnbz skidomok felelnek meg, ezeknek a belsejbe rjuk a mveleteket.

    a) indt- s zrblokk

    b) be s kimeneti mveletek

    c) rtkads elbb kiszmtdik a kifejezs rtke; a kiszmtott rtk taddik a vltoznak (be

    msoldik a vltoz szmra lefoglalt memriarekeszbe); ha a vltoznak volt elz rtke, az

    STARTSTOP

    Be v Ki v

    vltoz kifejezs

  • 24 2. AZ ALGORITMUSOK BRZOLSA

    az aktulis rtkads kvetkeztben elvsz, mivel fellrdik az j rtkkel.

    d) alprogram (algoritmus) hvsa felttelezzk, hogy ltezik az ELJRS nev

    algoritmus, vagy legalbb a funkcijt ismerjk;

    az ELJRS(L) blokk egy mveletsort jell, amelyet egy klnll folyamatbrval runk le. E folyamatbra indtblokkja a mveletsor nevt s az L paramterlistt, mg zrblokkja az EXIT szt tartalmazza.

    e) elgazs (dnts) felttelezzk, hogy a felttel egy logikai

    kifejezs, amely vagy igaz, vagy hamis;

    az algoritmus vgrehajtst a feltteltl fggen vagy a jobb vagy a bal gon folytatjuk tovbb

    Plda Legyen egy termszetes szm. brzoljuk folyamatbrval azt az algoritmust, amely megvizsglja, hogy a szm palindrom szm-e vagy sem. Egy szmot palindromszmnak (vagy tkrszmnak) hvunk, ha egyenl a fordtott-jval, vagyis azzal a szmmal, amelyet a szm szmjegyei fordtott sorrendben alkotnak.

    Megolds A szmot szmjegyekre bontjuk, s a bontssal prhuzamosan felptjk az j szmot.

    Az j szm generlst a Horner-sma nven ismert mdszer segtsgvel vgezzk (a ciklusban jszm jszm 10 + szmjegy). Mivel az algoritmus a szmjegyeket gy hatrozza meg, hogy ismtelten osztja az eredeti szmot 10-zel, az algoritmus vgn az eredeti szm rtke 0. De neknk szksgnk van az eredeti rtkre, hogy sszehasonlthassuk a kapott j szmmal. Ezrt a beolvasott szmrl a feldolgozs eltt ksztnk egy msolatot.

    A feladatot megold algoritmus folyamatbrja ekkor a kvetkezkppen alakul:

    ELJRS(L)

    felttelIGAZHAMIS

  • 2. AZ ALGORITMUSOK BRZOLSA 25

    Annak ellenre, hogy a folyamatbrk segtsgvel az algoritmusok szemlletesen s viszonylag egyszeren rhatk le, a gyakorlatban ezek hasznlata nehzkesnek bizonyult, egyrszt, mert bonyolultabb feladatok esetben a folya matbrk ttekinthetetlenekk vlhatnak, msrszt pedig a grafikus brzols nmagban is sok kellemetlensget okozhat. Arrl ne is beszljnk, hogy itt megengedett a goto tpus tirnyts, ami vgkpp megnehezti az algoritmus olvasst.

    A folyamatbrk helyett hasznlhatjuk az gynevezett pszeudokdot, amely az elemi struktrkat rja le egyszer utastsok formjban. A pszeudokd nyelv sokban hasonlt a programozsi nyelvekhez, emiatt a pszeudkodban lert algoritmus nagyon knnyen trhat brmely programozsi nyelvre.

    START

    Be szm

    msolat szm

    jszm 0

    szm > 0 IGAZ

    HAMIS

    szmjegy maradk[szm/10]

    jszm jszm*10+szmjegy

    szm [szm/10]

    msolat=jszm

    Ki 'Igen'Ki 'Nem'

    IGAZHAMIS

    STOP

  • 26 2. AZ ALGORITMUSOK BRZOLSA

    Feltevdik a krds: akkor mirt nem rjuk algoritmusainkat egyenesen valamelyik programozsi nyelven? Elssorban azrt nem, mert a pszeudokd lersmd nem annyira kttt, mint egy programozsi nyelv. Msodsorban pedig azrt nem, mert a pszeudokdban lert algoritmus ppen az imnt emltett rugalmassg miatt brmely programoz szmra rthet, ltalnos, nem tartalmazza egy programozsi nyelv sajtossgait, s gy nemcsak az illet nyelvet ismer programozk fogjk megrteni.

    A pszeudokdok tbbflk lehetnek. Brki megalkothatja sajt pszeudokdjt az elemi programozsi struktrk ismeretben.

    2.3. A strukturlt programozs alapelveiA programozk s a programozst oktatk nagy gondja volt a fegyelmezetlen, minden szablytl, megktstl mentes programozi stlus. Nehzz, nha lehetetlenn vlt a karbantarts.

    Ezt elhrtand, N. Wirth kidolgozta a lpsenknti finomts (stepwise refinement) elvt. De ez nem bizonyult elegendnek.

    A strukturlt programozst E. W. Dijkstra s C. A. R. Hoare vezettk be 1965-ben. Olyan algoritmustervezsi szablyokrl van sz, amelyeknek lnyege abban ll, hogy olyan algoritmusokat runk, amelyek csak az elfogadott struktrkat tartalmazzk. Lnyeges szrevenni, hogy kizrtk a goto utastst a felhasznlhat utastsok kzl, ezltal az algoritmusok olvashatbbakk, knnyen belthatakk vltak s gy eredmnyesebb programozi teljestmnyekhez vezettek. A strukturlt programozs alapelve szerint az algoritmusok lersra nhny alapstruktrt (elemi struktrt) hasznlunk, melyeknek egyetlen bemenete s egyetlen kimenete van. A kitztt feladatot rszfeladatokra bontjuk, majd e rszfeladatok megoldsval jutunk el az eredeti feladat megoldshoz. Ily mdon brmely algoritmus alapstruktrk lineris szekvencijaknt tekinthet.

    Bhm s Jacopini ttele kimondja, hogy brmely algoritmus megvalsthat a hrom alapstruktra segtsgvel: lineris struktrval, elgazssal s Amg tpus ismtl struktrval.

    Strukturlt algoritmusok rsakor a kvetkez alapstruktrkat hasznlhatjuk:

    a) lineris struktra valamely mvelet felttel nlkli elvgzst jelenti;b) elgazsi (alternatv) struktra lehetv teszi, hogy valamely mveletet

    csak adott felttelek teljeslsekor vgezznk el;

    c) ismtl struktra (ciklus) adott mveletsor vges szmszor trtn ismtelt elvgzse.

  • 2. AZ ALGORITMUSOK BRZOLSA 27

    Az elemi struktrk hasznlata megknnyti az algoritmusrst, ugyanakkor a mr ksz algoritmus rthetbb, ttekinthetbb lesz.

    2.3.1. Lineris struktrkA lineris struktrk a kvetkezk:

    indtblokk (START);

    zrblokk (STOP);

    ki- s bemeneti mveletek;

    rtkads;

    az ELJRS blokk hvsa (az ELJRS blokkhoz tartoz struktrk nem felttlenl linerisak).

    Lineris struktrnak tekintjk tovbb a fentiek brmilyen szekvencijt is.

    2.3.2. Elgazsi struktrkAz elgazs a dntshoz mvelet megfelelje, amelyben a felttel egy logikai kifejezs, amely llhat tbb rszkifejezsbl. Ha a felttel teljesl, akkor a q mveletsort vgezzk el, klnben a p-t, ahol a q s p tetszleges szm, brmilyen tpus struktrkbl llhat.

    Ha a p vagy a q mveletsor hinyzik, ajnlott gy megfogalmazni a felttelt, hogy a HAMIS g vljon ress.

    A ksbbiekben meg fogunk ismerkedni egy olyan elgazsi struktrval is, amely egyetlen felttel kirtkelse kvetkeztben kettnl tbb fel gaztatja az algoritmust.

    Plda Olvassunk be egy vszmot (1000 vszm 3000). Dntsk el, hogy az adott v szkv-e vagy sem!

    Megolds Egy szkv oszthat 4-gyel s nem oszthat 100-zal, vagy oszthat 400-zal.

    felttelIGAZHAMIS

    p q

  • 28 2. AZ ALGORITMUSOK BRZOLSA

    2.3.3. Ismtl struktrkHa egy adott mveletsort tbbszr is meg kell ismtelnnk, ismtl struktrt vagy ms nven ciklust hasznlunk.

    A ciklusnak tartalmaznia kell egy felttelt, amely lehetv teszi a ciklusbl val kilpst.

    A ciklusokat hrom csoportba soroljuk:

    a) elltesztel ciklus (Amg tpus struktra);b) htultesztel ciklus (Ismteld tpus struktra);c) ismert szm ismtls (Minden tpus struktra).A tovbbiakban e hrom tpust egyenknt ismertetjk.

    a) Elltesztel ciklus (Amg tpus struktra) Amg a felttel rtke igaz, ismteljk a p

    mveletsort. Amint a felttel rtke hamiss vlik, kil

    pnk a ciklusbl. A p mveletsorban ktelezen lennie kell

    egy olyan mveletnek, amely megvltoztatja a felttel logikai rtkt, lehetv tve a ciklusbl val kilpst.

    Elfordulhat, hogy a felttel rtke mr a ciklusba lps eltt hamis. Ebben az esetben a p mveletsort egyszer sem vgezzk el!

    maradk[vszm/4]=0 smaradk[vszm/100]0 vagy

    maradk[vszm/400]=0

    START

    Be vszm

    Ki 'Szkv'Ki 'Nem'

    IGAZHAMIS

    STOP

    felttelIGAZ

    HAMIS p

  • 2. AZ ALGORITMUSOK BRZOLSA 29

    Plda Olvassunk be tbb egsz szmot. A szmok beolvassa befejezdik, amikor a beolvasott szm rtke 0. Szmtsuk ki az sszegket!

    Az sszeget 0 kezdrtkkel ltjuk el. Mivel a szmok szmt nem ismerjk, st az is elfordulhat, hogy az els beolvasott szm rtke 0, ismeretlen szm, elltesztel ciklust alkalmazunk.

    b) Htultesztel ciklus (Ismteld tpus struktra)

    A p mveletsort addig ismteljk, ameddig a felttel rtke igazz nem vlik. (Kilpnk amikor a felttel rtke igaz.)

    A p mveletsorban szksg van egy olyan mveletre, amely megvltoztatja a felttel logikai rtkt s lehetv teszi a ciklusbl val kilpst.

    A felttel rtktl fggetlenl a p mveletsort legalbb egyszer elvgezzk!

    Plda Adva van egy pozitv egsz szm. rjuk ki szmjegyeinek szmt!

    Megolds A szm szmjegyeinek szmt a 10-zel val ismtelt egsz osztsok szma adja meg, amelyeket addig vgznk, amg a szm 0-v nem vlik. Mivel az eredeti szmrl tudjuk, hogy 0-tl klnbzik, de nem tudjuk, hny szmjegye van, a feldolgozst htultesztel ismeretlen lpsszm ciklussal vgezzk. Ha az adott szm 0 is lehetett volna, az eredmny akkor is 1, de ebben az esetben egyszer sem kellett volna osztani a szmot, teht elltesztel ciklust alkalmaztunk volna.

    START

    Be szm

    sszeg 0

    szm 0 IGAZ

    HAMISsszeg sszeg + szm

    Ki sszeg

    STOP

    Be szm

    IGAZfelttel HAMIS

    p

  • 30 2. AZ ALGORITMUSOK BRZOLSA

    Feladat Prbljunk folyamatbrt rajzolni egy elltesztel ciklussal megoldott feladat, htultesztel ciklussal trtn megoldsra.

    c) Ismert szm ismtls (Minden tpus struktra)Az Amg s az Ismteld struktrk esetben nem tudhatjuk pontosan,

    hnyszor fog ismtldni a p mveletsor. Ha ismerjk a vgrehajtsok szmt, az elbb bemutatott, mdostott elltesztel ismtl struktrt hasznlhatjuk, amelyben egy gynevezett ciklusszmll segtsgvel ellenrizzk a mveletsor ismtlseinek szmt. Ezt az ismtl struktrt Minden tpus struktrnak nevezzk.

    A p mveletsort addig ismteljk, ameddig az i sorszmozott tpus vltoz rtke kisebb vagy egyenl mint az u utols megengedett rtk (az i els rtke az e kezdrtk).

    Az i vltoz a ciklus minden lpsben megvltoztatja rtkt. A lps lehet pozitv vagy negatv egsz szm.

    HAMIS

    IGAZi up

    i e

    i i + lps

    HAMIS

    START

    Be szm

    sz 0

    szm = 0

    IGAZ

    szm [szm/10]

    Ki sz

    STOP

    sz sz + 1

  • 2. AZ ALGORITMUSOK BRZOLSA 31

    Klnbz programozsi nyelvekben a Minden tpus struktra klnbzkppen van megvalstva.

    Plda Szmtsuk ki az els n (2 n 20) termszetes szm sszegt!

    Megolds A feladat megoldsra Minden tpus struktrt hasznlunk. A ciklusvltozt i-vel jelljk, s rtkei a ciklus folyamn 1-tl n-ig vltoznak, azaz n darab szmot fogunk a ciklusban feldolgozni. Az n rtkt a felhasznltl krjk be. Jelen (s a legtbb) esetben a lpsszmllt 1-gyel nveljk. A ciklus ltal biztostott i ciklusvltozt gy nyugodtan felhasznlhatjuk az sszeg kiszmtsra, amelyet az sszeg vltozban trolunk.

    A feladat megoldst a kvetkez folyamatbra szemllteti.

    Megjegyzs Lthat, hogy az bra igazn szemlletes, de kpzeljnk el egy ennl mondjuk 5-szr bonyolultabb algoritmust. Hogyan brzolnnk azt egy ilyen mret lapon? A tovbbiakban mindenkinek az algoritmusok pszeudokddal trtn lerst javasoljuk.

    START

    Be n

    sszeg 0

    i n

    HAMIS

    IGAZ

    Ki sszeg

    STOP

    i 1

    sszeg sszeg + i

    i i + 1

  • 32 2. AZ ALGORITMUSOK BRZOLSA

    2.3.4. Az alapstruktrk jellse pszeudokdbana) A pszeudokdban lert algoritmus els utastsa:

    Algoritmus Neve:b) Lineris struktrk brzolsa pszeudokd nyelvben:

    Struktra neve JellsBemeneti struktra Be: vltozlistaKimeneti struktra Ki: vltozlistartkad mvelet vltoznv kifejezsEljrshvs eljrsnv(paramterlista)

    c) Elgazsi struktrk brzolsa pszeudokd nyelvben:

    Ha-akkor-klnben tpus struktra:

    Ha felttel akkor utasts(ok)1klnben utasts(ok)2vge(ha)Ha az elgazsi struktrbl hinyzik a klnben g, akkor Ha-akkor tpus

    struktrnk van:

    Ha felttel akkor utasts(ok)vge(ha)

    Plda Hatrozzuk meg s rjuk ki adott vals szm abszolt rtkt!

    Elemzs Matematikbl tudjuk, hogy valamely szm abszolt rtke:

    .0ha,

    0ha,xxxx

    x

    Beolvassuk az x vals szmot. Ha a szm pozitv, akkor az abszolt rtk maga a szm lesz, egybknt az abszolt rtk maga a szm, de megvltoztatott eljellel.Algoritmus Abszolt_rtk(x,mod): Ha x 0 akkor { bemeneti adat: x, kimeneti adat: mod } mod x klnben mod -x vge(ha)Vge(algoritmus)

  • 2. AZ ALGORITMUSOK BRZOLSA 33

    Megjegyzs Ha az x vltoz eredeti rtkre a tovbbiakban nincs szksgnk, elegnsabb megoldst kapunk, ha nem hasznlunk kln vltozt az abszolt rtk trolsra! Egybknt a megolds htrnya lehet, hogy mdosul az x rtke!Algoritmus Abszolt_rtk_msknt(x): Ha x < 0 akkor { bemeneti s kimeneti adat: x } x -x vge(ha)Vge(algoritmus)d) Ismtl struktrk brzolsa pszeudokd nyelvben:

    Amg tpus struktra brzolsa:

    Amg felttel vgezd el: utasts(ok)vge(amg)

    Plda Szmtsuk ki kt termszetes szm egsz hnyadost ismtelt kivonsokkal!Algoritmus Oszts(a,b,hnyados): hnyados 0 { bemeneti adatok: a, b, kimeneti adat: hnyados } Amg a b vgezd el: hnyados hnyados + 1 a a - b vge(amg)Vge(algoritmus)

    Ismteld tpus struktra brzolsa:Ismteld utasts(ok)Ameddig felttel

    Plda Szmtsuk ki kt termszetes szm legnagyobb kzs osztjt!Megolds Alkalmazzuk Eukleidsz algoritmust. Kiszmtjuk a kt szm osztsi maradkt. Ha ez nem 0, ismtelten kiszmtjuk az aktulis oszt s az aktulis maradk egsz osztsi maradkt. Az algoritmus vget r, amikor az aktulis maradk rtke 0.4

    Algoritmus Eukleidsz(a,b,lnko): Ismteld { bemeneti adatok: a, b, kimeneti adat: lnko } r maradk[a/b] { kiszmtjuk az aktulis maradkot } a b { az osztandt fellrjuk az osztval } b r { az osztt fellrjuk a maradkkal } ameddig r = 0 { amikor a maradk 0, vget r az algoritmus } lnko a { lnko egyenl az utols oszt rtkvel }Vge(algoritmus)

    4 Eukleidsz algoritmusra visszatrnk a jegyzet sorn tbbszr is.

  • 34 2. AZ ALGORITMUSOK BRZOLSA

    Minden tpus struktra brzolsa:

    Minden i = e, u, lps vgezd el: utasts(ok)vge(minden)

    Plda Szmoljuk meg n beolvasott szm kzl a pros szmokat!

    Megolds Tekintsk az albbi algoritmust!Algoritmus Pros(n,db): db 0 { bemeneti adat: n s a szmok, kimeneti adat: db, a pros szmok szma } Minden i=1,n vgezd el: Be: szm Ha szm pros akkor db db + 1 vge(ha) vge(minden)Vge(algoritmus)e) A pszeudokdban lert algoritmus utols utastsa:

    Vge(algoritmus)Megjegyzs Megjegyezzk, hogy az algoritmus s a struktrk zrst jellhetnnk egyszeren a vge sorral, de ha a zrjelben feltntetjk a struktrt megnevez szt is (ha, amg stb.), vilgosabb lesz az algoritmus lersa, hiszen gy jelezzk azt is, hogy minek van vge.

    Mieltt zrnnk a jegyzetben alkalmazott pszeudokd nyelvvel val ismerkedst, lssuk a folyamatbrk bemutatsa utn trgyalt feladatot megold algoritmus brzolst pszeudokddal.

    (A feladat megoldsban eldntjk egy adott szmrl, hogy palindromszm-e vagy sem.)Algoritmus Palindrom(szm,vlasz): msolat szm { bemeneti adat: szm, kimeneti adat: vlasz } jszm 0 Amg szm > 0 vgezd el: szmjegy maradk[szm/10] jszm jszm*10 + szmjegy szm [szm/10] vge(amg) vlasz jszm = msolat { ha jszm = msolat, akkor vlasz rtke igaz }

    { ha jszm msolat, akkor vlasz rtke hamis }Vge(algoritmus)

  • 2. AZ ALGORITMUSOK BRZOLSA 35

    2.3.5. Egyszer alapszablyok A vltozk jelentst alaposan ismernnk kell! Adjunk minden vltoznak beszdes azonostt! Ne hasznljunk inicializlatlan (kezdrtk nlkli) vltozkat! Ne hasznljunk tbb vltozt a szksgesnl, mert ez nvelheti az algorit

    mus alapjn implementlt program memriaignyt. Az algoritmus utastsait mindig a logikai felptsnek megfelelen inden

    tljuk (igaztsuk) gy, hogy abbl mindig egyrtelmen kitnjn, melyik rsz, melyik msik rsznek az alrendeltje (melyik blokk al tartozik).

    rjunk optimlis algoritmusokat! (Egy algoritmus optimalitsa nem a kd hossztl, hanem annak hatkonysgtl, azaz futsi idejtl s erforrsignytl fgg.)

    Amennyiben lehetsges rjunk ltalnos algoritmusokat, amelyek ms programozsi krnyezetben is klnsebb talakts nlkl felhasznlhatk.

    Az algoritmusnak minden bemenetre valamilyen kimenetet (eredmnyt vagy hibazenetet) kell szolgltatnia.

    A megoldand feladatot teljes egszben elemezzk! Amg lehet, a feladatot bontsuk rszfeladatokra, az algoritmust pedig rsz

    algoritmusokra (alprogramokra)! Ha a Ha struktrban egy g hinyzik, ez legyen a klnben! Az egymsba gyazott Ha struktrk kvetkezzenek a megvalsulsuk va

    lsznsge szerinti cskken sorrendben! A Minden tpus struktrban ne mdostsuk a ciklusvltozt, s a kezd-,

    illetve a vgsrtket sem! Ha az algoritmus tervezsekor ismerjk a programozsi krnyezetet,

    amelyben ezt kdolni fogjuk, kihasznlhatjuk a programozsi krnyezet s a nyelv lehetsgeit is, de ne essnk tlzsba, mivel gy az algoritmusunk veszt az ltalnossgbl!

    2.4. A feladatok szmtgpes megoldshoz fzd ltalnos krdsek

    A programoztl azt vrjk el, hogy megvalstson egy algoritmust, amely megold egy adott feladatot (a megolds lehet kzelt is, ha ez fel van tntetve). A megoldhatsg, els megkzeltsre, azt jelenti, hogy ltezik egy algoritmus, amelynek megfelel egy szmtgpes program, amelyet, ha elegend ideig fut

  • 36 2. AZ ALGORITMUSOK BRZOLSA

    tatunk tetszleges bemeneti adatokra, s annyi memria ignybevtelvel, amennyire szksg van, bizonyos id multn megkapjuk a helyes eredmnyt. [9]

    A feladatmegolds sorn elmletileg az albbi lpsek hajtdnak vgre: annak bizonytsa, hogy ltezik algoritmus, amely megoldja a feladatot; az algoritmus megvalstsa (ebben az esetben az els lps flslegess

    vlik); az algoritmus elemzse.

    Az elemzs sorn a kvetkez kritriumokat vesszk figyelembe: helyessg; az algoritmus vgrehajtshoz szksges id; a bemeneti s kimeneti adatok szmra szksges memria mrete; egyszersg; optimalits.

    2.4.1. Algoritmusok helyessgeMieltt mg azt trgyalnnk, hogy hogyan vizsgljuk egy algoritmus helyessgt, lssuk, hogyan jellemezzk a helyessget: rvnyes (a specifikcinak megfelel) bemeneti adatokra, bizonyos id utn helyes eredmnyt kapunk. Ebbl kvetkezik, hogy mindenek eltt szksg van a feladatnak pontos, specifiklt megfogalmazsra, amelybl egyrtelmen derljn ki, hogy mit rtnk rvnyes bemeneti adatok alatt, s mit tekinthetnk helyes eredmnynek.

    Ttelezzk fel, hogy kivlasztottunk egy megoldsi mdszert, s megterveztk az utastsok sorozatt, amellyel megoldjuk a feladatot. A mdszer kivlasztsnak helyessgt ttelekkel bizonytjuk. Amikor ttrnk a megvalsts mdjnak vizsglatra, fontos szerepet kap a ciklusinvarinsok kimutatsa. Az algoritmus bizonyos pontjaiban rtelmeznk egy vagy tbb megmarad tulajdonsgot, amelynek teljeslnie kell akrhnyszor az algoritmus vgrehajtsa rinti azt a pontot.

    Ezt tbbnyire matematikai indukcival vgezzk. A ciklusinvarins bizonyos adatok olyan tulajdonsga, amely teljesl (igaz kzvetlenl a ciklus els itercijnak megkezdse eltt), megmarad (ha igaz a ciklus egy itercijnak megkezdse eltt, akkor igaz marad a kvetkez iterci eltt is) s befejezdik (amikor a ciklus befejezdik, az invarins olyan hasznos tulajdonsgot r le, amely segt abban, hogy az algoritmus helyessgt bebizonytsuk). [6]

    Az algoritmusok helyessgnek bizonytsakor kt fontos dologra kell figyelnnk [9]:

  • 2. AZ ALGORITMUSOK BRZOLSA 37

    A rszleges helyessg. Felttelezve, hogy az algoritmus vges szm lpsben vget r, be kell bizonytanunk, hogy a meghatrozott eredmny helyes.

    A vgessg. Be kell bizonytanunk, hogy az algoritmus vges id alatt befejezdik.

    Termszetesen, a fenti feltteleknek teljeslnik kell brmely megengedett bemeneti adathalmaz esetben.

    Plda Hatrozzuk meg kt termszetes szm legnagyobb kzs osztjt s legkisebb kzs tbbszrst. Legyen a, b N* s a kvetkez jellsek:

    (a, b) = a s b legnagyobb kzs osztja; [a, b] = a s b legkisebb kzs tbbszrse.

    Algoritmus Lnko_s_Lkkt(a,b,lnko,lkkt): x a { bemeneti adatok: a, b } y b { kimeneti adatok: lnko, lkkt } u a v b Amg x y vgezd el: { xv + yu = 2ab s (x, y) = (a, b) (*) } Ha x > y akkor x x - y u u + v klnben y y - x v u + v vge(ha) vge(amg) lnko x lkkt (u+v)/2Vge(algoritmus)A helyessg bizonytst hrom lpsben vgezzk:

    a) A (*) kifejezsek invarinsok:Az Amg-ba lps eltt a relcik igazak. Ki kell mutatnunk, hogy a ciklus minden lpsben az invarinsok megmaradnak.

    Legyenek az aktulis rtkek x, y, u, v a ciklusba lps eltt (amikor a relcik teljeslnek), s x', y', u', v' a ciklus kvetkez lpse eltti rtkek. Teht: xv + yu = 2ab s (x, y) = (a, b).

    Felttelezzk, hogy x > y, x' = x y, y' = y, u' = u + v, v' = v.

    x'v' + y'u' = (x y)v + y(u + v) = xv + yu = 2ab.

    Az x < y esetet hasonlan trgyaljuk.

  • 38 2. AZ ALGORITMUSOK BRZOLSA

    b) Rszleges helyessg:Legyen a legnagyobb kzs oszt d = (a, b). A (*) relcik alapjn d(u + v) = 2d2, ahol a = d s b = d. (u + v)/2 = d = ab/d = [a, b] = lkkt.

    c) Az algoritmus vges:Legyenek {xn}, {yn}, {un}, {vn} a vltozk egyms utni rtkeinek sorozatai. Ezek az rtkek mind termszetes szmok. szrevesszk, hogy az {xn} s az {yn} cskkenek (egy bizonyos lpsben vagy x cskken vagy y, vagyis elfordul, hogy xn = xn1 yn1, de az is lehet, hogy xn nem vltozik, mivel abban a lpsben yn cskken), mg az {xn yn} sorozat szigoran cskken (a klnbsg abszolt rtke biztos cskken minden lpsben, mivel vagy x cskken vagy y). A cskkens 0-ig tarthat, amikor x = y.

    Plda: Orosz szorzs Legyen a, b N*. Szmtsuk ki a s b szorzatt!

    Tudjuk, hogy az orosz muzsik csak a kvetkez mveleteket tudja elvgezni: el tudja dnteni, hogy egy szm pros vagy pratlan; ssze tud adni kt szmot; ssze tud hasonltani egy szmot 0-val; felezni tud egy szmot (elosztani 2-vel).

    Algoritmus Orosz_szorzs(a,b,p): x a { bemeneti adatok: a, b } y b { kimeneti adat: p } p 0 Amg x > 0 vgezd el: { xy + p = ab (*) } Ha x pratlan akkor p p + y vge(ha) x [x/2] y y + y vge(amg)Vge(algoritmus)Plda x = 45, y = 17:

    x 45 45 22 11 5 2 1y 17 17 34 68 136 272 544p 0 17 85 221 765

    Az algoritmus helyessgt hrom lpsben bizonytjuk:

    a) A (*) relci invarins:

    Az Amg-ba lps eltt a relcik igazak. Kimutatjuk, hogy a ciklus minden lsben az invarins megmarad.

  • 2. AZ ALGORITMUSOK BRZOLSA 39

    Legyenek x, y, p az aktulis rtkek a ciklusba lps eltt (amikor a relcik teljeslnek, teht xy + p = ab), s legyenek x', y', p' a ciklus kvetkez lpse eltti rtkek.

    Felttelezzk, hogy x pratlan. (x', y', p') = ((x 1)/2, 2y, p + y).

    x' y' + p' = [(x 1)/2] (2y) + p + y = xy + p = ab.

    Felttelezzk, hogy x pros. (x', y', p') = (x/2, 2y, p).

    x' y' + p' = (x/2)(2y) + p = xy + p = ab.

    b) Rszleges helyessg:

    Amikor az algoritmus vget r, x = 0, teht p = ab.

    c) Az algoritmus vges:

    Legyenek {xn} s {yn} a vltozk egyms utni rtekeinek sorozatai. szrevesszk, hogy az {xn} szigoran cskken sorozat. Ebbl kvetkezik, hogy vges szm lps utn x = 0.

    2.4.2. Az algoritmus vgrehajtshoz szksges idA vgrehajtshoz szksges id az algoritmus bonyolultsgt fejezi ki. Itt a bonyolultsgnak semmi kze az algoritmus hosszhoz, illetve a szerkezethez.

    Amikor meg szeretnnk hatrozni az algoritmus vgrehajtshoz szksges idt, nem mrnk pontos idt, hiszen ez fgg a szmtgptl, a programozsi nyelvtl stb. Szksgnk van mgis egy mrtkegysgre, ami algoritmusonknt vltozhat. Megneveznk egy bizonyos mveletet, amit az adott algoritmus valamelyik ciklusban adott szmszor vgrehajt, s ennek szmossgval mrjk az algoritmus teljestmnyt. Pldul, ha egy sorozatban meg kell keresnnk az adott X rtket, akkor a mvelet az sszehasonlts lesz. Ha ssze kell szoroznunk kt mtrixot, akkor kt vals szm szorzsa (vagy szorzsok s sszeadsok szma) lesz a mrtkegysg. Ha kt nagyon nagy szmot kell sszeadnunk, akkor kt szmjegy feldolgozsa lesz az elemi mvelet.

    Egy algoritmusnak az adott feladatot nemcsak egyetlen bemeneti adathalmaz esetben kell megoldania, hanem az sszes lehetsges bemenetre. Ezeknek a bemeneteknek (ltalban) ismert a szmossguk (illetve a hatrok, amelyek kztt ez mozog). Az alapmveletet ltalban minden adatra elvgezzk, s gy a bemenet mrete megadja a vgrehajtsok szmt is. Pldul, ha egy n elem sorozatban meg kell keresnnk egy bizonyos tulajdonsggal rendelkez elemet, akkor szmthatunk arra, hogy az algoritmus n sszehasonltst fog elvgezni, ha ssze kell szoroznunk kt mtrixot, akkor a mveletek szmt a kt mtrix mretnek fggvnyben szmoljuk. Ha kt nagyon nagy szmot kell sszeadnunk,

  • 40 2. AZ ALGORITMUSOK BRZOLSA

    akkor a kt szm szmjegyeinek szma lesz a mret. A grfelmleti feladatokban a csompontok szma vagy az lek szma jhet szmtsba, esetleg mind a kett.

    Ugyanakkor vegyk szre, hogy a bemeneti adatok tulajdonsgainak fggvnyben elfordulhat, hogy az algoritmus vltoz mennyisg id alatt hajtdik vgre. Pldul a keress lellhat az els sszehasonlts utn, de ha a keresett elem nincs a sorozatban, akkor n sszehasonltst vgznk.

    Teht kifejezhetnnk a vgrehajtsi idt a vgrehajtsi idk tlagval, de ez nem biztos, hogy tl hasznos lenne, mivel a gyakorlatban elfordul, hogy bizonyos tulajdonsg bemeneti adatok gyakoribbak mint msok. Ha ismerjk, vagy kzeltleg fel tudjuk becslni a klnbz tulajdonsg bemenetek elfordulsnak valsznsgt, akkor az tlagos vgrehajtsi id jobban kifejezi az algoritmus teljestmnyt.

    Plda Legyen S egy n elem, egsz szmokbl ll sorozat. Keressk meg az X adott szmmal egyenl elem indext a sorozatban. Ha X nincs a sorozatban, az eredmny legyen 0.

    Algoritmus Keres(n,S,X,i): { bemeneti adatok: n, S, X; kimeneti adat: i } i 1 Amg (i n) s (Si X) vgezd el: i i + 1 vge(amg) Ha i > n akkor i 0 vge(ha)Vge(algoritmus)Alapmvelet A sorozat egy elemnek sszehasonltsa X-szel.

    tlagos vgrehajtsi id A bemenetek klnbzsgt X elfordulsnak pozcija fejezi ki. Ha X megtallhat a sorozatban, ez lehet az els, a msodik, ..., az n-edik elem. Teht sszesen n + 1 eset lehetsges. Minden i = 1, 2, ..., n-re jelljk Bi-vel azt a bemeneti adathalmazt, amelyben X egyenl a sorozat i-edik elemvel s Bn+1-nel azt a bemenetet, amelyre X nincs a sorozatban. Legyen tovbb t(B) az sszehasonltsok szma a B bemenet esetben. Ha i = 1, 2, ..., n, akkor t(Bi) = i, s ha i = n+1, akkor t(Bn+1) = n. Jelljk q-val annak a valsznsgt, hogy X elfordul a sorozatban. Felttelezzk, hogy X brmely helyen elfordulhat ugyanazzal a valsznsggel. Teht, ha i = 1, 2, ..., n, akkor p(Bi) = q/n s p(Bn+1) = 1 q.

    T(n) = )()(1

    1i

    n

    ii BtBp

    =

    n

    i

    nqinq

    1

    )1( =

    n

    i

    nqinq

    1

    )1( =

  • 2. AZ ALGORITMUSOK BRZOLSA 41

    = nqnnnq )1(

    2)1(

    = .)1(

    2)1( nqnq

    Ha X megtallhat a sorozatban, akkor q = 1 s T(n) = (n + 1)/2, ami azt jelenti, hogy ltalnos esetben a sorozat felt kell megvizsglnunk. Ha q = 1/2, vagyis 50% eslynk van arra, hogy megtalljuk X-et, akkor T(n) = [(n + 1)/4] + n/2 3n/4, vagyis a sorozatnak krlbell 3/4-dt fogjuk megvizsglni.

    A legrosszabb eset Ha X a sorozat utols elemvel egyenl vagy X nincs a sorozatban, T(n) = max{t(Bi): i = 1, 2, , n + 1} = n.

    Teht, ha n-nel jelljk a bemenet mrett, a vgrehajts idejt n fggvnyeknt fejezzk ki.

    Idelis krlmnyek kztt meghatrozhat egy matematikai kplet, amely kifejezi az algoritmus vgrehajtshoz szksges T(n) idt, ahol n a bemeneti adatok mrete. Sajnos, ltalban ez nem lehetsges. Ezrt az esetek tlnyom tbbsgben arra kell szortkoznunk, hogy a vgrehajtsi id nagysgrendjt hatrozzuk meg.

    Ilyenkor, keresnk egy f(n) fggvnyt, amelynek segtsgvel kifejezzk az id nagysgrendjt: T(n) = O(f(n)), ha T(n) s f(n) arnya egy vals szm, amikor n .

    Bevezetnk egy tovbbi egyszerstst. Bennnket igazn a futsi id nvekedsi sebessge vagy nvekedsi rendje rdekel, ezrt a kiszmtott kpletnek csak a f tagjt vesszk figyelembe (pldul, ha a kplet an2 + bn + c, csak az an2 tagot tartjuk meg), mivel az alacsonyabb rend tagok nagy n-re kevsb lnyegesek. Szintn figyelmen kvl hagyjuk a f tag lland egytthatjt, mivel a nagy bemenetekre jellemz szmtsi hatkonysg meghatrozsban az lland tnyezk kevsb fontosak, mint a nvekeds sebessge. Ezt a nvekedsi rendet a (n) fggvnnyel jelljk.

    ltalban akkor tartunk egy algoritmust hatkonyabbnak egy msiknl, ha legrosszabb futsi idejnek alacsonyabb a nvekedsi rendje. Az lland tnyezk s alacsonyabb rend tagok miatt ez az rtkels hibs lehet kis bemenetre. Elg nagy bemenetekre azonban pldul egy (n2) algoritmus gyorsabban fut a legrosszabb esetben, mint egy (n3) algoritmus.

    Az algoritmus futsi idejnek nvekedsi rendje, (sebessge) az algoritmus hatkonysgnak egyszer lerst adja, valamint lehetv teszi a szba jv algoritmusok relatv teljestmnynek sszehasonltst is. Br nha pontosan meg tudjuk hatrozni az algoritmus futsi idejt, ltalban nem ri meg az erfesztst ez a klnleges pontossg. Elg nagy bemeneti adatokra a pontos futsi id multiplikatv llandinak s alacsonyabb rend tagjainak a hatsa eltrpl a futsi id nagysgrendjhez kpest.

  • 42 2. AZ ALGORITMUSOK BRZOLSA

    Ha a bemenet mrete elg nagy, akkor az algoritmus futsi idejnek csak a nagysgrendje lnyeges, ezrt az algoritmusnak az aszimptotikus hatkonysgt vizsgljuk. Ekkor csak azzal foglalkozunk, hogy a bemenet nvekedsvel miknt nvekszik az algoritmus futsi ideje ha n . ltalban az aszimptotikusan hatkonyabb algoritmus lesz a legjobb vlaszts, kivve a kis bemenetek esett.

    Egy adott g(n) fggvny esetn (g(n))-nel jelljk a fggvnyeknek azt a halmazt, amelyre (g(n)) = { f(n) : ltezik c1, c2 s n0 pozitv lland gy, hogy 0 c1g(n) f(n) c2g(n) brmely n n0 esetn }

    Ms szval az f(n) fggvny hozztartozik a (g(n)) halmazhoz, ha lteznek c1 s c2 pozitv llandk gy, hogy f(n) elg nagy n-re beszorthat c1g(n) s c2g(n) kz. Br (g(n)) egy halmaz, mgis gy rjuk, hogy f(n) = (g(n)), ha azt akarjuk jelezni, hogy f(n) eleme (g(n))-nek, azaz f(n) (g(n)).

    Ms szval, minden n n0 esetn az f(n) fggvny egy lland szorztnyeztl eltekintve egyenl g(n)-nel. Ekkor azt mondjuk, hogy g(n) aszimptotikusan les korltja f(n)-nek.

    A formlis definci segtsgvel bizonythatjuk, hogy 6n3 (n2). Indirekt bizonytst hasznlva tegyk fel, hogy ltezik c2 s n0 gy, hogy 6n3 c2n2 minden n n0 esetn. Ekkor azonban n c2/6, ami lehetetlen tetszleges nagy n esetn, hiszen c2 lland.

    Mivel brmely lland egy nulla fok polinom, ezrt brmelyik konstans fggvnyre fennll a (n0) vagy (1) becsls. Az utbbi jells kiss pontatlan, hiszen nem nyilvnval, hogy ekkor mely vltoz tart a vgtelenhez. Gyakran fogjuk hasznlni a (1) jellst akr llandra, akr egy adott vltozra nzve konstans fggvnyre is.

    A -jells aszimptotikus als s fels korltot ad a fggvnyre. Amikor csak az aszimptotikus fels korlt jn szba, akkor az O-jellst hasznljuk. Egy adott g(n) fggvny esetn O(g(n))-nel jelljk a fggvnyeknek azt a halmazt, amelyre O(g(n)) = { f(n) : ltezik c s n0 pozitv lland gy, hogy 0 f(n) cg(n) brmely n n0 esetn }.

    Ha f(n) eleme O(g(n))-nek, akkor azt rjuk, hogy f(n) = O(g(n)). Figyeljk meg, hogy f(n) = (g(n)) maga utn vonja f(n) = O(g(n)) teljeslst. Ha f(n) = O(g(n) s g(n) = O(f(n)) viszont maga utn vonja, hogy f(n) = (g(n)). A halmazelmletben szoksos jellseket hasznlva: (g(n)) O(g(n)). Abbl, hogy brmely msodfok an2 + bn + c, a > 0 fggvny benne van (n2)-ben, kvetkezik, hogy az ilyen msodfok fggvnyek benne vannak O(n2)-ben. Meglep lehet, hogy brmely elsfok an + b alak fggvny is benne van O(n2)-ben.

  • 2. AZ ALGORITMUSOK BRZOLSA 43

    Az O-jells hasznlatval gyakran gy is meg tudjuk hatrozni az algoritmus futsi idejt, hogy pusztn az algoritmus egsznek a szerkezett vizsgljuk.

    Mivel az O-jells egy fels korltot hatroz meg, ezrt amikor egy algoritmus legrosszabb futsi idejre hasznljuk, akkor ezzel minden bemenet esetben rvnyes fels korltot adunk az algoritmus futsi idejre.

    2.4.3. Az algoritmus ltal feldolgozott adatok szmra szksges memria mrete

    Az algoritmusok ltal feldolgozott adatok szmra lefoglalt memria mrete ugyangy sajtos tulajdonsg, mint a vgrehajtsi id. Sok esetben a feladat megoldst biztost program, a bemeneti s kimeneti adatokon kvl, munka kzben ideiglenesen ltrehozott adatszerkezetekkel is dolgozik. Ha egy rendez algoritmus a rendezs kzben csak konstans mret plusz memrit vesz ignybe, azt mondjuk, hogy helyben rendez. sszehasonltva ezt egy olyan algoritmussal, amely ltrehoz egy msolatot a rendezend, vagy rendezett sorozatrl, termszetesen az elbbit hatkonyabbnak tekintjk a trfelhasznls szempontjbl.

    2.4.4. Algoritmusok egyszersgeAlgoritmusok elemzsekor az egyszersg nem felttlenl mrvad tulajdonsg. Ha egy algoritmust a legkzenfekvbb tlet alapjn terveznk meg (brute force), sokszor flslegesen terheljk a szmtgp erforrsait. Ugyanakkor egy egyszer algoritmust knnyebben runk meg, olvashatbb, knnyebben javtjuk s knnyebben bizonytjuk a helyessgt.

    2.4.5. Algoritmusok optimalitsaFelttezzk, hogy egy adott feladatnak megvalstottuk az algoritmust, s kiszmtottuk a vgrehajtshoz szksges T(n) idt. A kvetkezkben azon fogunk elgondolkozni, hogy vajon ltezik-e jobb (kisebb vgrehajtsi idej) algoritmus, mint amit megterveztnk? Egy algoritmus optimalitsnak bizonytsa nehz feladat, elssorban azrt, mert szmtsba kell vennnk minden lehetsges algoritmust, s ki kell mutatnunk, hogy ezeknek a futsi ideje nagyobb mint a trgyalt algoritmus.

    Felttelezzk, hogy egy adott feladat megoldsra tallt minden algoritmus legalbb T(n) idt ignyel. Ha egy idegysg alatt az algoritmus egy mveletet vgez, akkor a T(n) az elvgzend mveletek szmt jelenti. Egy algoritmus akkor optimlis, az adott algoritmushalmazon bell, ha legrosszabb esetben T(n) mveletet vgez.

  • 44 2. AZ ALGORITMUSOK BRZOLSA

    A kvetkezkben bebizonytjuk egy egyszer algoritmus optimalitst.

    Plda Hatrozzuk meg egy n elem sorozat minimumt!Algoritmus Minimum(n,a,min): min a1 Minden i=2,n vgezd el: Ha ai < min akkor min ai vge(ha) vge(minden)Vge(algoritmus)

    Ebben az algoritmusban pontosan n 1 sszehasonltst vgznk az a = (a1, a2, ..., an) sorozat elemeivel.

    llts A fenti algoritmus optimlis.

    Bizonyts Indukcit hasznlva kimutatjuk, hogy brmely, sszehasonltsokra pl algoritmus legkevesebb n 1 mveletet vgez. [9]

    Ha n =1, nem vgznk egyetlen sszehasonltst sem.

    Felttelezzk, hogy brmely algoritmus, amely megoldja a feladatot n szm esetben, legkevesebb n 1 sszehasonltst vgez, s trgyaljuk azt a feladatot, amely n + 1 szm minimumt kri. Legyen az els sszehasonlts, amely (anlkl, hogy vesztennk az ltalnossgbl) sszehasonltja a1-t a2-vel, s megllaptja, hogy a1 < a2.

    A tovbbiakban meg kell oldanunk a feladatot az (a1, a3, ..., an+1) feladat esetben. De ezt a feladatot (n eleme van) n 1 sszehasonltssal vgeztk, teht az n + 1 elem sorozat minimumt sszesen n sszehasonlts utn kaptuk meg.

    2.4.6. Algoritmusok ltezseEz a krds a fentieknl is knyesebb, mivel elbb matematikai riguroztssal definilnunk kellene az algoritmus fogalmt. A kvetkezkben nem tesznk mst mint, hogy bemutatunk nhny eredmnyt (bizonytsok nlkl). A rszletesebb tanulmnyozs kln ismeretkrhz tartozik!

    Azokat a feladatokat, amelyeket nem tudunk egy algoritmussal megoldani megoldhatatlanoknak (eldnthetetleneknek) nevezzk. Az algoritmus fogalmnak matematikai defincija lehetv tette nhny ilyen feladat feldertst: [9]

    a) A programok befejezdsnek krdse: tetszleges program s tetszleges bemeneti adatok esetben dntsk el, hogy a program befejezdik-e!

    b) A programok befejezdsnek krdse (vltozat): adott program s tetszleges bemeneti adatok esetben dntsk el, hogy a program befejezdik-e!

  • 2. AZ ALGORITMUSOK BRZOLSA 45

    c) A programok ekvivalencijnak krdse: dntsk el brmely kt program esetben, hogy ekvivalensek-e (azonos bemeneti adatok mellett azonos kimeneti adatokat produklnak-e).

    2.5. Megoldott feladatok

    2.5.1. FelcserlsAdott kt egsz tpus rtk. Cserljk fel ezeket, s rjuk ki a kt rtket az j sorrendben!

    Elemzs Vgezzk el a kvetkez egyszer ksrletet: adott kt pohr, az egyikben svnyvz, a msikban sima vz van. Fel szeretnnk cserlni a kt pohr tartalmt. Mit tehetnk? Termszetesen, felhasznlunk a mvelet elvgzse rdekben egy harmadik poharat. Ugyangy, ha kt vltoz rtkt kell flcserlnnk, szksgnk lesz egy segdvltozra, amelyben ideiglenesen megrizzk annak a vltoznak rtkt, amely az a b utasts kvetkeztben elveszten rtkt.Algoritmus Felcserl(a,b): { bemeneti s kimeneti adatok: a, b } segd a { a tovbbi algoritmusokban e hrom utasts jellse: a b lesz } a b b segdVge(algoritmus)

    A fenti algoritmusban egy segdvltozt (segd) hasznltunk az a vltoz rgi rtknek ideiglenes trolsra, ily mdon zkkenmentesen elvgezhet a felcserls.

    2.5.2. Maximumrtkrjuk ki hrom, pronknt klnbz vals szm kzl a legnagyobbat!

    Elemzs Ahhoz, hogy megtalljuk a hrom szm kzl a legnagyobbat, termszetesen teljeslnie kell a felttelnek, hogy ez a szm nagyobb, mint a msik kett. Mivel brmelyik szm lehet a legnagyobb, a hrom szmot rendre sszehasonltjuk a msik kettvel.

    Mivel a feladat csak a legnagyobb kiratst kri, me a megolds segdvltoz hasznlata nlkl:Algoritmus Maximum(a,b,c): Ha (a > b) s (a > c) akkor { bemeneti adatok: a, b, c } Ki: 'A legnagyobb: ', a vge(ha)

  • 46 2. AZ ALGORITMUSOK BRZOLSA

    Ha (b > c) s (b > a) akkor Ki: 'A legnagyobb: ', b vge(ha) Ha (c > a) s (c > b) akkor Ki: 'A legnagyobb: ', c vge(ha)Vge(algoritmus)

    Ez a megolds hrom elgazsi struktrt hasznl. Tbb szrevtelnk is van. Pldul, feltevdik a krds: mi trtnik, ha a = b = c?

    A kvetkez vltozatban bevezetjk a max segdvltozt, amely minden lpsben a kt sszehasonltott szm kzl a nagyobbik rtket fogja megtartani. gy a max-ban trolt rtket felhasznlhatjuk a ksbbi feldolgozsok sorn. A max kezdrtke az a vltoz rtke lesz, de ez megvltozhat a szmok rtkeinek fggvnyben. gy, az algoritmus vgrehajtsa sorn nem ktelez kirnunk a legnagyobb rtket, hanem a max vltozban (paramterben5) visszatrtjk. Algoritmus Maximum_msknt(a,b,c,max): max a { bemeneti adatok: a, b, c, kimeneti adat: max } Ha max < b akkor max b vge(ha) Ha max < c akkor max c vge(ha)Vge(algoritmus)

    Figyeljk meg, hogy mennyire leegyszersdtt az elgazsi felttel, valamint azt is, hogy ez a megolds csupn kt elgazsi struktrt hasznl! Mi trtnik, ha a = b = c?

    szrevesszk, hogy ha pldul a a legnagyobb, a msik kt elgazst flslegesen fogjuk elvgezni. De ez igaz akkor is, ha b a legnagyobb vagy c. rdemes keresni egy olyan megoldst, amely azonnal lelltja az algoritmust, mihelyt biztonsgosan eldlt, melyik szm a legnagyobb.Algoritmus Maximum_harmadik_vltozata(a,b,c,max): Ha a > b akkor { bemeneti adatok: a, b, c, kimeneti adat: max } Ha a > c akkor max a klnben max c vge(ha) klnben5 A paramter fogalmval s a paramtertadsok tpusaival az 5. fejezetben ismerkednk meg.

  • 2. AZ ALGORITMUSOK BRZOLSA 47

    Ha b > a akkor Ha b > c akkor max b klnben max c vge(ha) vge(ha) vge(ha)Vge(algoritmus)

    Az algoritmus tmrebb lesz, ha a feltteleket megfelelen csoportostjuk:Algoritmus Maximum_negyedik_vltozata: Ha (a > b) s (a > c) akkor { bemeneti adatok: a, b, c, kimeneti adat: max } max a klnben Ha (b > a) s (b > c) akkor max b klnben max c vge(ha) vge(ha)Vge(algoritmus)

    Ez a megolds egyetlen elgazst tartalmaz, melynek klnben ga viszont magban foglal egy jabb elgazst. Els ltsra nem rtunk egyszerbb algoritmust, de ha kvetjk esetenknt a szksges sszehasonltsok szmt, meg fogunk gyzdni, hogy ez az algoritmus tlagosan kevesebb mvelet elvgzst ignyli, mint az els vltozat: ha a a legnagyobb, az els elgazs klnben ga mr nem kerl vgrehajtsra, teht egyetlen sszehasonltst kell elvgezni. Ha b vagy c a legnagyobb, akkor csak az els kt elgazst kell vgrehajtani. Ha a feladat adatainak sajtossga lehetv teszi, hogy a felttelek megvalsulsi valsznsgt elrelssuk, akkor az elgazsokat elnysen lehet egymsba gyazni, spedig gy, hogy a legvalsznbb felttel kerl a legels elgazsba stb.

    Befejezsl megjegyezzk, hogy kt szm maximuma meghatrozhat egyetlen sszehasonlts nlkl is: max (a + b + a - b)/2

    2.5.3. ElnkvlasztsEgy elnkvlaszts alkalmval tbb jellt indul. Az orszgban legalbb 1 milli szemly fog szavazni. A szavazatokat egy llomny6 tartalmazza. Ezek egsz szmok, amelyekkel a jellteket kdoltk. Teht az llomny egy-egy jellt kdjt annyiszor tartalmazza, ahnyan szavaztak az illet jelltre. Nem ismerjk

    6 Az llomny egy kls adattrol, amely azonos tpus adatokat tartalmaz.

  • 48 2. AZ ALGORITMUSOK BRZOLSA

    sem a jelltek szmt (elfordulhat, hogy tbb mint 1 milli jellt van), sem a szavazatok szmt. llaptsuk meg a gyztest, ha van ilyen!

    Elemzs Teht: adva van nagyon sok nagy szm (ezeket nem lehet egy tmbben trolni). Meg kell tallnunk (ha ltezik!), azt a szmot, amely legalbb a szmok fele plusz 1-szer elfordul az adott szmok kztt. [24]

    szrevesszk, hogy pldul, ha a bemeneti adatok kztt egyms utn k-szor ugyanaz az x szm fordul el s utna k darab, x-tl klnbz szm kvetkezik, akkor ezt a 2k szmbl ll halmazt a bemeneti adatoknak a tovbbiakban mellzhetjk, mivel nem befolysoljk a vgeredmnyt (mivel x ebben az adatszegmensben egyms utni elemek halmazban csak a szmok felvel egyenl szmban fordul el).Algoritmus Szavazs: Be: szm { az els szavazat } jellt szm { felttelezzk, hogy legalbb fele plusz egyszer elfordul } hny 1 { most fordult el elszr }

    { nem ismerjk a szavazatok pontos szmt } Amg nincs vge az llomnynak vgezd el: Be: szm { a kvetkez szavazat } Ha szm = jellt akkor { ha ez azonos a megjegyzett kddal } hny hny + 1 { nveljk elfordulsainak szmt } klnben { ha ez nem azonos a megjegyzett kddal } Ha hny = 0 akkor { vget rt egy szegmens feldolgozsa, }

    { amelyen bell, nincs krt tulajdonsg elem } jellt szm { j jellt } hny 1 { most fordult el elszr } klnben hny hny - 1 { cskkentjk elfordulsainak szmt } vge(ha) vge(ha) vge(amg) { jellt tartalmazza annak a kdjt, akivel kilptnk az utols }

    { adatszegmens feldolgozsakor, ha van nyertes, az csak ez lehet } hny 0 { megszmoljuk, hogy a jellt hny szavazatot kapott } n 0 { megszmoljuk, hogy sszesen hny szavazat ltezik } Amg nincs vge az llomnynak vgezd el: Be: szm n n + 1 Ha szm = jellt akkor hny hny + 1 vge(ha) vge(amg) Ha hny > [n/2] akkor { ellenrizzk a felttelt } Ki: 'Nyertes a ', jellt, '!'

  • 2. AZ ALGORITMUSOK BRZOLSA 49

    klnben Ki: 'Sajnos nem nyert senki!' vge(ha)Vge(algoritmus)

    2.6. Kitztt feladatok7

    1. Adott kt egsz szm, cserljk fel ket segdvltoz hasznlata nlkl s rjuk ki az j sorrendben!

    tmutats Nem elg fordtott sorrendben kirni a kt szmot. Valban fel kell ket cserlni, hiszen lehet, hogy a ksbbiekben a felcserlt sorrendben lesznek szksgesek.

    Ha nem szabad segdvltozt hasznlni, alkalmazhatunk sszeadst s kivonst, vagy a xor logikai m