Gráfok ábrázolása teljesen láncoltan Készítette: Mihály Balázs Attila (szakall@elte.hu)
Gráf ábrázolási módjai: - Mátrix (csúcsmátrix) - Gyors elérhetőség - Ritka gráf esetén sok fölösleges adat - Optimális sűrű, telített gráfok tárolására - Éllista - Élek lassabban érhetőek el - Kevés fölösleges adadt - Optimális ritka gráfok tárolására - Teljesen láncolt - Csúcsok és élek lassan érhetőek el - Nincs fölösleges adat - Optimális sűrűn módosított gráfok tárolására
Élbeszúrás műveletigénye (a továbbiakban egyszerű, irányított gráfra) Mátrixos ábrázolás esetén az aktuális mátrixelem módosítása. => Egy adattag módosítása O(1) műveletigénnyel Éllistás ábrázolás esetén az aktuális csúcshoz tartozó éllistába elem beszúrása. => Beszúrás rendezetlen listába O(1) műveletigénnyel Teljesen láncolt ábrázolás esetén meg kell keresni a csúcslistában az él kiindulópontját, és a hozzá tartozó éllistába beszúrni a végpontot. => Keresés listában és beszúrás listába O(n) műveletigénnyel
Éltörlés műveletigénye Mátrixos ábrázolás esetén ugyanaz, mint beszúrásnál: az aktuális mátrixelem módosítása. => Egy adattag módosítása O(1) műveletigénnyel Éllistás ábrázolás esetén az aktuális csúcshoz tartozó éllistából elem törlése. => Keresés és törlés listából O(n) műveletigénnyel Teljesen láncolt ábrázolás esetén meg kell keresni a csúcslistában az él kiindulópontját, és a hozzá tartozó éllistából törölni a végpontot. => Keresés listában és törlés listából O(n) műveletigénnyel
Csúcsbeszúrás műveletigénye Mátrixos ábrázolás esetén a beszúrandó csúcs mögül mindent alrébb kell tolni, azaz az egész mátrix megváltozik (esetleg a mátrix méretét is növelni kell). => egy üres sor és oszlop az új csúcsnak, a csúcs mögötti értékek alrébb csúsztatása, összesen O(n2) műveletigény (Meg lehet csinálni, hogy előre elég nagy mártixot veszünk föl, melyben az összes lehetséges csúcs helyét lefoglaljuk, de ez bizonyos esetekben fölöslegesen fogal helyet. Ekkor ez a művelet O(1) lépésből áll.) Éllistás ábrázolás esetén a csúcsok tömbjét kell bővíteni (esetleg a tömb méretét módosítani). => a csúcs mögötti elemek alrébb csúsztatása O(n) műveletigénnyel (Esetleg a csúcstömböt szintén fölvehetjük előre, ekkor ez is O(1) lépés) Teljesen láncolt ábrázolás esetén a csúcslistába kell szúrni egy elemet. => beszúrás listába O(1) műveletigénnyel
Csúcstörlés műveletigénye Fontos, hogy a törlendő csúcsba vezető éleket is törölnünk kell a gráfból. Mátrixos ábrázolás esetén a törlendő csúcs mögül előrébb kell hozni a többi sort, oszopot. Az csúcsba vezető élek keresése és törlése a többi csúcsnál. => csúcs mögötti értékek előrébb csúsztatása, összesen O(n2) műveletigény (Élek keresése a többi csúcsnál és törlés: O(n) lépés) (A kevésbé helytakarékos esetben inaktiváljuk a csúcsot: O(1)) Éllistás ábrázolás esetén a csúcsok tömbjéből elem törlése (mögötte lévő elemek mozgatása), valamint élek keresése és törlése. => a csúcs mögötti elemek előrébb csúsztatása O(n) műveletigénnyel, minden csúcsnál él keresése (és törlése) O(n2) (Esetleg a csúcs inaktiválása O(1) lépés) Teljesen láncolt ábrázolás esetén törlés listából és az élek törlése => törlés listából O(n), élek keresése és törlése O(n2) műveletigénnyel
A műveletigények összefoglalva Csúcsok, élek elérése A gráfon végzett algoritmusok alkalmazásánál fontos a gráf egy csúcsának, élének elérési műveletigénye.
A teljesen listás ábrázolásról részletesebben Egy jó implementálási mód, ha a gráfot fejelemes listák listájaként ábrázoljuk. A fejelem tartalmaz egy csúcsot, a lista többi tagja pedig a fejelemben lévő csúcsból kiinduló élek végpontjait.
Példa teljesen láncolt ábrázolásra Egy, a bal oldalon látható irányított gráfot a jobb oldali listaszerkezetben ábrázolhatjuk.
Csúcs beszúrása
Él beszúrása
Csúcs törlése
Él törlése
A gráfelemek elérésének műveletigénye A listákban szereplő műveletigényeket javíthatjuk, ha minden lista helyett bináris keresőfát - mondjuk AVL fát - használunk. Ekkor az AVL fa műveletei alapján az eléréséhez már csak O(log2n) lépésre van szükség, a beszúrás és a törlés mind a csúcsok és élek esetén ezek szerint módosul. (A műveleteket könnyen leírhatjuk, ha az imént bemutatott listaműveleteket lecseréljük az AVL fa műveleteire)
Példa AVL fával ábrázolt gráfra
A csúcsokhoz tartozó éleket tartalmazó fák
A szakall.web.elte.hu/graf címről letölthetőek: - a bemutató fóliái - forráskód (tesztprogrammal) listával ábrázolt gráfhoz (c++) - forráskód (tesztprogrammal) AVL fával ábrázolt gráfhoz (c++)