AdatstruktĂșrĂĄk grafok tĂĄrolĂĄsĂĄra: lĂ©tezƑ megoldĂĄsok ĂĄttekintĂ©se Ă©s kĂ©t „majdnem Ășj”

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 itt.

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: ejuo.livejournal.com/4518.html

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. prog-cpp.hu/adat-graf
5. ejuo.livejournal.com/4518.html

ForrĂĄs: habr.com

MegbĂ­zhatĂł hosting vĂĄsĂĄrlĂĄsa weboldalak szĂĄmĂĄra, DDoS vĂ©delemmel, VPS VDS szerverek. đŸ”„ MegbĂ­zhatĂł webtĂĄrhely vĂĄsĂĄrlĂĄsa DDoS vĂ©delemmel, VPS VDS szerverek | ProHoster