HellĂł mindenkinek.
Ebben a bemutatĂłban felsorolom azokat az adatstruktĂșrĂĄkat, amelyeket a grafok tĂĄrolĂĄsĂĄra hasznĂĄlnak az informatikĂĄban, Ă©s beszĂ©lek nĂ©hĂĄny mĂĄs hasonlĂł struktĂșrĂĄrĂłl is, amelyek valamiĂ©rt âkristĂĄlyosodtakâ bennem.
Nos, kezdjĂŒk. De nem az elejĂ©n â gondolom, mindannyian tudjuk, mi az a graf Ă©s milyen tĂpusai vannak (irĂĄnyĂtott, irĂĄnyĂtatlan, sĂșlyozott, nem sĂșlyozott, többszörös Ă©lekkel Ă©s hurkokkal vagy nĂ©lkĂŒlĂŒk).
TehĂĄt nĂ©zzĂŒk meg, milyen adatstruktĂșrĂĄk ĂĄllnak rendelkezĂ©sĂŒnkre a grafok tĂĄrolĂĄsĂĄra.
1. MĂĄtrix alapĂș adatstruktĂșrĂĄk
1.1 SzomszĂ©dsĂĄgi mĂĄtrix. A szomszĂ©dsĂĄgi mĂĄtrix egy olyan mĂĄtrix, amelynek sor- Ă©s oszlopfejlĂ©cei a graf csĂșcsainak szĂĄmĂĄt kĂ©pviselik, mĂg az egyes elemeinek Ă©rtĂ©ke a közöttĂŒk lĂ©vĆ Ă©lek jelenlĂ©tĂ©t vagy hiĂĄnyĂĄt jelöli a következĆ kĂ©plettel: a(i,j). NyilvĂĄnvalĂł, hogy az irĂĄnyĂtatlan graf esetĂ©n ez a mĂĄtrix szimmetrikus lesz, vagy pedig megbeszĂ©lhetjĂŒk, hogy az összes Ă©rtĂ©ket csak a fĆ ĂĄtlĂł felett tĂĄroljuk. Az irĂĄnyĂtatlan grafok esetĂ©n a(i,j) az i-bĆl j-be mutatĂł Ă©lek szĂĄmĂĄt jelenti (ha ilyen Ă©lt nem talĂĄlunk, akkor a(i,j)= 0), mĂg a sĂșlyozott grafok esetĂ©n az Ă©lek sĂșlyĂĄt (összsĂșlyĂĄt) is Ăgy lehet megadni.
1.2 Incidencia mĂĄtrix. Ez esetben a grafunk is egy tĂĄblĂĄzatban tĂĄrolĂłdik, amelyben ĂĄltalĂĄban a sorok szĂĄmĂĄnak a csĂșcsok szĂĄmai, mĂg az oszlopok szĂĄmĂĄnak a korĂĄbban szĂĄmozott Ă©lek felelnek meg. Ha egy csĂșcs Ă©s egy Ă©l incidens egymĂĄsra, akkor a megfelelĆ cellĂĄban egy nem nulla Ă©rtĂ©k kerĂŒl rögzĂtĂ©sre (irĂĄnyĂtatlan grafok esetĂ©n 1 kerĂŒl beĂrĂĄsra, ha a csĂșcs Ă©s az Ă©l incidensek, irĂĄnyĂtott grafok esetĂ©ben pedig â1â, ha az Ă©l âkilĂ©pâ a csĂșcsbĂłl Ă©s â-1â, ha âbelĂ©pâ a csĂșcsba (ezt elĂ©g könnyen megjegyezhetjĂŒk, mert a âmĂnuszâ jel is Ășgy âbelĂ©pâ a â-1â szĂĄmba)). A sĂșlyozott grafok esetĂ©n a 1 Ă©s -1 helyett a sĂșly az, amit hasznĂĄlunk.
2. ĂrtĂ©kelĆ adatstruktĂșrĂĄk
2.1 SzomszĂ©dsĂĄgi lista. Itt Ășgy tƱnik, minden egyszerƱ. Minden grĂĄfcsĂșcsnak, ĂĄltalĂĄban vĂ©ve, bĂĄrmilyen enumeratĂv struktĂșrĂĄval (lista, vektor, tömb, ...) megfelelĆen hozzĂĄrendelhetĆ, amelyben az adott csĂșccsal szomszĂ©dos összes csĂșcs szĂĄmĂĄt tĂĄroljĂĄk. Az irĂĄnyĂtott grĂĄfok esetĂ©ben ebbe a listĂĄba csak azokat a csĂșcsokat fogjuk felvenni, amelyekbe âirĂĄnyĂtottâ Ă©l van a jelölĆ csĂșcsbĂłl. A sĂșlyozott grĂĄfok esetĂ©ben a megvalĂłsĂtĂĄs bonyolultabb lesz.
2.2 Ălek listĂĄja. Ez egy meglehetĆsen nĂ©pszerƱ adatstruktĂșra. Az Ă©lek listĂĄja, amint azt a KapitĂĄny NyilvĂĄnvalĂł megmondja, valĂłjĂĄban a grĂĄf Ă©leinek sajĂĄt listĂĄjĂĄt kĂ©pviseli, amelybĆl minden Ă©l egy kezdĆ csĂșccsal, vĂ©gsĆ csĂșccsal (a nem irĂĄnyĂtott grĂĄfoknĂĄl a sorrend nem szĂĄmĂt, bĂĄr egysĂ©gesĂtĂ©s cĂ©ljĂĄbĂłl kĂŒlönbözĆ szabĂĄlyokat hasznĂĄlhatunk, pĂ©ldĂĄul a csĂșcsokat növekvĆ sorrendbe ĂĄllĂtva) Ă©s sĂșlyjal (csak a sĂșlyozott grĂĄfok szĂĄmĂĄra) van meghatĂĄrozva.
A fent emlĂtett listĂĄk-mĂĄtrixok rĂ©szletesen (Ă©s illusztrĂĄciĂłkkal) megtekinthetĆk, pĂ©ldĂĄul .
2.3 SzomszĂ©dsĂĄgi mĂĄtrix. Nem a leggyakrabban elĆfordulĂł struktĂșra. ValĂłjĂĄban egyfajta âcsomagolĂĄsiâ formĂĄt kĂ©pvisel a szomszĂ©dsĂĄgi listĂĄk egy enumeratĂv struktĂșrĂĄba (tömb, vektor) törtĂ©nĆ Ă¶sszegyƱjtĂ©sĂ©nek. A grĂĄf csĂșcsainak szĂĄmĂĄhoz tartozĂł elsĆ n eleme ennek a tömbnek a kezdĆ indexeit tartalmazza, amelyek a következĆ csĂșcsokat tartalmazzĂĄk, amelyek szomszĂ©dosak az adott csĂșccsal.
Itt talĂĄltam a legĂ©rthetĆbb (sajĂĄt szĂĄmomra) magyarĂĄzatot:
3. SzomszĂ©dsĂĄgi vektor Ă©s asszociatĂv szomszĂ©dsĂĄgi tömb
Ăgy alakult, hogy a sorok szerzĆje, aki nem profi programozĂł, de idĆnkĂ©nt foglalkozott grĂĄfokkal, leggyakrabban az Ă©lek listĂĄival talĂĄlkozott. ValĂłban hasznos, ha a grĂĄfban többszörös hurok Ă©s Ă©l van. Ăs itt, az klasszikus Ă©lek listĂĄinak kiterjesztĂ©se Ă©rdekĂ©ben, javaslom, hogy figyelmet szenteljĂŒnk a âkibĆvĂtĂ©sĂŒk/növekedĂ©sĂŒk/mĂłdosĂtĂĄsuk/mutĂĄciĂłjukâ irĂĄnyĂĄba, nevezetesen: a szomszĂ©dsĂĄgi vektorra Ă©s asszociatĂv szomszĂ©dsĂĄgi tömbre.
3.1 Szomszédsågi vektor
Eset (a1): nem sĂșlyozott grĂĄf
A nem sĂșlyozott grĂĄf szomszĂ©dsĂĄgi vektorĂĄnak fogjuk nevezni a pĂĄros szĂĄmĂș egĂ©sz szĂĄmokat tartalmazĂł rendezett halmazt (a[2i], a[2i+1],..., ahol i 0-tĂłl kezdĆdik), amelyben minden szĂĄm pĂĄr a[2i], a[2i+1] egy Ă©l grĂĄf között a a[2i] Ă©s a[2i+1] csĂșcsok között.
Ez a felvĂ©teli formĂĄtum nem tartalmaz informĂĄciĂłt arrĂłl, hogy a grĂĄf irĂĄnyĂtott-e (mindkĂ©t lehetĆsĂ©g megengedett). Amikor ezt a formĂĄtumot irĂĄnyĂtott grĂĄfkĂ©nt hasznĂĄljĂĄk, a szegmens Ășgy tekintendĆ, hogy az a[2i]-bĆl a a[2i+1]-be irĂĄnyul. Itt Ă©s a tovĂĄbbiakban: nem irĂĄnyĂtott grĂĄfok esetĂ©n, ha szĂŒksĂ©ges, alkalmazhatĂłk a csĂșcsok rögzĂtĂ©si sorrendjĂ©re vonatkozĂł követelmĂ©nyek (pĂ©ldĂĄul, hogy az elsĆ a kisebb szĂĄmĂ©rtĂ©kkel rendelkezĆ csĂșcs legyen).
C++-ban a szomszĂ©dsĂĄgi vektort Ă©rdemes std::vector hasznĂĄlatĂĄval definiĂĄlni, ezĂ©rt vĂĄlasztottĂĄk ezt az adattĂpus nevĂ©t.
Eset (a2): sĂșlyozatlan grĂĄf, az Ă©lek sĂșlyai egĂ©sz szĂĄmok.
HasonlĂłan az (a1) esethez, a sĂșlyozott grĂĄf szomszĂ©dsĂĄgi vektorĂĄt egĂ©sz szĂĄmĂș Ă©l sĂșlyokkal Ășgynevezett rendezett sorozatnak (dinamikus tömb) nevezzĂŒk (a[3i], a[3i+1], a[3i+2],âŠ, ahol i 0-tĂłl kezdĆdik), ahol minden "triplet" szĂĄm a[3i], a[3i+1], a[3i+2] a grĂĄf Ă©lĂ©t hatĂĄrozza meg a a[3i] Ă©s a[3i+1] szĂĄmĂș csĂșcsai között, a a[3i+2] pedig ennek az Ă©lnek a sĂșlyĂĄt adja. Ez a grĂĄf szintĂ©n lehet irĂĄnyĂtott vagy nem.
Eset (b): sĂșlyozatlan grĂĄf, az Ă©lek sĂșlyai nem egĂ©sz szĂĄmok.
Mivel egy tömbben (vektorban) nem tĂĄrolhatĂłk vegyes elemek, lehetsĂ©ges pĂ©ldĂĄul a következĆ implementĂĄciĂł. A grĂĄf egy pĂĄr vektorban tĂĄrolĂłdik, ahol az elsĆ vektor a grĂĄf szomszĂ©dsĂĄgi vektora, amely nem tartalmazza a sĂșlyokat, mĂg a mĂĄsodik vektor a megfelelĆ sĂșlyokat tartalmazza (lehetsĂ©ges implementĂĄciĂł C++-ban: std::pair). Ăgy az Ă©l, amely kĂ©t csĂșcs pĂĄrjĂĄval van meghatĂĄrozva az elsĆ vektor 2i, 2i+1 indexein, sĂșlya az i indexƱ elem lesz a mĂĄsodik vektorban.
De miĂ©rt van erre szĂŒksĂ©g?
Nos, ennek a szövegnek a szerzĆje szĂĄmos feladat megoldĂĄsĂĄhoz ezt elĂ©g hasznosnak talĂĄlta. FormĂĄlis szempontbĂłl az alĂĄbbi elĆnyök szĂĄrmaznak ebbĆl:
- A szomszĂ©dsĂĄgi vektor, akĂĄrcsak bĂĄrmilyen mĂĄs "felsorolĂĄsos" struktĂșra, elĂ©g kompakt, kevesebb memĂłriĂĄt foglal el, mint a szomszĂ©dsĂĄgi mĂĄtrix (sparsz grĂĄfok esetĂ©n), viszonylag könnyen megvalĂłsĂthatĂł.
- A grĂĄf csĂșcsai elvileg negatĂv szĂĄmokkal is megjelölhetĆk. Lehet, hogy szĂŒksĂ©g lesz egy ilyen "perverziĂłra" is.
- A grĂĄfok tartalmazhatnak többszörös Ă©leket Ă©s többszörös hurokakat, kĂŒlönbözĆ sĂșlyokkal (pozitĂv, negatĂv, sĆt nullĂĄk is). Nincsenek korlĂĄtozĂĄsok.
- A bordĂĄkhoz kĂŒlönbözĆ tulajdonsĂĄgokat is rendelhetĂŒnk â errĆl lĂĄsd a 4. pontot.
Ugyanakkor el kell ismerni, hogy a listĂĄnak nincs gyors hozzĂĄfĂ©rĂ©se a bordĂĄhoz. Itt jön a segĂtsĂ©gĂŒnkre a SzigetelĆ asszociatĂv tömb, amirĆl alĂĄbb olvashat.
3.2 SzigetelĆ asszociatĂv tömb
TehĂĄt, ha a konkrĂ©t Ă©lhez, annak sĂșlyĂĄhoz Ă©s egyĂ©b tulajdonsĂĄgaihoz valĂł hozzĂĄfĂ©rĂ©s kritikusan fontos szĂĄmunkra, Ă©s a memĂłriaigĂ©nyek nem teszik lehetĆvĂ© a szomszĂ©dsĂĄgi mĂĄtrix hasznĂĄlatĂĄt, gondoljuk vĂ©gig, hogyan tudnĂĄnk megvĂĄltoztatni a szomszĂ©dsĂĄgi vektort e problĂ©ma megoldĂĄsĂĄra. TehĂĄt a kulcs az Ă©l a grĂĄfban, amelyet rendezett egĂ©sz szĂĄmok pĂĄrjakĂ©nt lehet definiĂĄlni. Mire hasonlĂt ez? Nem egy kulcsra az asszociatĂv tömbben? Ha igen, akkor miĂ©rt ne valĂłsĂtanĂĄnk meg? Legyen egy ilyen asszociatĂv tömbĂŒnk, ahol minden kulcshoz â rendezett egĂ©sz szĂĄm pĂĄrhoz â tartozik egy Ă©rtĂ©k â egĂ©sz vagy valĂłs szĂĄm, amely az Ă©l sĂșlyĂĄt jelöli. C++-ban Ă©rdemes ezt a struktĂșrĂĄt a std::map kontĂ©ner alapjĂĄn megvalĂłsĂtani (std::map<std::pair, int> vagy std::map<std::pair, double>), vagy std::multimap, ha több Ă©l vĂĄrhatĂł. Nos, Ăgy lĂ©trehoztuk a grĂĄfok tĂĄrolĂĄsĂĄhoz megfelelĆ struktĂșrĂĄt, amely kevesebb memĂłriĂĄt foglal el, mint a "mĂĄtrix" struktĂșrĂĄk, kĂ©pes kezelni a többszörös hurkokat Ă©s Ă©leket, sĆt, a csĂșcsok nemnegatĂv szĂĄmainak szigorĂș követelmĂ©nyei sincsenek (nem tudom, kinek van szĂŒksĂ©ge erre, de mĂ©gis).
4. Adatszerkezetek, bår "beletöltheted", valami hiånyzik
ValĂłban: szĂĄmos feladat megoldĂĄsakor szĂŒksĂ©gĂŒnk lehet arra, hogy a grĂĄf Ă©leihez kĂŒlönfĂ©le jellemzĆket rendeljĂŒnk, Ă©s ennek megfelelĆen tĂĄroljuk Ćket. Ha ezeket a jellemzĆket egyĂ©rtelmƱen egĂ©sz szĂĄmokkĂĄ lehet redukĂĄlni, akkor ilyen "kiegĂ©szĂtett jellemzĆkkel rendelkezĆ grĂĄfokat" tĂĄrolhatunk a kibĆvĂtett szomszĂ©dsĂĄgi vektorok Ă©s az asszociatĂv szomszĂ©dsĂĄgi tömbök hasznĂĄlatĂĄval.
TegyĂŒk fel, hogy van egy sĂșlyozatlan grĂĄfunk, ahol minden Ă©lhez pĂ©ldĂĄul 2 tovĂĄbbi jellemzĆt kell tĂĄrolni, amelyek egĂ©sz szĂĄmokkal vannak megadva. Ebben az esetben az Ă©lek szomszĂ©dos vektorĂĄt Ășgy definiĂĄlhatjuk, mint rendezett egĂ©sz szĂĄmok halmazĂĄt, amely nem "pĂĄrokbĂłl", hanem "nĂ©gyesekbĆl" ĂĄll (a[2i], a[2i+1], a[2i+2], a[2i+3]âŠ), ahol a[2i+2] Ă©s a[2i+3] hatĂĄrozzĂĄk meg a megfelelĆ Ă©l jellemzĆit. A sĂșlyozott Ă©lek esetĂ©ben a sorrend alapvetĆen hasonlĂł (a kĂŒlönbsĂ©g csupĂĄn annyi, hogy a jellemzĆk az Ă©l sĂșlya utĂĄn következnek, Ă©s a a[2i+3] Ă©s a[2i+4] elemek hatĂĄrozzĂĄk meg Ćket, mĂg magĂĄt az Ă©lt nem 4, hanem 5 rendezett szĂĄm hatĂĄrozza meg). Az Ă©lek nem egĂ©sz szĂĄmĂș sĂșlyainak esetĂ©ben a jellemzĆk a sĂșlyozatlan komponensĂ©ben is rögzĂthetĆk.
Az asszociatĂv szomszĂ©dsĂĄgi tömb hasznĂĄlatakor sĂșlyozott Ă©lek esetĂ©n nemcsak egy kĂŒlön szĂĄm, hanem egy szĂĄmokbĂłl ĂĄllĂł tömb (vektor) is megadhatĂł, amely az Ă©l sĂșlya mellett minden egyĂ©b szĂŒksĂ©ges jellemzĆt is meghatĂĄroz. Nem egĂ©sz szĂĄmĂș sĂșlyok esetĂ©n azonban kĂ©nyelmetlensĂ©get jelent az, hogy a jellemzĆt lebegĆpontos szĂĄmmal kell megadni (igen, ez kĂ©nyelmetlensĂ©g, de ha az ilyen jellemzĆk nem tĂșl sokan vannak, Ă©s ha nem tĂșl "bonyolult" double-t adunk meg, akkor talĂĄn nem olyan nagy problĂ©ma). Ăgy a C++-ban az asszociatĂv szomszĂ©dsĂĄgi tömbök a következĆkĂ©ppen definiĂĄlhatĂłk: std::map <std::pair , std::vector> vagy std::map <std::pair , std::vector>, ahol a "kulcs-Ă©rtĂ©k vektorĂĄban" az elsĆ Ă©rtĂ©k az Ă©l sĂșlya, majd pedig a jellemzĆk numerikus megjelölĂ©sei következnek.
Irodalom:
A gråfokkal és algoritmusokkal åltalåban:
1. Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L., Stein, Clifford. Algoritmusok: kialakĂtĂĄs Ă©s elemzĂ©s, 2. kiadĂĄs: AngolrĂłl fordĂtva â M.: Williams KiadĂł, 2011.
2. Harari, Frank. A gråfok elmélete. M.: Mir, 1973.
Az ĂrĂł elĆadĂĄsa errĆl a vektorrĂłl Ă©s asszociatĂv tömbrĆl:
3. Chernouhov S.A. Adjacency vector and adjacency map as methods of representing and storing graphs / S.A. Chernouhov. Adjacency vector and adjacency map as data structures to represent a graph // Collection of articles from the International Scientific and Practical Conference "Problems of implementing innovative developments and ways to solve them" (Saratov, 14.09.2019). â Sterlitamak: AMI, 2019, pp. 65-69
Hasznos internetes forråsok a témåban:
4.
5.
ForrĂĄs: habr.com
