Algoritmusok, adatszerkezetek II.



Hasonló dokumentumok
Algoritmusok, adatszerkezetek II.

Visszalépéses keresés

Optimalizációs stratégiák 2.

Programozási segédlet

Egyszerű programozási tételek

Adatszerkezetek és algoritmusok

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Általános statisztika II. Kriszt, Éva Varga, Edit Kenyeres, Erika Korpás, Attiláné Csernyák, László

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

Online algoritmusok. Algoritmusok és bonyolultságuk. Horváth Bálint március 30. Horváth Bálint Online algoritmusok március 30.

Programozási tételek. Dr. Iványi Péter

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

22. GRÁFOK ÁBRÁZOLÁSA

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Rekurzió. Dr. Iványi Péter

Összetett programozási tételek

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Programozás alapjai II. (7. ea) C++

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Adatszerkezetek 2. Dr. Iványi Péter

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

Adatszerkezetek és algoritmusok

Algoritmusok, adatszerkezetek, objektumok

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Fák Témakörök. Fa definíciója. Rekurzív típusok, fa adatszerkezet Bináris keresőfa, bejárások Bináris keresőfa, módosítás B-fa

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Gráfok 2. Legrövidebb utak, feszítőfák. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

1 Rendszer alapok. 1.1 Alapfogalmak

Algoritmusok és adatszerkezetek I. 1. előadás

Gráfok 1. Tárolási módok, bejárások. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Egyirányban láncolt lista

Függvények határértéke, folytonossága

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

Algoritmusok és adatszerkezetek 2.

Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

L'Hospital-szabály március 15. ln(x 2) x 2. ln(x 2) = ln(3 2) = ln 1 = 0. A nevez határértéke: lim. (x 2 9) = = 0.

Amortizációs költségelemzés

Programozás I gyakorlat

OBJEKTUMORIENTÁLT TERVEZÉS ESETTANULMÁNYOK. 2.1 A feladat

Programozás I. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar szeptember 10.

Adatszerkezetek és algoritmusok Geda, Gábor

Táblázatok fontosabb műveletei 1

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Láncolt listák Témakörök. Lista alapfogalmak

Gyakori elemhalmazok kinyerése

Optimalizációs stratégiák 1.

Adatszerkezetek Hasító táblák. Dr. Iványi Péter

Adatszerkezetek 1. előadás

Vezetéses Totó kulcsok Enciklopédiája I.

Hasító táblázatok. Hasító függvények, kulcsütközés kezelése. Programozás II. előadás. Szénási Sándor

A KroneckerCapelli-tételb l következik, hogy egy Bx = 0 homogén lineáris egyenletrendszernek

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Programozás I. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar szeptember 10.

29. Visszalépéses keresés 1.

Láncolt listák. PPT 2007/2008 tavasz.

Az egyetemi publikációs adatbázis

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Taylor-polinomok. 1. Alapfeladatok április Feladat: Írjuk fel az f(x) = e 2x függvény másodfokú Maclaurinpolinomját!

PROGRAMOZÁS 1. kötet TERVEZÉS

Struktúra nélküli adatszerkezetek

Programozási technológia

A félév során előkerülő témakörök

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

Adatszerkezetek 7a. Dr. IványiPéter

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

Java programozási nyelv

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

Predikátumkalkulus. 1. Bevezet. 2. Predikátumkalkulus, formalizálás. Predikátumkalkulus alapfogalmai, formalizálás, tagadás, logikailag igaz formulák.

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Branch-and-Bound. 1. Az egészértéketű programozás. a korlátozás és szétválasztás módszere Bevezető Definíció. 11.

Programozási módszertan. Mohó algoritmusok

Ítéletkalkulus. 1. Bevezet. 2. Ítéletkalkulus

TÁMOP VIR alprojekt VIR felhasználói kézikönyv

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

rank(a) == rank([a b])

LOGIKA ÉS ÉRVELÉSTECHNIKA

Információs Technológia

Rekurzív algoritmusok

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

Matematikai és matematikai statisztikai alapismeretek

Bevezetés az informatikába

Diszkrét matematika I. gyakorlat

Web-programozó Web-programozó

OOP. Alapelvek Elek Tibor

Algoritmusok és adatszerkezetek gyakorlat 07

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

Deníciók és tételek a beugró vizsgára

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Programozás II. előadás

Találatgaranciás Kenó-kulcsok gy jteménye

Átírás:

NEUMANN JÁNOS INFORMATIKAI KAR Szénási Sándor Algoritmusok, adatszerkezetek II. ÓE-NIK 50 Budaest, 05.

Készült az Óbudai Egyetem án az ÓE-NIK 50. sz. jegyzetszerz dés keretein belül 04-ben. Szerz : Dr. Szénási Sándor egyetemi docens szenasi.sandor@nik.uni-obuda.hu Lektor: Dr. Vámossy Zoltán egyetemi docens vamossy.zoltan@nik.uni-obuda.hu.. verzió 05. március 7. A jegyzet legfrissebb változata letölthet az alábbi címr l: htt://users.nik.uni-obuda.hu/rog/programozasii.df Ez a jegyzet LATEX segítségével készült. A m egyéni tanulmányozás céljára szabadon letölthet. Minden egyéb felhasználás csak a szerz írásos engedélyével lehetséges. ISBN 978-65-5460-4-

Tartalomjegyzék Bevezetés. Visszalééses keresés 5.. Visszalééses keresés alagondolata............................... 5... Alaelv.......................................... 5... Példa visszalééses keresésre.............................. 6.. Visszalééses keresés általános alakja................................. Bemenet és kimenet...................................... Tetsz leges megoldás keresése................................. Összes megoldás keresése................................ 4..4. Otimális megoldás keresése............................... 6..5. Egymást kölcsönösen kizáró részfeladatok....................... 7.. Visszalééses keresés éldák................................... 9... Megoldható feladatok osztályozása........................... 9... Logikai, egymást kizáró részmegoldás - Id zítési robléma.............. 0... M darab, egymást kizáró részmegoldás - Sudoku feladat.................4. El zményfügg, egymást kizáró részmegoldás - Szólánc játék..............5. Logikai, nem kizáró részmegoldás - Hátizsák-akolás...................6. M darab, nem kizáró részmegoldás - Feladatok kiosztása............... 4..7. El zményfügg, nem kizáró részmegoldás - Huszár útja a sakktáblán........ 5. Hasító táblázat 7.. Alternatívák elemzése...................................... 7... Tömbök feléítése.................................... 7... Közvetlen címzés..................................... 8.. Hasító táblázatok feléítése................................... 0.. Hasítófüggvény megvalósítások.................................... Az ideális hasítófüggvény................................... Néhány hasítófüggvény megvalósítás............................. További megfontolások.................................. 4.4. Kulcsütközések kezelése..................................... 6.4.. Túlcsordulási terület................................... 6.4.. Láncolás használata................................... 7.4.. Nyílt címzés........................................ 8.4.4. Többszörös hasítás.................................... 4. Láncolt lista 4.. Láncolt listák feléítése..................................... 4... Lista elemeinek szerkezete................................ 4.. Egyirányú, egyszer láncolt lista alam veletei........................ 46... Inicializálás........................................ 46... Új elem felvétele..................................... 46... Bejárás és keresés..................................... 5..4. Törlés láncolt listából.................................. 54.. Rendezett láncolt lista...................................... 59 i

... Rendezett láncolt lista feléítése............................ 59... Beszúrás rendezett láncolt listába............................ 59... Keresés rendezett láncolt listába............................ 66.4. Láncolt lista strázsa elemekkel................................. 68.4.. Beszúrás és törlés helyi m veletekkel.......................... 68.4.. Strázsa elemek használata................................ 70.5. Seciális láncolt listák...................................... 7.5.. Kétirányú láncolt lista.................................. 7.5.. Többszörösen láncolt lista................................ 7.5.. Ciklikus láncolt lista................................... 7.6. Láncolt listák imlementációja................................. 75.6.. Imlementáció tömbökkel................................ 75.6.. Imlementáció mutatókkal/referenciákkal....................... 76 4. Bináris keres fa 78 4.. Bináris keres fa feléítése.................................... 78 4.. Bejárások............................................. 8 4... Preorder bejárás..................................... 8 4... Inorder bejárás...................................... 85 4... Postorder bejárás..................................... 88 4..4. Keresés.......................................... 9 4.. Új elem felvétele......................................... 94 4.4. Elem törlése............................................ 98 5. B-fa 08 5.. Fák kiegyensúlyozottsága.................................... 08 5.. B-fa feléítése........................................... 09 5.. Beszúrás B-fába.......................................... 5... Beszúrás szeudokódja.................................. 6 5... Beszúrás segédalgoritmusok............................... 7 5.4. Törlés B-fából........................................... 0 5.4.. Kulcs eltávolítása..................................... 0 5.4.. Legalább t darab kulcs biztosítása........................... 6 5.4.. Törlés szeudokódja................................... 4 5.4.4. Törlés segéd algoritmusok................................ 7 6. Gráf 40 6.. Gráfok feléítése......................................... 40 6... Alavet jellemz k.................................... 40 6... Alam veletek...................................... 40 6.. Gráfok imlementációja..................................... 4 6... Dinamikus tárolás.................................... 4 6... Tárolás csúcsmátrixban................................. 4 6... Szomszédsági listában tárolás.............................. 4 6.. Bejárások............................................. 45 6... Szélességi bejárás..................................... 45 6... Mélységi bejárás..................................... 50 6.4. Legrövidebb út keresése (Dijkstra algoritmus)......................... 56 6.4.. Az alaelv......................................... 56 6.4.. Dijkstra algoritmus szeudokódja............................ 56 6.4.. Dijkstra algoritmus kimenetének feldolgozása..................... 6 Irodalomjegyzék 6 Szénási Sándor ii Óbudai Egyetem

Bevezetés Ez a jegyzet az Óbudai Egyetem án tanuló mérnök informatikus hallgatók számára íródott, hogy a Programozás II. tárgy el adásai és gyakorlatai mellett egy írásos anyag is segítse a felkészülésüket. Bár a jegyzet anélkül is érthet, mégis er sen javasolt az el adások látogatása, illetve a gyakorlatokon való aktív részvétel, mivel mindkett tartalmazhat olyan témaköröket, amelyek itt nem jelennek meg. A jegyzet er teljesen éít az Algoritmusok, adatszerkezetek I. jegyzet [9] anyagára, az ott bevezetett fogalmakat (tíusok, strukturált rogramozás, stb.) és technikákat (rogramozási tételek, rendezések, stb.) itt már ismertnek tekintjük, így azok újbóli bemutatására már nem kerül sor. Hasonló módon feltételezzük, hogy az olvasó rendelkezik legalább egy objektum-orientált rogramozási nyelvben közees szint ismeretekkel. Bár a jegyzet írásakor fontos szemont volt, hogy csak általános, konkrét rogramozási nyelvekt l független leírásokat tartalmazzon, a megértést mégis nagyban segíti, ha az itt megjelen fogalmakat és szeudokódokat hozzá tudjuk kötni konkrét rogramozási nyelvi elemekhez (különösen kiemelve ez utóbbiakat, amelyeket esetenként célszer lehet imlementálni is egy választott nyelven). A tananyag határainak megszabásakor arra törekedtünk, hogy az összhangban legyen a BSc kézésben résztvev mérnök informatikusok elvárásaival (illetve a t lük elvártakkal). Emiatt a konkrét rogramozási nyelvek szintjénél jóval absztraktabb módon, általános formában tárgyaljuk a témaköröket. Az elméleti fejtegetések azonban csak olyan szinten jelennek meg, hogy azok rávilágítsanak az okokra és okozatokra, a legtöbb esetben nem ragaszkodunk a recíz matematikai deníciókhoz és bizonyításokhoz. Ez a szabatosságból tett engedmény remélhet leg megtérül abban, hogy a jegyzet gördülékenyebben olvasható, könnyebben tanulható azok számára, akik most találkoznak el ször az itt leírtakkal. A szövegben található szakirodalmi hivatkozások edig útmutatást adnak azoknak, akik mélyebben is el szeretnének merülni egy-egy témakörben. Az egyes technikák bemutatása mindig az alábbi lééseket követi majd: a robléma rövid bemutatása, ennek megfelel en a szükséges modell (fogalmak, stb.) felállítása, megoldás elvi hátterének áttekintése, egy lehetséges megoldást jelent szeudokód bemutatása és annak részletes elemzése, majd edig egyegy éldán keresztül a fentiek gyakorlati vizsgálata (néhány, bonyolultabb esetben a élda megel zheti a szeudokódot, ezzel is el segítve az alaelv megértését). Fontos kihangsúlyozni, hogy általában csak egy lehetséges megoldást mutatunk be a sok közül, a legtöbb esetben találhatunk ennél rövidebbet vagy akár hatékonyabbat. A jegyzet célja ugyanis nem a végletekig otimalizált, legkinomultabb módszerek bemutatása, ehelyett megelégszünk az alaelvek áttekintésével. A szöveg gyakran tartalmaz utalásokat az egyes szeudokódok soraira, illetve egyes ábrákra, esetenként alábrákra. A hivatkozások túl nagy száma már az olvashatóság rovására menne, emiatt ezek csak a külön gyelmet érdeml, illetve kulcsontokat jelent részeknél jelennek meg. Célszer emiatt az elvi háttér megértését követ en mind a szeudokódokat, mind edig az ábrákat külön is áttekinteni. A megjegyzéseknek köszönhet en ezek önmagukban, a szövegt l függetlenül is könnyen értelmezhet k. Fejezetek rövid áttekintése A jegyzet feléítése a már említett Programozás II. tárgy tematikáját követi, és bár az egyes fejezetek másmás témaköröket dolgoznak fel, azok gyakran egymásra éülnek, így az egyes fejezetekben feltételezzük az el z ek ismeretét. Az. fejezetben egy széleskör en alkalmazható roblémamegoldási technikát, a visszalééses keresést ismerhetjük meg. Ez nagyon hatékonyan használható olyan esetekben, ha több részfeladatot kell megoldanunk, és az ezekre adható megoldások valamilyen formában kizárják egymást. A visszalééses keresés

alaelvén túlmen en számos éldát is tartalmaz a jegyzet, azt hangsúlyozva, hogy ugyanaz az algoritmus milyen sokrét en használható egymástól jelent sen különböz feladatok megoldása során. A kés bbi fejezetek egy nagyobb egységet alkotnak, ugyanis különböz adatszerkezeteket mutatnak be. Adatszerkezetek alatt a számítógében való tárolás lehetséges módjait értjük, amelyek alavet en az alábbiak secikálását jelentik: Az adatok memóriabeli tárolása: A számítógé memóriájában az adott adatszerkezet milyen formában valósítja meg az egyes elemek, illetve a köztük lév kacsolatok eltárolását. Az adatokon végezhet m veletek: Az adatok eltárolásán túl biztosítanunk kell az ezekhez való hozzáférést is. Ez a különböz tárolási módot használó adatszerkezetek esetében egészen más algoritmusokat igényelhet. Bár az egyes módszerek más-más m veleteket tesznek lehet vé, általában elmondható, hogy az alábbiakhoz hasonlókkal találkozhatunk: Inicializálás: Alahelyzetbe hozza az adatszerkezetet. Ilyenkor még nem tárol elemeket, azonban már alkalmas a kés bbi m veletek végrehajtására. Beszúrás: Eltárol egy új elemet az adatszerkezetben. Ez a konkrét megvalósítástól függ en különböz kiegészít aramétereket igényelhet (új elem helye, kulcsa, stb.). Bejárás: Az adatszerkezet minden egyes elemének a feldolgozása. Maga a feldolgozás m velete tetsz leges lehet, valójában nem is ez érdekes számunkra, hanem az elemek egyenkénti elérése. Keresés: Egy megadott elem (kulcs alaján, tulajdonság alaján, stb.) megkeresése az adatszerkezetben. Törlés: A megadott kulcsú elem eltávolítása az adatszerkezetb l. A fenti leírások meglehet sen elnagyoltak, ez azonban ezen a szinten még szándékos. Célunk annak bemutatása, hogy az egymástól jelent sen különböz adatszerkezetek is alavet en hasonló m veleteket támogatnak, még ha a háttérben egészen máshogy is hajtják azokat végre. Hasonló módon azt sem akarjuk ontosítani, hogy milyen tíusú adatokat tárolunk el (számot, szöveget, objektumot, stb.), ugyanis az összes módszernél látni fogjuk, hogy az adatszerkezetek feléítése és m ködése alavet en független attól, hogy mit tárolunk el bennük. A. fejezetben található hasító táblázat valószín leg ismer s lesz mindenki számára, ez ugyanis a hagyományos tömbök általánosításaként fogható fel. Legnagyobb el nye, hogy az elemek kulcsa egyértelm en (egy függvény segítségével) meghatározza azok memóriabeli helyét, ennek köszönhet en nagyon gyors beszúrás/keresés/törlés m veleteket tudunk készíteni. Hátránya, hogy a bejárás viszont nehezen oldható meg, illetve nagy számú kulcs esetén a remek teljesítményt se tudjuk mindig biztosítani. A tömbökhöz kéest jóval nagyobb változást jelent majd a láncolt lista adatszerkezet, amellyel a. fejezet foglalkozik. Bár a listákat is eltárolhatjuk a tömbökhöz hasonló módon, de általában dinamikus adatszerkezetként tekintünk rájuk, tehát az elemek által ténylegesen elfoglalt memóriaterület futás közben is változhat a beszúrások és törlések hatására. Ez utóbbi már önmagában is meglehet sen nagy el nyt jelenthet, és ezt még kiegészíti az a jó tulajdonsága, hogy a módosító m veletek (beszúrás, törlés) mindig csak a módosítandó elem közvetlen környezetét érintik, így gyorsan elvégezhet k. Az adatszerkezet sajnos számos hátránnyal is bír, megnövekszik a tárhelyigény, illetve elveszítjük a gyors véletlen elérés (és ezzel a hatékony keresés) lehet ségét. A jegyzet többféle láncolt lista megvalósítással is foglalkozik. A láncolt listák számos roblémájára megoldást nyújt a 4. fejezetben található bináris keres fa. Ez is rendelkezik a dinamikus adatszerkezetek el nyeivel, s t, ebben az esetben már a keresésre is találunk meglehet sen hatékony megoldást. A helyfoglalás itt azonban még nagyobb lesz, illetve látni fogjuk, hogy a keresés is csak bizonyos esetekben lesz kielégít. Az 5. fejezetben található B-fa kiküszöböli a bináris keres fa gyengeségeit is. A fa feléítése biztosítja a folyamatos gyors karbantartási és keresési m veleteket, továbbá a tárolás is otimális módon történik, kihasználva najaink számítógéeinek (merevlemezeinek) feléítését. M ködése ugyan az el z ekhez kéest jóval bonyolultabb algoritmusokat igényel, azonban érdemes vele foglalkozni, hiszen najainkban is számos helyen találkozhatunk ennek gyakorlati használatával. Az utolsó tárgyalt adatszerkezet a 6. fejezetben bemutatott gráf lesz. Ez szintén ismer s lehet, hiszen ez tulajdonkéen megfelel a matematika tárgyakból már el z leg megismert gráfoknak. Jelen jegyzetben emiatt nem is szeretnénk elmerülni ezek gyakorlati használatában, hiszen az nagyon messzire vezetne, usztán az adatszerkezetként való használat alajait tekintjük át: milyen formában tudjuk eltárolni a Szénási Sándor Óbudai Egyetem

gráfokat, illetve hogyan tudunk hozzáférni a bennük eltárolt adatokhoz. A fejezet tartalmaz egy részletes megoldást a legrövidebb utak keresésére, de ezt tekintsük egy önkényesen kiragadott (látványos) éldának a szakirodalomban található számtalan gráf algoritmus közül. A jegyzetben szerel szeudokódokról Az algoritmusok bemutatása mindig szeudokódok segítségével történik. Ezek használata gyakran felvet kényes kérdéseket, mivel a konkrét rogramozási nyelvekkel ellentétben nincsenek egységes szabályok a szeudokódok írására, így nehéz körülhatárolni, hogy milyen szint m veleteket (l. csere?) tekintünk a kódban alam veletnek, vagy külön kifejtend nek (bár jegyezzük meg, hogy ez a hátrány adja a szeudokódok használatának létjogosultságát is, hiszen így szabadon határozhatjuk meg a használni kívánt absztrakciós szintet). A jegyzetben található kódok alavet en alacsony szint ek, már-már a rogramozási nyelvekhez egészen hasonlóak, hogy ez is el segítse az esetleges imlementáció zökken mentességét. Ezt a szabályt azonban bármikor megszegjük, amikor a könnyebb olvashatóság azt megkívánja (l. halmazm veleteket is használunk a kódokban). A jegyzetben használt szeudokódok az alábbi részekb l állnak össze: Bemenet: Az algoritmus bemenetét jelent araméterek felsorolása. A araméterek neve mellett mindig szereel a araméterek tíusa, esetleg egy rövid leírás. Kimenet: Az algoritmus kimenete, ami alavet en két formában jelenhet meg: Függvények esetében a visszatérési érték: A szeudokódban megengedjük, hogy egy függvénynek több visszatérési értéke is legyen. Mivel a visszatérési értéknek nincs neve így itt általában azt a változót adjuk meg névként, aminek az értékét visszaadja a függvény futása végén (néha el fordul, hogy ilyen változó nincs, ilyenkor a név egy egyéb, a visszatérési értékre jellemz szó). Függvények vagy eljárások esetében a címszerint átadott araméterek: Az algoritmus futása közben ezeket megváltoztathatja, ami hatással van a araméterként átadott változókra is, emiatt ezeket is kimenetnek tekintjük. Névként itt a araméter nevét használjuk. Függvény vagy eljárás fejléce, illetve törzse: Ez tartalmazza magát az algoritmust. Függvény hívása: Rekurzív függvények esetében ez a szakasz mutatja meg a meghívás ontos módját. Felhasznált változók és függvények: Ez a terület tartalmazza azokat a szeudokódban használt változókat, illetve meghívott egyéb függvényeket, amelyek leírása a bemenet/kimenet részb l nem egyértelm. A függvények és eljárások szeudokódja megfelel a szakirodalomban már megszokott formának, emiatt ennek részletes bemutatását itt mell zzük. Alavet en a strukturált rogramozás eszközeit használjuk itt, esetenként kiegészítve objektum-orientált jellemz kkel (néha a rövidebb leírás kedvéért megszegjük ezeket a szabályokat, de csak akkor, ha az nem okoz félreértést). Néhány további megjegyzés, értelmezési javaslat a szeudokódokkal kacsolatban: A változók esetében az olvashatóság érdekében nem adjuk meg külön azok deklarációját. Az egyes változók tíusai sem szereelnek abban az esetben, ha az egyértelm (l. tömbök címzésére használt változó nyilván egész lesz). Általában az alábbi elnevezéseket használjuk: i, j, k,...: egész számok, tiikusan tömbök címzésekor A, B,...: tömbök, q, e, r,...: elemre való hivatkozást tartalmaznak (a ontos tíus imlementációfügg ) Amennyiben egy változó tíusa nem egyértelm, akkor az megtalálható a Felhasznált változók és függvények részben. Bizonyos esetekben szándékosan nem adunk meg ontos tíust. Például az adatszerkezetekben egy T bet vel helyettesítjük az eltárolni kívánt tartalom tíusát, ezzel is azt hangsúlyozva, hogy az tetsz leges lehet (szám, szöveg, stb.). Általában az alábbi elnevezéseket használjuk: Szénási Sándor Óbudai Egyetem

T: eltárolandó adat tíusa (tetsz leges tíus) K: az eltárolandó adatokhoz tartozó kulcsok tíusa (egyedi és általában összehasonlítható) M: adatszerkezetek esetében egy elemre mutató hivatkozás tíusa (tényleges imlementációtól függ en lehet mutató, referencia, index, stb.) Ezeknél a tíusoknál néha élünk valamilyen megszorítással, l. hogy a T összehasonlítható legyen. Tehát lehet bármilyen tíus, aminél el tudjuk dönteni két elemr l, hogy melyik kisebb. A tömbök indexelését (hacsak ezt külön nem jelezzük) mindig -t l kezdjük. Egy A tömb i. elemét az alábbiak szerint érjük el: A[i]. Néha hasonló értelemben használjuk az A i jelölést. Ez utóbbi alavet en ugyanazt jelenti, de itt az A-t inkább mint tetsz leges adatszerkezetet tekintjük, nem ragaszkodunk ahhoz (vagy legalábbis nem akarjuk kihangsúlyzni), hogy az tömb legyen. Néha mindkét jelölés megjelenik egy kódban, ez általában nem okoz zavart, s t, javítja az olvashatóságot, l. A[S[i]] helyett A[S i ]. Az X.y formával jelöljük az X elem y tulajdonságát. Ez lehet akár egy tömb mérete, egy objektum mez je, egy szöveg els karaktere, stb. Az f() vagy X.f() formával jelöljük az f nev függvény hívását, illetve az X elem f m veletének meghívását. Amennyiben nem nyilvánvaló, a Felhasznált változók és függvények rész tartalmazza, hogy mit csinál ez a függvény. Néhány seciális m velet, amiket gyakran használunk a kódokban: a b, a b: értékadás, csere (hivatkozások esetében maguk a hivatkozások értéke változik, nem a hivatkozott elemé) a b, a b, a: szokásos logikai oerátorok (és, vagy, tagadás) a X, X {a} : szokásos halmazm veletek (eleme, unió) S a, a S: az S sorba egy új elem elem elhelyezése, illetve kivétele V a, a V : a V verembe egy új elem elem elhelyezése, illetve kivétele ø, : seciális konstansok, az üres illetve törölt tartalmat jelzik (ontos jelentésük az algoritmus leírásból derül ki) (a f? b : c): a C nyelvekben megszokott m velet, amely szerint az a értéke legyen a b értéke akkor, ha az f igaz, illetve a c értéke egyébként Végül egy fontos megjegyzés: néhány kivételt l eltekintve (nevezetes algoritmusok) a jegyzetben megjelen szeudokódokra csak mint egy lehetséges imlementációra kell tekinteni. Tehát a cél nem az itt szerel kódok bet r l-bet re való megtanulása, sokkal inkább az egyes technikák elvi hátterének alaos megértése, amiben segítséget nyújthat a ontos szeudokód illetve a éldát bemutató ábra. Amennyiben valaki valóban, minden részletre kiterjed en érti a végrehajtandó m veletek ontos menetét, akkor az ez alaján bármikor tud rekonstruálni egy jól m köd szeudokódot. Köszönetnyilvánítás Köszönettel tartozom Dr. Csink Lászlónak, akivel a Programozás II. (illetve korábban Programozási Paradigmák és Technikák) nev tárgy el adásait évek óta közösen tartjuk. Továbbá köszönettel tartozom Dr. Vámossy Zoltánnak, aki az évek folyamán számos értékes észrevétellel segítette a tárgy végs formájának kialakítását, majd edig vállalta ennek a jegyzetnek a lektori feladatait is. Szintén köszönöm a sok segítséget Dr. Sergyán Szabolcsnak is, akivel mind a Programozás I. tárgy oktatójaként, mind edig az Algoritmusok, adatszerkezetek I. jegyzet szerz jeként is nai szinten egyeztettünk és remélhet leg egyeztetünk a jöv ben is. Végül, de nem utolsó sorban szeretnék köszönetet mondani az Alkalmazott Informatikai Intézet munkatársai közül Cseri Orsolya Eszternek, Dr. Erdélyi Krisztinának, Nagy Tibor Istvánnak, Szabó Zsoltnak, Szántó Balázsnak és Urbán Andrásnak, akik a Programozás II. tárgy laborjait tartották. Az évek folyamán számos értékes észrevételt fogalmaztak meg, amelyek beéültek ebbe a jegyzetbe is. Szénási Sándor 4 Óbudai Egyetem

. fejezet Visszalééses keresés.. Visszalééses keresés alagondolata... Alaelv A visszalééses keresés (backtrack) egy olyan roblémamegoldási módszer, amely az alábbi esetekben használható a leghatékonyabban: A megoldandó feladat több, egymástól csak közvetve függ részfeladat megoldásából áll. Már a részfeladatok egy részéb l is lehet arra következtetni, hogy az azokra adott részmegoldásokkal biztosan nem érhet el a teljes megoldás. A visszalééses keresés alaelve, hogy egyesével dolgozzuk fel a megoldandó részfeladatokat. Az els részfeladathoz választunk egy lehetséges részmegoldást, majd nézzük a következ t. Amennyiben találunk olyan részmegoldást, ami kielégíti a második részfeladatot, és nincs ellentmondásban az els részfeladathoz választottal, akkor ezt is rögzítjük, és továbbléünk a következ részfeladathoz. Amennyiben valamelyik részfeladatnál nem találunk egy, az el z feltételeknek megfelel részmegoldást sem, akkor visszaléünk az el z részfeladathoz, és ott keresünk egy másik lehet séget. Amennyiben a részfeladatok és a lehetséges megoldások száma véges, akkor véges számú léést követ en vagy találunk olyan részmegoldásokat, amelyek egyenként kielégítik az összes részfeladatot (tehát találtunk egy teljes megoldást), vagy el áll egy olyan helyzet, hogy az els részfeladatról is vissza kellene lénünk, mivel az ott lév minden egyes részmegoldásra beláttuk, hogy egyik se lehet egy teljes megoldás része (tehát a feladatnak nincs megoldása). A visszalééses keresést gyakran rekurzív algoritmussal valósítjuk meg, ahol a rekurzió alaelve: Visszavezetés: N részfeladat megoldását úgy keressük meg, hogy rögzítünk egy, az els részfeladatot kielégít, és az el z leg talált részmegoldásokat nem kizáró részmegoldást, majd újra meghívjuk a rekurzív eljárást a maradék N- darab részfeladatra. Amennyiben a rekurzió azzal az eredménnyel tért vissza, hogy nem sikerült végleges megoldást találnia, akkor az adott szinten keresünk egy másik lehetséges részmegoldást, és újrahívjuk a rekurziót. Amennyiben nem találunk több lehet séget, akkor visszaléünk az el z rekurzió szintre. Triviális eset : A fenti hívás során ha már csak egy darab megoldandó részfeladat maradt, és arra találtunk a fenti feltételeknek megfelel megoldást, akkor megoldottuk a feladatot. Triviális eset : Ha a legels szinten nem találunk a fentieknek megfelel részmegoldást, akkor nincs megoldása a feladatnak. A módszer m ködésének ugyan nem el feltétele, de csak akkor m ködik hatékonyan, ha már néhány részeredményb l el tudjuk dönteni, hogy az nem vezethet jó teljes megoldáshoz. Ilyenkor ugyanis nem kell folytatnunk a még hátralév részfeladatok megoldását, ehelyett azonnal megróbálhatunk egy másik utat keresni az aktuális szinten. Ezzel ideális esetben jelent sen lesz kíthetjük a keresés során megvizsgált tér méretét, ami számottev sebességnövekedést eredményezhet. 5

A mohó algoritmusokkal ellentétben egy megadott szinten a továbblééskor soha nem tudhatjuk, hogy valóban jó léést tettünk-e. A kizárási feltétel csak abban segít, hogy megadott szinten el tudjuk dönteni, hogy az el z eredmények kizárják-e egy részmegoldás kiválasztását. Azt azonban itt még nem tudjuk, hogy a választott megoldáshoz a még hátralév részfeladatokhoz is találunk-e majd nem kizáró részmegoldásokat.... Példa visszalééses keresésre Példaként vegyük az alábbi feladatot: Egy éítkezésen 6 különböz feladatra kell embert találnunk: "tervezés", "irányítás", "beszerzés", "ellen rzés", "engedélyezés", "értékesítés", ahol az egyes feladatokra az alábbi személyek alkalmasak: "tervezés" feladatra alkalmas: "Miklós", "Klaudia", "irányítás" feladatra alkalmas: "Zsolt", "Miklós", "beszerzés" feladatra alkalmas: "András", "ellen rzés" feladatra alkalmas: "András", "Pál", "Zsolt", "engedélyezés" feladatra alkalmas: "András", "Géza", "értékesítés" feladatra alkalmas: "Géza", "Miklós". A feladatunk az, hogy rendeljünk az egyes feladatokhoz egy-egy személyt az arra alkalmasak közül, olyan módon, hogy egy személy csak egy feladatot vállalhat. Az.. ábra alaján érdemes végignézni, hogy ontosan milyen léések követik egymást, ez alaján az alaelv már jól érthet. Az el z elvi leírásban is megjelen léések a itt is jól láthatóak, l.: Részmegoldás rögzítése és továbbléés: Ez látható már az els lééskor is (.a. ábra). Amennyiben az adott szinten találunk olyan részmegoldást, amelyet nem zárnak ki az el z eredmények, akkor feltételezzük, hogy ez része lehet egy teljes megoldásnak. Ezért ezt rögzítjük, és folytatjuk a keresést a következ szinten (szintek alatt a részfeladatokat értjük). Szinten belül új megoldás keresése: Az.d. ábrán is látható, hogy az adott szinten az els ként megvizsgált részeredmény nem választható, mivel azt már kizárta az egyik el z választásunk. Ilyenkor még ugyanezen a szinten maradva megróbálunk más részmegoldást keresni. Visszaléés: Az els visszaléés az.i. ábrán látható. Mindezt az okozza, hogy az adott szinten belül nem találtunk egy részmegoldást sem, amelyet ne zártak volna ki az el z választásaink, így nem tudtunk továbbléni a következ szintekre. Mivel az adott szinten belül se tudunk már új részmegoldást keresni, így nyilvánvaló, hogy az eddig követett út nem vezethet jó végeredményhez, emiatt visszaléünk egy szintet. Az usztán véletlen egybeesés, hogy éen az utolsó szintr l fordultunk vissza, a éldában számos eset látható, amikor már egy köztes szintr l is vissza kellett lénünk (l..j. ábra,??. ábra). Teljes megoldás: Az.u. ábrán látható, hogy találtunk megfelel részmegoldást az utolsó szinten. Mivel ide csak úgy juthattunk, hogy már az összes el z szintet megoldottuk, így ez a teljes feladat megoldását is jelenti. Egyedül arra nem láttunk éldát, hogy mi történik akkor, ha nincs megoldása a feladatnak. De belátható, hogy amennyiben újabb visszaléések után ismét visszajutnánk a legels szintre, akkor az azt jelentené, hogy sem a "Miklós", sem edig a "Klaudia" nev jelentkez vel nem sikerült a teljes feladatra megoldást találni. Más lehet ségünk edig nincs, így nyilván nincs megoldása a feladatnak. Szénási Sándor 6 Óbudai Egyetem

Zsolt Klaudia Miklós Pál Géza Miklós Miklós Zsolt András András András Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (a) Els szinten választjuk az els lehetséges részmegoldást, Miklóst. Mivel megfelel a feltételeknek, továbbléünk a következ szintre. Klaudia Miklós Miklós Zsolt András Zsolt András Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Pál Géza András Miklós Géza (b) Következ szinten választjuk az els t, Zsoltot. Miklóssal nem zárják ki egymást, így elfogadható. Továbbléünk a következ szintre. Klaudia Miklós Miklós Zsolt András Zsolt András Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Pál Géza András Miklós Géza (c) A harmadik szinten választhatjuk Andrást, mivel nem zárják ki az el z választások. következ szintre. Zsolt Klaudia Miklós Pál Géza Miklós Zsolt András András András Továbbléünk a Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (d) A negyedik szinten András lenne az els lehet ség, de t nem választhatjuk, mivel az el z szinten már adtunk neki munkát. Ezért keresünk újabb részmegoldást a szinten belül. Klaudia Miklós Miklós Zsolt András Zsolt András Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Pál Géza András Miklós Géza (e) Ugyanezen a szinten a következ lehet ség Pál, t választhatjuk. Továbbléünk a következ szintre... ábra. Visszalééses keresés mintaélda (feladatok kiosztása). Szénási Sándor 7 Óbudai Egyetem

Zsolt Klaudia Miklós Pál Géza Miklós Miklós Zsolt András András András Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (f) Az ötödik szinten András ismét nem választható, hiszen már foglalt. Keresünk itt másik megoldást. Klaudia Miklós Miklós Zsolt András Zsolt Pál András Géza András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (g) A következ elem (Géza), azonban már jó, emiatt ezt rögzítjük, és folytatjuk a következ szinttel. Klaudia Miklós Miklós Zsolt András Zsolt Pál András Géza András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (h) Az utolsó szint els lehetséges részmegoldása nem megfelel, hiszen az el z szinten is Gézát válaszottuk. Így a szinten belül keresünk tovább. Klaudia Miklós Miklós Zsolt András Zsolt András Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Pál Géza András Miklós Géza (i) Az utolsó szint második lehetséges részmegoldása sem megfelel. Mivel így nem tudunk el reléni, illetve a szinten belül sincs már további lehet ség, ezért egy szinttel visszaléünk. Klaudia Miklós Miklós Zsolt András Zsolt András Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Pál Géza András Miklós Géza (j) Azonban már itt sincs további választási lehet ség, ezért itt is egy szinttel visszaléünk... ábra. Visszalééses keresés mintaélda (feladatok kiosztása). (folytatás) Szénási Sándor 8 Óbudai Egyetem

Zsolt Klaudia Miklós Pál Géza Miklós Miklós Zsolt András András András Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (k) A negyedik szintre visszatérve, itt még van egy újabb lehet ség. visszaléünk az el z szintre. Zsolt Klaudia Miklós Pál Miklós Zsolt András András Zsoltot azonban már választottuk, így Géza Miklós András Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Klaudia Miklós (l) Az el z szinten nincs más választási lehet ség, így innen is visszaléünk. Zsolt Miklós Pál Géza Zsolt András András András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (m) A második szinten megróbálhatnánk Miklóst választani, azonban az els szint aktuális részeredménye ezt kizárja. Így innen is visszaléünk. Klaudia Miklós Miklós Zsolt András Zsolt András Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Pál Géza András Miklós Géza (n) A legels szinten járunk ismét. Itt még van másik lehet ség, így itt megróbáljuk Klaudiát választani. Klaudia Miklós Miklós Zsolt András Zsolt Pál András Géza András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (o) A második feladatra Zsolt megfelel lehet. Léünk tovább... ábra. Visszalééses keresés mintaélda (feladatok kiosztása). (folytatás) Szénási Sándor 9 Óbudai Egyetem

Zsolt Klaudia Miklós Pál Géza Miklós Miklós Zsolt András András András Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés () Harmadik szinten értelemszer en Andrást választjuk (ezt nem ábrázoltuk). A negyedik szinten András emiatt már nem választható. Így szinten belül keresünk mást. Klaudia Miklós Miklós Zsolt András Zsolt Pál András Géza András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Klaudia Miklós (q) Pál viszont itt megfelel, így léhetünk tovább. Zsolt Miklós Pál Géza Zsolt András András András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés Klaudia Miklós (r) András itt sem jó, így keresünk a szinten belül valaki mást. Zsolt Miklós Pál Géza Zsolt András András András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (s) Géza még szabad, így t választhatjuk... ábra. Visszalééses keresés mintaélda (feladatok kiosztása). (folytatás) Szénási Sándor 0 Óbudai Egyetem

Zsolt Klaudia Miklós Pál Géza Miklós Miklós Zsolt András András András Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (t) Az utolsó részfeladatra Géza így már nem választható. Így a szinten belül keresünk megoldást. Klaudia Miklós Miklós Zsolt András Zsolt Pál András Géza András Miklós Géza Tervezés Irányítás Beszerzés Ellen rzés Engedélyezés Értékesítés (u) Miklóst viszont nem zárják még ki az el z választások. Ezzel megoldást találtunk az utolsó részfeladatra is, így befejezhetjük a keresést, megvan egy lehetséges teljes megoldás... ábra. Visszalééses keresés mintaélda (feladatok kiosztása). (folytatás) Az.. ábrán látható léésekkel lefutó algoritmus végeredménye az alábbi feladatkiosztás: "tervezés" feladatra: "Klaudia", "irányítás" feladatra: "Zsolt", "beszerzés" feladatra: "András", "ellen rzés" feladatra: "Pál", "engedélyezés" feladatra: "Géza", "értékesítés" feladatra: "Miklós". Az eredmény nem tartalmaz arra vonatkozó információt, hogy vannak-e még további megoldások (akár lehetnek is), az els helyes eredmény megtalálása után ugyanis leállt az algoritmus futása. Szénási Sándor Óbudai Egyetem

.. Visszalééses keresés általános alakja... Bemenet és kimenet Egy lehetséges deníció: a visszalééses keresés egy szisztematikus módszer, amely egyesével átvizsgálja a roblématér összes lehetséges kongurációját [0]. Az alaelv tehát az, hogy folyamatosan éítsünk egy utat a végs megoldás felé, menet közben elhagyva azokat a lehetséges leágazásokat, amelyek biztosan nem vezetnek jó eredményhez. A éldán láthattuk egy konkrét feladat megoldásának lééseit, ez alaján róbáljuk meg leírni a módszer általános alakját. Ehhez els léésként a bemutatott éldában látható bemeneteket (feladatok, alkalmas személyek), és kimeneteket (van-e megoldás, és ha igen, akkor kit melyik munkához rendeltünk), illetve a végrehajtandó lééseket róbáljuk meg általánosítani! Egy visszalééses keresési feladat bemenetét az alábbiakkal adhatjuk meg: N: A megoldandó részfeladatok száma. M szint : A szint-edik részfeladat esetében rendelkezésre álló lehetséges részmegoldások száma (ahol szint N). R szint,i : A szint-edik részfeladat i. lehetséges megoldása ( szint N és i M szint ). A visszalééses keresés kimenete: van: Logikai érték, ami azt mutatja, hogy találtunk-e teljes megoldást. E: Az eredményeket tartalmazó vektor, ahol E i az i. részfeladat esetében az algoritmus által talált részmegoldás ( i N). Fontos észrevennünk, hogy maga az alaelv sokféle feladat megoldására alkalmassá tehet. Hasonló a helyzet, mint a már tanult lineáris keresésnél, ahol maga az algoritmus a tényleges keresési feltételt l függetlenül mindig ugyanaz volt, usztán egy F araméterrel jelöltük, hogy ontosan milyen feltételnek kell megfelelnie a keresett elemnek. A visszalééses keresésnél is hasonló technikát alkalmazunk annyi különbséggel, hogy itt a keresési feltételt két különböz függvénnyel fogjuk meghatározni []: F t (szint, r): Egy függvény, ami azt határozza meg, hogy a szint-edik részfeladat esetében lehetséges megoldás-e az r? F k (szint, r, E): Azt határozza meg, hogy a szint-edik részfeladat esetében választhatjuk-e az r részmegoldást, amennyiben az el z szinteken az E vektorban található részmegoldásokat választottuk. A két függvény közötti lényeges különbség tehát az, hogy az F t az egyes részfeladatokat önmagukban kezeli, usztán azt vizsgálja, hogy a többi megoldástól függetlenül egy részeredmény megoldhatja-e az adott részfeladatot. Az F k függvény azonban már gyelembe veszi azt is, hogy a visszalééses keresésnek több részfeladatra is megoldást kell találnia, így ezzel már azt vizsgálhatjuk meg, hogy a vizsgált részmegoldást választhatjuk-e az eddig választott részmegoldások ismeretében? Megjegyzés A visszalééses keresés megvalósításától függ en az F t függvény sokszor el is hagyható. Amennyiben úgy válasszuk meg a bemeneteket (M szint, illetve R szint,j ), hogy eleve csak azokat a részmegoldásokat soroljuk fel, amelyek bármilyen esetben kiválaszthatók a hozzájuk tartozó részfeladat megoldásához, akkor az F t azonosan igaz függvény lesz, és így értelemszer en szükségtelen. Bizonyos feladatoknál azonban célszer lehet egy külön függvénnyel vizsgálni ezt a kérdést, emiatt a mi megvalósításunkban megtartjuk az F t függvényt. Szénási Sándor Óbudai Egyetem

.. Algoritmus Visszalééses keresés általános esete Bemenet: szint - egész, E - T tömb, van - logikai Kimenet: E - T tömb (az eredményt tartalmazza), van - logikai (van-e eredmény) : eljárás VisszaléésesKeresés(szint : egész, címszerint E : T tömb, címszerint van : logikai) : i 0 : ciklus amíg van i < M szint 4: i i + 5: ha F t (szint, R szint,i ) akkor 6: ha F k (szint, R szint,i, E) akkor 7: E szint R szint,i 8: ha szint = N akkor 9: van igaz 0: különben : VisszaléésesKeresés(szint +, E, van) : elágazás vége : elágazás vége 4: elágazás vége 5: ciklus vége 6: eljárás vége Felhasznált változók és függvények szint - Az aktuális szint, ahol keresünk. N - A megoldandó részfeladatok száma. M szint - A lehetséges részmegoldások száma a megadott szinten. R szint,i - Az i. részmegoldás a megadott szinten. E - Egy N elem vektor, ami az eredményeket tárolja. van - Folyamatosan azt mutatja, hogy találtunk-e már teljes megoldást. F t, F k - A keresési feltételeket meghatározó függvények.... Tetsz leges megoldás keresése A fenti bemeneteken dolgozó, visszalééses keresésen alauló általános megoldást mutatja be az.. algoritmus. Mint látható, maga az alaelv meglehet sen egyszer en leírható. Rekurzív formában róbáljuk megoldani a roblémát, ahol a rekurzió alafeltételeit az el z ekben már ismertetett módon határoztuk meg. A rekurzió minden egyes végrehajtása a araméterként megadott szintre róbál egy megoldást keresni. A lokális i változó szeree, hogy ez fogja végigvizsgálni a araméterként átadott szint lehetséges megoldásait. A. sorban adunk ennek kezd értéket, tehát az els lehetséges megoldással fog el ször róbálkozni. Egy ciklus végignézni az egyes lehetséges részmegoldásokat. A. sorban látható ciklusfeltétel felel s azért, hogy a ciklus csak addig fusson, amíg: Nem találtunk-e egy teljes megoldást, hiszen ezt követ en már felesleges lenne a további lehet ségek vizsgálata. Van-e még az adott szinten belül lehetséges részmegoldás. Hiszen ha nincs, akkor már nincs mit vizsgálni. Amennyiben lefut a ciklusmag, akkor els körben növeljük az i változó értékét (4. sor), hogy az valóban a következ, megvizsgálandó részmegoldás sorszámát tartalmazza. Ezt követ en ellen riznünk kell, hogy a vizsgált részmegoldás megfelel lehet-e a megadott szinten. Ez két függvény hívását jelenti. Az 5. sorban látható az el z leg bemutatott F t függvényé, ami azt vizsgálja, hogy a megadott szinten (szint) az éen vizsgált részmegoldás (S szint,i ) kiválasztható-e. Amennyiben a válasz igen, akkor következik annak a vizsgálata, hogy a vizsgált megoldást nem zárjae ki egy el z leg már rögzített részmegoldás. Erre használható a már bemutatott F k függvény, amelynek araméterei a szint, amelyiken dolgozunk (szint), a részmegoldás, amit éen vizsgálunk (S szint,i ), illetve az eddig rögzített eredmények sorozata (E). Szénási Sándor Óbudai Egyetem

Ha mindkét függvény igaz értékkel tért vissza, az azt jelenti, hogy az i. részmegoldás az adott szinten, az el z részmegoldások ismeretében jónak t nik, ezért elmentjük ezt az értéket az E-be (7. sor). Ezt követi egy vizsgálat (8. sor), hogy már az utolsó szinten járunk-e. Ha igen, akkor a van változó értékét igazra állítjuk, ezzel jelölve, hogy találtunk egy teljes megoldást (amit éen az E tartalmaz). Érdemes meggyelni, hogy a van változó új értékének hatására kiléünk az utolsó szinten lév ciklusból, és ugyanez fog történni az el z rekurziós szinteken is, tehát az els teljes megoldás megtalálása után a lehet leggyorsabban kiléünk a visszalééses keresésb l. Egy másik lehet ség, hogy találtunk ugyan egy részmegoldást, azonban a 8. sorban található vizsgálat alaján arra jutunk, hogy még nem oldottuk meg az egész feladatot. Ilyenkor folytatnunk kell a keresést a következ részfeladattal. A rekurzió szabályainak megfelel en ezt a. sorban látható rekurzív hívással tesszük meg. Itt az eljárás meghívja önmagát, araméterként átadja a következ szint azonosítóját (szint + ), illetve az eddig talált részeredményeket. Az eljáráshívásból el bb-utóbb visszatér a vezérlés. Ilyenkor a van változó értékéb l tudhatjuk meg, hogy mi volt ennek a visszatérésnek az oka. Ha a változó értéke igaz, az azt jelenti, hogy egy kés bbi szinten találtunk egy teljes megoldást, tehát ezen a szinten is kiléhetünk. Ha azonban a változó értéke hamis, az csak annyit jelent, hogy a következ szinteken nem sikerült eljutni egy teljes megoldáshoz, tehát az itt feltételezett S szint,i eredményünk mégse lesz jó választás, az nem vezet végleges megoldáshoz. Ezért els körben róbálkozunk egy újabb részeredmény választással (amíg a ciklusfeltétel igaz), illetve ha ez nem vezet eredményre, akkor kiléünk az eljárásból, ezzel visszaadva a vezérlést az el z szintnek, hogy az tudjon más részmegoldást választani (a van változó alaértelmezetten hamis, tehát ilyenkor ezt külön nem kell beállítanunk). A fenti leírás talán els re összetettnek t nik, de mindez annak köszönhet, hogy egy meglehet sen általános formát választottunk. A kés bbiekben látni fogjuk, hogy ugyanezt az algoritmust fogjuk felhasználni különféle, esetenként egymástól jelent sen különböz feladatok megoldásához. Az alaelv ugyanis végig ugyanaz marad, de a bemen araméterek, illetve az F t és F k függvények helyes megválasztásával teljesen eltér feladatokat is meg tudunk oldani (feladat kiosztás, Sudoku feladat megoldás, 8 királyn elhelyezése sakktáblán, stb.). Megjegyzés Az algoritmus rugalmas voltát mutatja az is, hogy OOP környezetben egy absztrakt osztályként nagyon jól megvalósítható. Az s absztrakt osztály tartalmazza a fent felsorolt mez ket, illetve magát a megoldó algoritmust. Az F t és az F k függvények célszer en (virtuális) absztrakt metódusokként jelenhetnek meg, hiszen az általános alak még nem alkalmas tényleges feladatok megoldására. A kés bbiekben egy konkrét feladat megoldása során elég egy leszármazottat készíteni, amely értéket ad a szükséges mez knek, illetve a feladatnak megfelel en megvalósítja az F t és F k függvényeket.... Összes megoldás keresése Az el z leg megismert algoritmus mindig az els általa talált megoldást adja vissza. A gyakorlatban sokszor el fordul, hogy nem csak egy tetsz leges, hanem az összes megoldást keressük (ezt mutatja be az.. algoritmus). Az algoritmust csak minimálisan kellett megváltoztatni ahhoz, hogy az megtalálja az összes megoldást. Megjelent egy új araméter, a M IN D, ami egy halmaz, amiben folyamatosan gy jtjük a menet közben megtalált megoldásokat (a rekurzió kezd hívásakor egy üres halmazt kell átadni címszerinti araméterként). Amennyiben a van változó értéke a futás végén igaz, akkor ebb l a halmazból lehet kiolvasni a talált teljes megoldásokat. Az alaesetet bemutató szeudokódot két helyen kellett módosítani: a 0. sorban látható kiegészítés célja, hogy egy új teljes eredmény megtalálása esetében mentse el ezt a araméterként átadott M IN D halmazba. Ezen túlmen en módosítanunk kellett a ciklust is, mivel az alaváltozatban az úgy m ködött, hogy az els megoldás után megróbált minél gyorsabban kiléni a rekurzióból. Ha az összes megoldást keressük, akkor azonban erre nincs szükség. S t, egy teljes megoldás megtalálása nem befolyásolja a további vizsgálatokat, a keresésnek ugyanúgy kell folytatódnia, mint eddig. Ennek megfelel en változott a. sor. Szénási Sándor 4 Óbudai Egyetem

.. Algoritmus Minden megoldást visszaadó visszalééses keresés Bemenet: szint - egész, E - T tömb, van - logikai, MIND - T tömbök halmaza Kimenet: MIND - T tömbök halmaza (az eredményeket tárolja), van - logikai (van-e eredmény) : eljárás VisszaléésesKeresés(szint : egész, címszerint E : T tömb, címszerint van : logikai, címszerint MIND : T tömb halmaz) : i 0 : ciklus amíg i < M szint 4: i i + 5: ha F t (szint, R szint,i ) akkor 6: ha F k (szint, R szint,i, E) akkor 7: E szint R szint,i 8: ha szint = N akkor 9: van igaz 0: MIND MIND E : különben : VisszaléésesKeresés(szint +, E, van, M IN D) : elágazás vége 4: elágazás vége 5: elágazás vége 6: ciklus vége 7: eljárás vége Felhasznált változók és függvények szint - Az aktuális szint, ahol keresünk. N - A megoldandó részfeladatok száma. M szint - A lehetséges részmegoldások száma a megadott szinten. R szint,i - Az i. részmegoldás a megadott szinten. E - Egy N elem vektor, ami az eredményeket tárolja. van - Folyamatosan azt mutatja, hogy találtunk-e már teljes megoldást. MIND - A robléma megoldásait tartalmazó halmaz (abban az esetben, ha van = igaz). F t, F k - A keresési feltételeket meghatározó függvények. Szénási Sándor 5 Óbudai Egyetem

..4. Otimális megoldás keresése Szintén gyakori módosítás, hogy nem az összes, hanem csak a legjobb megoldást keressük. A módosítás hasonló az el z höz, itt is el kell érnünk a ciklusfeltétel módosításával, hogy az els találat után ne álljon le a keresés, hanem léjen tovább a következ lehetséges részmegoldáshoz. Ezt mutatja be az.. algoritmus... Algoritmus Otimális megoldást visszaadó visszalééses keresés Bemenet: szint - egész, E - T tömb, van - logikai, OP T - T tömb Kimenet: OP T - T tömb (az otimális eredményt tartalmazza), van - logikai (van-e eredmény) : eljárás VisszaléésesKeresés(szint : egész, címszerint E : T tömb, címszerint van : logikai, címszerint OPT : T tömb) : i 0 : ciklus amíg i < M szint 4: i i + 5: ha F t (szint, R szint,i ) akkor 6: ha F k (szint, R szint,i, E) akkor 7: E szint R szint,i 8: ha szint = N akkor 9: ha van Jóság(E) > Jóság(OP T ) akkor 0: OP T E : elágazás vége : van igaz : különben 4: VisszaléésesKeresés(szint +, E, van, OP T ) 5: elágazás vége 6: elágazás vége 7: elágazás vége 8: ciklus vége 9: eljárás vége Felhasznált változók és függvények szint - Az aktuális szint, ahol keresünk. N - A megoldandó részfeladatok száma. M szint - A lehetséges részmegoldások száma a megadott szinten. R szint,i - Az i. részmegoldás a megadott szinten. E - Egy N elem vektor, ami az eredményeket tárolja. van - Folyamatosan azt mutatja, hogy találtunk-e már teljes megoldást. Jóság(E) - Egy függvény, ami megadja a araméterként átadott végeredmény értékét. OP T - A robléma otimális megoldása (abban az esetben, ha van = igaz). F t, F k - A keresési feltételeket meghatározó függvények. A lényeges különbség usztán annyi, hogy az új, teljes megoldások megtalálása esetén nem tároljuk el azokat egy halmazban, hanem minden új megoldás esetében ellen rizzük, hogy az jobb-e mint az eddig talált legjobb. Ha igen, akkor mostantól ezt tekintjük a legjobbnak. A változás tehát a 9. sornál látható. Amikor találunk egy új megoldást, akkor ellen rizzük, hogy volt-e már megoldásunk (ezt egyszer en megtehetjük, hiszen ezt mutatja a van változó értéke). Ha nem, akkor nyilvánvalóan ez az els lesz az eddigi legjobb. Ha edig már volt, akkor ahhoz hasonlítjuk a most találtat, és csak akkor írjuk ezzel felül a régit, ha annál jobbat találtunk (0. sor). Ez utóbbi m velet azonban csak akkor hajtható végre, ha az egyes végeredmények összehasonlíthatóak. Emiatt bevezettünk egy kiegészít Jóság nev függvényt, aminek a aramétere egy végeredmény, visszatérési értéke edig egy szám, ami két eredmény közül mindig annál lesz nagyobb, amelyiket jobbnak tekintjük. Szénási Sándor 6 Óbudai Egyetem