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

Hasonló dokumentumok
Gráfok. Programozás II. előadás. Szénási Sándor.

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

22. GRÁFOK ÁBRÁZOLÁSA

Adatszerkezetek II. 2. előadás

Gráfok bejárása. Szlávi Péter, Zsakó László: Gráfok II :17

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

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

Gráfok, definíciók. Gráfok ábrázolása. Az adott probléma megoldásához ténylegesen mely műveletek szükségesek. Ábrázolások. Példa:

Adatszerkezetek II. 1. előadás

III. Gráfok. 1. Irányítatlan gráfok:

Adatszerkezetek 2. Dr. Iványi Péter

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Gráfalgoritmusok ismétlés ősz

Algoritmuselmélet. Mélységi keresés és alkalmazásai. Katona Gyula Y.

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. Katona Gyula Y.

Diszkrét matematika 2.C szakirány

Struktúra nélküli adatszerkezetek

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

5/1. tétel: Optimalis feszítőfák, Prim és Kruskal algorithmusa. Legrövidebb utak graphokban, negatív súlyú élek, Dijkstra és Bellman Ford algorithmus.

Diszkrét matematika 2. estis képzés

Gráfelmélet. I. Előadás jegyzet (2010.szeptember 9.) 1.A gráf fogalma

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

1: Bevezetés: Internet, rétegmodell Alapok: aszimptótika, gráfok. HálózatokII, 2007

A gráffogalom fejlődése

Adatszerkezetek II. 3. előadás

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Visszalépéses keresés

Diszkrét matematika 2.C szakirány

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

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

Egyirányban láncolt lista

Számítógép hálózatok, osztott rendszerek 2009

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

Algoritmusok és adatszerkezetek 2.

23. SZÉLESSÉGI BEJÁRÁS

Adatszerkezetek 7a. Dr. IványiPéter

Algoritmusok bonyolultsága

Algoritmuselmélet 7. előadás

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

A számítástudomány alapjai

Adatszerkezetek 1. Dr. Iványi Péter

Sali Attila Budapest Műszaki és Gazdaságtudományi Egyetem. I. B. 137/b március 16.

Gráfelméleti alapfogalmak

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

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

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

EGYSZERŰ, NEM IRÁNYÍTOTT (IRÁNYÍTATLAN) GRÁF

Diszkrét matematika 2. estis képzés

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

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

Gráfelméleti feladatok. c f

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

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

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

Diszkrét matematika 2.C szakirány

Programozás II. előadás

Web-programozó Web-programozó

Diszkrét matematika 2. estis képzés

Algoritmuselmélet. Bonyolultságelmélet. Katona Gyula Y.

2. Visszalépéses keresés

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

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

Algoritmuselmélet. Legrövidebb utak, Bellmann-Ford, Dijkstra. Katona Gyula Y.

Programozási technológia

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

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

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

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

Generikus osztályok, gyűjtemények és algoritmusok

Logika es sz am ıt aselm elet I. r esz Logika 1/36

Diszkrét matematika 2.C szakirány

Diszkrét matematika 2.

Diszkrét matematika 1. estis képzés

Egyszerű programozási tételek

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Algoritmuselmélet 2. előadás

Diszkrét matematika 2. estis képzés

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

Euler tétel következménye 1:ha G összefüggő síkgráf és legalább 3 pontja van, akkor: e 3

38. A gráfalgoritmusok alkalmazása

Algoritmuselmélet 11. előadás

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

ELTE IK Esti képzés tavaszi félév. Tartalom

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

Algoritmuselmélet. 2-3 fák. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem. 8.

Adatszerkezetek 1. előadás

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

Diszkrét matematika 2.C szakirány

Elemi adatszerkezetek

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

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

Diszkrét matematika 2.C szakirány

Felvételi tematika INFORMATIKA

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

Programozási nyelvek Java

GRÁFELMÉLET. 7. előadás. Javító utak, javító utak keresése, Edmonds-algoritmus

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

Diszkrét matematika 1. estis képzés

Átírás:

Gráfok 1. Tárolási módok, bejárások előadás http://nik.uni-obuda.hu/sztf2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar

Gráfok 1. Tárolási módok Szélességi bejárás Mélységi bejárás

3 Alapfogalmak Irányított gráf: csúcsok véges halmaza, illetve egy ezen értelmezett bináris reláció (élek halmaza) Formálisan: G = (V, E) G gráf V csúcsok halmaza, pl. { 1, 2, 3, 4, 5, 6, 7 } E élek halmaza, pl. { (1, 4), (2, 1), (2, 3), } V csúcsok száma E élek száma Súlyozott gráfok esetén az egyes élekhez egy kiegészítő súly értéket is rendelünk 1 5 2 4 7 3 6

4 Alapvető műveletek A gráfok eltárolására számos klasszikus módszer létezik. Az általunk tárgyalt algoritmusok megvalósítása szempontjából a fizikai eltárolási mód nem lényeges, csak annyit várunk el, hogy az alkalmas legyen az alábbi műveletek végrehajtására Gráfokon értelmezhető alapvető műveletek G.Csúcsok visszaadja a gráf csúcsait G.Élek visszaadja a gráf éleit Gráf csúcsain értelmezhető műveletek x.vezetél(y) megadja, hogy vezet-e él a paraméterként átadott y csúcsba? x.szomszédok visszaadja a csúcs szomszédjait (azokat a csúcsokat, amelyekbe vezet él a megadott csúcsból) Súlyozott gráf esetén értelmezhető x.súly(y) súlyozott gráfok esetén visszaadja az x-ből y-ba vezető él súlyát Gráf csúcsok tartalmazhatnak további adatokat is, pl. Tart a csúcshoz kapcsolt tartalom

5 Szomszédsági lista Alapelv: a szomszédsági listás tárolás esetén egy L tömböt használunk, melynek mérete megegyezik a csúcsok számával, az i. eleme egy láncolt lista, amely tárolja az i. csúcs szomszédjait (azokat a csúcsokat, amelyekbe vezet él az i. csúcsból) Műveletek megvalósítása (VezetÉl, stb.) 1 5 1 2 L 4 5 1 3 2 4 7 3 4 6 2 3 5 5 1 5 7 3 6 6 7 4 5 6

6 Szomszédsági lista kiegészítések Amennyiben egy csúcsból nem indulnak ki élek, akkor az üres láncolt listákhoz hasonlóan ez a mező közvetlenül értéket tartalmaz A listában szereplő csúcsok sorrendje tetszőleges, esetenként valamilyen (csúcsazonosító vagy gyakoriság) szerinti rendezést érdemes lehet használni A lista tartalma lehet a csúcs neve/azonosítója, de akár referencia magára a csúcsra Súlyozott gráfok esetében a listát célszerű kiegészíteni egy további mezővel, ami a megadott csúcsból a megadott csúcsba vezető él súlyát tárolja Irányítatlan gráfok esetében az éleket mindkét csúcs listájában szerepeltetni kell (vagy a VanÉl metódust módosítani) Irányított gráfok esetében az adatszerkezet helyfoglalása V *mutató_méret + E *(csúcs_azonosító_méret + mutató_méret)

7 Szomszédsági mátrix/csúcsmátrix Alapelv: a szomszédsági mátrix alapú tárolás esetén egy CS kétdimenziós tömböt használunk, amely sorainak és oszlopainak száma megegyezik a csúcsok számával az i. sor j. oszlopában lévő érték azt mutatja, hogy vezet-e él az i. csúcsból a j. csúcsba (pl. 1 igen, 0 nem) Műveletek megvalósítása (VezetÉl, stb.) CS 1 5 2 4 7 1 2 3 4 1 2 3 4 5 6 7 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 3 6 5 6 1 0 0 0 1 0 1 0 0 0 1 1 0 0 7 0 0 0 0 0 1 0

8 Szomszédsági mátrix kiegészítések Irányítatlan gráfok esetében CS[i,j] értéke minden esetben megegyezik CS[j,i] értékével. Emiatt a mátrix szimmetrikus a főátlójára. Súlyozott mátrixok esetében a módszer kiegészíthető azzal, hogy nem csak 1-et vagy 0-t tárolunk, hanem magát a súly értékét (amennyiben elképzelhetők 0 súlyú élek, akkor módosítanunk kell a nincs él jelzés értékét) Látható, hogy a mátrix mérete csak a csúcsok számától függ, ennek megfelelően a várható helyfoglalás V * V *csúcs_azonosító_méret (irányítatlan gráf esetén elégséges a főátló, illetve az efeletti elemek tárolása, így a tárhely igény is csaknem a felére csökken)

Döntési szempontok Tárhely szempontjából Amennyiben az élek száma a csúcsok számához képest meglehetősen kevés (ritka gráfok) szomszédsági listás tárolás Amennyiben az élek száma a csúcsok számához képest meglehetősen sok (a konkrét érték függ a mutatók méretétől is) csúcsmátrixos tárolás Műveletek szempontjából Gyakran van szükség a Szomszédok műveletre szomszédsági listánál azonnal választ kapunk csúcsmátrixnál V darab lépésre van szükség szomszédsági listás tárolás Gyakran van szükség a VanÉl műveletre szomszédsági listánál egy láncolt lista keresést kell futtatni csúcsmátrixnál azonnali választ kapunk csúcsmátrixos tárolás A megfelelő tárolási mód tehát csak a feladat, illetve a pontos implementáció ismeretében határozható meg (megj.: nagyobb mátrixok esetében a csúcsmátrix a tárhely igénye miatt gyakran nem jelent valós opciót) szenasi.sandor@nik.uni-obuda.hu 9

Gráfok 1. Tárolási módok Szélességi bejárás Mélységi bejárás

11 Gráf bejárások Gráfok esetében a bejárás hasonlóan értelmezhető mind az eddig megismert adatszerkezetek esetén (a gráf minden csúcsának egyszeri feldolgozása) Az algoritmusok azonban bonyolultabbak az eddig megismerteknél, ugyanis gondolni kell az alábbiakra gráfokban előfordulhatnak körök/ciklusok, és ügyelni kell arra, hogy a bejárásunk ne kerüljön végtelen ciklusba az eddigi adatszerkezeteinkkel ellentétben a gráfok nem feltétlenül összefüggőek, ilyenkor tisztázni kell, hogy mi a pontos cél (egy komponens bejárása, vagy az összes csúcs elérése) Egy irányítatlan gráfot összefüggőnek nevezünk, ha bármely két csúcsa összeköthető úttal Irányított gráfokat akkor nevezzük erősen összefüggőnek, ha tetszőleges két csúcs esetén mindegyik elérhető a másikból A fentieknek megfelelően beszélhetünk összefüggő, illetve erősen összefüggő komponensekről

Szélességi bejárás Szélességi bejárás (szélességi keresés): egy adott kezdőpontból kiindulva feldolgozza a gráf összes innen elérhető csúcsát Minden lépésben a legkorábban eljárás SzélességiBejárás(start) elért, de még teljesen át nem S start F {start} vizsgált csúcs szomszédjai felé ciklus amíg (S ) haladunk tovább k S Használt adatszerkezetek Feldolgoz(k.tart) ciklus x k.szomszédok S egy sor, ami a már elért, ha x F akkor de még a feldolgozásra váró S x csúcsokat tárolja F F {x} F egy halmaz, ami a már elért elágazás vége csúcsokat tárolja ciklus vége Az algoritmus addig fut, amíg ciklus vége eljárás vége elfogynak a feldolgozható csúcsok Fontos kiemelni, hogy ez nem mindig fogja feldolgozni a gráf minden csúcsát szenasi.sandor@nik.uni-obuda.hu 12

13 Csúcsok állapota a bejárás során Már elért, de még fel nem dolgozott csúcsok Azok a csúcsok, amelyeket már elért az algoritmus, de még nem lettek feldolgozva (tehát nem vizsgáltuk meg a belőlök elérhető szomszédokat) Ezek azok a csúcsok, amelyek benne vannak az S sorban Már elért és feldolgozott csúcsok Azok a csúcsok tartoznak ide, amelyeket már elért az algoritmus, és az összes belőlük kivezető él is fel lett már dolgozva (vagy éppen a feldolgozásuk történik) Ezek azok a csúcsok, amelyek már benne vannak az F halmazban, de már nincsenek benne az S-ben Még el nem ért csúcsok Az algoritmus futása során még nem találkoztunk velük Nincsenek benne egyik adatszerkezetben sem

14 Legrövidebb utak hosszát megadó kiegészítés Egy d tömb/hasító táblázat segítségével minden csúcshoz hozzárendelünk egy szám értéket. Ez a kiinduló csúcstól való legrövidebb út hosszát mutatja (ez alatt itt a legkevesebb élből álló utat értjük) A kiinduló pont esetében ez a távolság értelemszerűen 0 Minden további újonnan felfedezett csúcs esetén annak távolsága egyel több, mint annak a csúcsnak a távolsága, ahonnan először értük el A bejárás során el nem ért csúcsok esetén a d nem kap értéket eljárás SzélességiBejárás(start) S start F {start} d[start] 0 ciklus amíg (S ) k S ciklus x k.szomszédok ha x F akkor S x F F {x} d[x] d[k] + 1 elágazás vége ciklus vége ciklus vége eljárás vége

Egy feszítőfát megadó kiegészítés Egy π tömb/hasító táblázat segítségével minden csúcshoz hozzárendelünk egy másik csúcsot (vagy értéket). Ez azt mutatja, hogy adott csúcsot melyik csúcsból értük el A kiinduló pont esetében a π [start] =, hiszen nincs megelőző csúcs Minden további új csúcs esetén annak első elérésekor elhelyezzük a π adott csúcshoz tartozó elemébe azt a csúcsot, ahonnan ide jutottunk A π értékek alapján megadható az adott csúcsokba a start-ból vezető legrövidebb út (ha van) A π értékei alapján felépíthető egy feszítőfa (szélességi fa) szenasi.sandor@nik.uni-obuda.hu eljárás SzélességiBejárás(start) S start F {start} π[start] ciklus amíg (S ) k S ciklus x k.szomszédok ha x F akkor S x F F {x} π[x] k elágazás vége ciklus vége ciklus vége eljárás vége 15

16 Szélességi keresés gyakorlati alkalmazása Komponensek keresése A szélességi keresés lefutása után az F halmaz tartalmazza a kiinduló (start) csúcsból elérhető összes csúcs halmazát Gyenge összefüggőség vizsgálata: az előbb megismert algoritmussal Erős összefüggőség vizsgálata: irányított gráf esetén a fordított gráfon (ennek csúcsai ugyanazok, élei viszont pont ellenkező irányúak) elvégezzük ugyanezt a bejárást, és ha ez is megtalál minden csúcsot, akkor a komponens erősen összefüggő Útkeresés Amennyiben a gráf egyes csúcsai a lehetséges útelágazásokat reprezentálják, az élek pedig az egyes csomópontok között meglévő utakat Akkor a szélességi keresés megadja az összes elérhető csomópontot Egy kiegészítő leállási feltétellel megadható, hogy egy megadott cél csúcs elérése után álljon le a program futása A feltétel lehet valamilyen F feltételnek megfelelő csúcs formájú is A π értékei alapján egyszerűen megadható, hogy a cél csúcsba melyik úton lehet a legrövidebben eljutni

Gráfok 1. Tárolási módok Szélességi bejárás Mélységi bejárás

18 Mélységi bejárás Mélységi bejárás (mélységi keresés): egy adott kezdőpontból kiindulva feldolgozza a gráf összes innen elérhető csúcsát A szélességi kereséssel ellentétben itt mindig az utoljára elért, új kivezető élekkel rendelkező csúcsokat derítjük fel. Ha nincs ilyen, akkor pedig visszalépünk egy már előzőleg vizsgáltra Használt adatszerkezetek F egy halmaz, ami a már elért csúcsokat tárolja A feldolgozás egy vermen eljárás MélységiBejárásRek(k, címsz. F) F F {k} Feldolgoz(k.tart) ciklus x k.szomszédok ha x F akkor MélységiBejárásRek(x, F) elágazás vége ciklus vége eljárás vége eljárás MélységiBejárás(start) F MélységiBejárásRek(start, F) eljárás vége alapul, ezt a rekurzió miatt közvetve használjuk Fontos kiemelni, hogy ez nem mindig fogja feldolgozni a gráf minden csúcsát

19 Megelőző elemet is tároló változat Gyakran szükség van arra, hogy az egyes csúcsokat melyik másik csúcsból értük el eljárás MélységiBejárásRek(k, címsz. F, címsz. π) Az itt látható kiegészítés ezt F F {k} az adatot gyűjti a π tárolóba Feldolgoz(k.tart) A kiinduló pont esetében a ciklus x k.szomszédok ha x F akkor π [start] =, hiszen nincs π[x] k megelőző csúcs MélységiBejárásRek(x, F, π) elágazás vége Ez alapján megadható egy ciklus vége út a kiinduló start csúcsból eljárás vége a gráf összes többi csúcsába eljárás MélységiBejárás(start) A szélességi bejáráshoz F hasonlóan a π-ben található π[start] adatok alapján egy MélységiBejárásRek(start, F, π) eljárás vége feszítőfát állíthatunk elő

20 Belépési és elhagyási időt is tároló változat A gyakorlatban hasznos lehet, ha folyamatában vizsgáljuk a mélységi keresés lépéseit. Ehhez célszerű lehet eltárolni az egyes csúcsokba való be- és kilépési időket Ennek megfelelően t idő (lépésszám) be belépési időket tárolja ki kilépési időket tárolja A t változó értéke kezdetben 0, utána pedig az egyes hívások során folyamatosan eljárás MélységiBejárás(start) növekszik F ; MélységiBejárásRek(start,F,0,be,ki) Az eljárás elején és végén eljárás vége látható a be és ki nevű szerkezetek tárolják az egyes csúcsok elérési és elhagyási idejét eljárás MélységiBejárásRek(k, címsz. F, címsz. t, címsz. be, címsz. ki) be[k] t++ F F {k} Feldolgoz(k.tart) ciklus x k.szomszédok ha x F akkor MélységiBejárásRek(x,F,t,be,ki) elágazás vége ciklus vége ki[k] t++ eljárás vége

21 Topológiai rendezés Egy irányított gráf topológiai rendezése a csúcsoknak egy olyan sorba rendezése, amelyre igaz, hogy ha létezik (u,v) él a gráfban, akkor u megelőzi a sorban v-t Ha a gráf tartalmaz irányított kört, akkor nincs ilyen sorbarendezés Példa: öltözködéskor melyik ruhadarabot kell felvenni egy másik előtt: alsónadrág nadrág öv ing zokni Néhány lehetséges topológiai rendezés: alsónadrág, nadrág, ing, öv, zokni, cipő, nyakkendő, zakó ing, nyakkendő, zakó, zokni, alsónadrág, nadrág, cipő, öv cipő nyakkendő zakó

22 Topológiai rendezés előállítása Jól tudjuk használni a mélységi keresés azon változatát, amely tárolta az egyes csúcsok elérési és elhagyási idejét Egy topológiai rendezés előállítható úgy, hogy az egyes csúcsokat az elhagyás fordított sorrendjében soroljuk fel Technikailag ez egyszerűbben is megoldható, pl. minden elhagyáskor a csúcsot szúrjuk egy láncolt lista elejére Mivel a gráf nem biztos, hogy erősen összefüggő, így minden csúcsból el kell indítani a rekurzív bejárást eljárás MélységiBejárásRek(k, címsz. F, címsz. fej) F F {k} ciklus x k.szomszédok ha x F akkor MélységiBejárásRek(x, F, fej) elágazás vége ciklus vége ListaElejéreBeszúrás(fej, k) eljárás vége függvény TopológiaiRendezés(G) F ListaInicializálás(fej) ciklus st G.Csúcsok ha st F akkor MélységiBejárásRek(st, F, fej) elágazás vége ciklus vége vissza fej függvény vége

23 Mélységi keresés gyakorlati alkalmazása Visszalépéses keresés A visszalépéses keresés tulajdonképpen a mélységi keresés alapelvét használja működése során A lehetséges megoldások által kifeszített fában lépeget előre amíg tud, amíg vagy talál meg megoldást, vagy ha egy helyen elakad, akkor visszalép és új irányba próbálkozik Fa bejárások A pre-, in-, post-order bejárások tulajdonképpen mind egy-egy mélységi keresést mutatnak be Útkeresések Hasonlóan a szélességi kereséshez, bár nagy/nem korlátos gráfok esetén problémásabb a használata Topológiai rendezés Gyártási folyamat optimalizálása Erősen összefüggő komponensek keresése Gráf bejárása minden pontból kilépési idők megjegyzése Gráf transzponált bejárása (előző kilépési idők szerinti fordított sorrendben)