tárolási módok, bejárásokusers.nik.uni-obuda.hu/sztf2/graf1.pdf · 2018-02-12 ·...
TRANSCRIPT
Szoftvertervezés és -fejlesztés II. előadáshttp://nik.uni-obuda.hu/sztf2
Szénási Sá[email protected]
Óbudai Egyetem,Neumann János Informatikai Kar
Gráfok 1.
Tárolási módok, bejárások
Tárolási módok
Szélességi bejárás
Mélységi bejárás
Gráfok 1.
Szoftvertervezés és -fejlesztés [email protected]
• 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
3
Alapfogalmak
1 5
3
2 4
6
7
Szoftvertervezés és -fejlesztés [email protected]
• 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
4
Alapvető műveletek
Szoftvertervezés és -fejlesztés [email protected]
1
2
3
4
5
6
7
• 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.)
5
Szomszédsági lista
1 5
3
2 4
6
7
4 5
1 3
6
2 3
1 5 7
6
L
5
4 5
Szoftvertervezés és -fejlesztés [email protected]
• 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)
6
Szomszédsági lista kiegészítések
Szoftvertervezés és -fejlesztés [email protected]
1
2
3
4
5
6
7
• 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.)
7
Szomszédsági mátrix/csúcsmátrix
1 5
3
2 4
6
7
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
1 0 0 0 1 0 1
0 0 0 1 1 0 0
0 0 0 0 0 1 0
CS
Szoftvertervezés és -fejlesztés [email protected]
• 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)
8
Szomszédsági mátrix kiegészítések
Szoftvertervezés és -fejlesztés [email protected]
• 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)
9
Döntési szempontok
Tárolási módok
Szélességi bejárás
Mélységi bejárás
Gráfok 1.
Szoftvertervezés és -fejlesztés [email protected]
• 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
11
Gráf bejárások
Szoftvertervezés és -fejlesztés [email protected]
• 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ábbanelért, de még teljesen át nemvizsgált csúcs szomszédjai feléhaladunk tovább
• Használt adatszerkezetek– S – egy sor, ami a már elért,
de még a feldolgozásra várócsúcsokat tárolja
– F – egy halmaz, ami a már elértcsúcsokat tárolja
• Az algoritmus addig fut, amígelfogynak a feldolgozhatócsúcsok
• Fontos kiemelni, hogy ez nem mindig fogja feldolgozni a gráf minden csúcsát
12
Szélességi bejárás
eljárás SzélességiBejárás(start)
S ⇐ start
F {start}
ciklus amíg (S ≠ )
k ⇐ S
Feldolgoz(k.tart)
ciklus x k.Szomszédok
ha x F akkor
S ⇐ x
F ← F ∪ {x}
elágazás vége
ciklus vége
ciklus vége
eljárás vége
Szoftvertervezés és -fejlesztés [email protected]
• 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
13
Csúcsok állapota a bejárás során
Szoftvertervezés és -fejlesztés [email protected]
• Egy d tömb/hasító táblázat segítségével minden csúcshozhozzárendelünk egy számértéket. Ez a kiinduló csúcstólvaló legrövidebb út hosszátmutatja (ez alatt itt alegkevesebb élből álló utatértjük)
• A kiinduló pont esetében eza távolság értelemszerűen 0
• Minden további újonnan felfedezett csúcs esetén annaktávolsága egyel több, mintannak 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
14
Legrövidebb utak hosszát megadó kiegészítés
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
Szoftvertervezés és -fejlesztés [email protected]
• Egy π tömb/hasító táblázat segítségével minden csúcshoz hozzárendelünk egy másikcsúcsot (vagy értéket). Ez aztmutatja, hogy adott csúcsotmelyik csúcsból értük el
• A kiinduló pont esetében aπ [start] = , hiszen nincsmegelőző csúcs
• Minden további új csúcsesetén annak első elérésekorelhelyezzük a π adott csúcshoztartozó 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)15
Egy feszítőfát megadó kiegészítés
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
Szoftvertervezés és -fejlesztés [email protected]
• 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
16
Szélességi keresés gyakorlati alkalmazása
Tárolási módok
Szélességi bejárás
Mélységi bejárás
Gráfok 1.
Szoftvertervezés és -fejlesztés [email protected]
• 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ésselellentétben itt mindig azutoljára elért, új kivezetőélekkel rendelkező csúcsokatderítjük fel. Ha nincs ilyen,akkor pedig visszalépünk egymá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 vermenalapul, ezt a rekurzió miatt közvetve használjuk
• Fontos kiemelni, hogy ez nem mindig fogja feldolgozni a gráf minden csúcsát
18
Mélységi bejárás
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
Szoftvertervezés és -fejlesztés [email protected]
• Gyakran szükség van arra, hogy az egyes csúcsokat melyik másik csúcsból értük el
• Az itt látható kiegészítés eztaz adatot gyűjti a π tárolóba
• A kiinduló pont esetében aπ [start] = , hiszen nincsmegelőző csúcs
• Ez alapján megadható egyút a kiinduló start csúcsbóla gráf összes többi csúcsába
• A szélességi bejáráshozhasonlóan a π-ben találhatóadatok alapján egyfeszítőfát állíthatunk elő
19
Megelőző elemet is tároló változat
eljárás MélységiBejárásRek(k,
címsz. F, címsz. π)
F F ∪ {k}
Feldolgoz(k.tart)
ciklus x k.Szomszédok
ha x F akkor
π[x] k
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
π[start]
MélységiBejárásRek(start, F, π)
eljárás vége
Szoftvertervezés és -fejlesztés [email protected]
• A gyakorlatban hasznos lehet, ha folyamatában vizsgáljuk a mélységi keresés lépéseit. Ehhezcélszerű lehet eltárolni azegyes csúcsokba való be- éskilé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 kezdetben0, utána pedig az egyeshívások során folyamatosannövekszik
• Az eljárás elején és végénlátható a be és ki nevűszerkezetek tárolják az egyes csúcsok elérési és elhagyási idejét
20
Belépési és elhagyási időt is tároló változat
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
eljárás MélységiBejárás(start)
F ;
MélységiBejárásRek(start,F,0,be,ki)
eljárás vége
Szoftvertervezés és -fejlesztés [email protected]
• 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:
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
21
Topológiai rendezés
alsónadrág nadrág öv
zokni
ing
cipő nyakkendő
zakó
Szoftvertervezés és -fejlesztés [email protected]
• Jól tudjuk használni a mélységikeresés azon változatát, amelytárolta az egyes csúcsokelérési és elhagyási idejét
• Egy topológiai rendezéselőállítható úgy, hogy az egyescsúcsokat az elhagyás fordítottsorrendjében soroljuk fel
• Technikailag ez egyszerűbbenis megoldható, pl. mindenelhagyáskor a csúcsot szúrjukegy láncolt lista elejére
• Mivel a gráf nem biztos, hogyerősen összefüggő, így minden csúcsból el kell indítani arekurzív bejárást
22
Topológiai rendezés előállítása
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
Szoftvertervezés és -fejlesztés [email protected]
• 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)
23
Mélységi keresés gyakorlati alkalmazása