Strutturi tad-dejta għall-ħażna ta 'graffs: reviżjoni ta' dawk eżistenti u żewġ "kważi ġodda".

Hi kulħadd

F'din in-nota, iddeċidejt li telenka l-istrutturi tad-dejta ewlenin użati biex jaħżnu graffs fix-xjenza tal-kompjuter, u se nitkellem ukoll dwar ftit aktar strutturi bħal dawn li b'xi mod "kristallizzaw" għalija.

Allura, ejja nibdew. Imma mhux mill-bidu nett - naħseb li aħna lkoll diġà nafu x'inhu graff u x'inhuma (dirett, mhux dirett, peżat, mhux ippeżat, bi jew mingħajr truf multipli u loops).

Allura, ejja mmorru. Liema għażliet għall-istrutturi tad-dejta għal "ħażna tal-graff" għandna?

1. Strutturi tad-dejta tal-matriċi

1.1 Matriċi ta' ħdejn. Il-matriċi ta' ħdejn xulxin hija matriċi fejn l-intestaturi tar-ringiela u l-kolonna jikkorrispondu man-numri tal-vertiċi tal-graff, u l-valur ta 'kull wieħed mill-elementi tiegħu a(i,j) huwa determinat mill-preżenza jew in-nuqqas ta' truf bejn il-vertiċi i u j (huwa ċar li għal graff mhux dirett tali matriċi se tkun simetrika, jew nistgħu naqblu li naħżnu l-valuri kollha biss fuq id-dijagonali prinċipali). Għal graffs mhux ippeżati, a(i,j) jista' jiġi stabbilit bin-numru ta' truf minn i sa j (jekk ma jkunx hemm xifer bħal dan, allura a(i,j)= 0), u għal graffs peżati, ukoll bil-piż (piż totali) tat-truf imsemmija.

1.2 Matriċi ta 'inċidenza. F'dan il-każ, il-grafika tagħna hija wkoll maħżuna f'tabella li fiha, bħala regola, in-numri tar-ringieli jikkorrispondu man-numri tal-vertiċi tiegħu, u n-numri tal-kolonna jikkorrispondu għal truf pre-numerati. Jekk vertiċi u tarf huma inċidentali għal xulxin, allura valur mhux żero jinkiteb fiċ-ċellula korrispondenti (għal graffs mhux diretti, 1 jinkiteb jekk il-vertiċi u t-tarf huma inċidentali, għal graffs orjentati - "1" jekk it-tarf "ħruġ" mill-vertiċi u "-1" jekk "jinkludi" fih (huwa faċli biżżejjed li tiftakar, għax is-sinjal "minus" jidher ukoll li huwa "inkluż" fin-numru "-1"). Għal graffs peżati, għal darb'oħra, minflok 1 u -1, tista 'tispeċifika l-piż totali tat-tarf.

2. Strutturi tad-dejta tal-enumerazzjoni

2.1 Lista ta' ħdejn. Ukoll, kollox jidher li huwa sempliċi hawn. Kull vertiċi tal-graff jistgħu, b'mod ġenerali, ikunu assoċjati ma 'kwalunkwe struttura ta' enumerazzjoni (lista, vettur, firxa, ...), li se taħżen in-numri tal-vertiċi kollha ħdejn dak mogħti. Għal graffs diretti, aħna se nżidu ma 'tali lista biss dawk il-vertiċi li għalihom hemm tarf "diret" minn vertiċi karatteristika. Għal graffs peżati l-implimentazzjoni se tkun aktar kumplessa.

2.2 Lista ta' kustilji. Struttura tad-dejta pjuttost popolari. Il-lista tat-truf, kif jgħidilna l-Kaptan Ovvju, hija fil-fatt lista tat-truf tal-graff, li kull wieħed minnhom huwa speċifikat mill-vertiċi tal-bidu, il-vertiċi tat-tmiem (għal graffs mhux diretti l-ordni mhix importanti hawn, għalkemm għall-unifikazzjoni tista’ uża diversi regoli, pereżempju, li tispeċifika l-vertiċi f'ordni li jiżdiedu) u l-piż (għal graffs peżati biss).

Tista' tħares lejn il-listi tal-matriċi elenkati hawn fuq f'aktar dettall (u b'illustrazzjonijiet), pereżempju, hawn.

2.3 Array ta' ħdejn. Mhux l-aktar struttura komuni. Fil-qalba tagħha, hija forma ta '"ippakkjar" listi ta' ħdejn xulxin fi struttura waħda ta 'enumerazzjoni (matriċi, vettur). L-ewwel n (skond in-numru ta 'vertiċi tal-graff) elementi ta' tali firxa fihom l-indiċi tal-bidu tal-istess firxa, li jibdew minn fejn il-vertiċi kollha ħdejn dak mogħti huma miktuba f'ringiela.

Hawnhekk sibt l-aktar spjegazzjoni li tinftiehem (għali nnifsi): ejuo.livejournal.com/4518.html

3. Vettur ta 'Adjaċenza u Array ta' Adjaċenza Assoċjattiva

Irriżulta li l-awtur ta 'dawn il-linji, li ma kienx programmatur professjonali, iżda li perjodikament ittratta graffs, ħafna drabi ittratta listi ta' truf. Tabilħaqq, huwa konvenjenti jekk il-graff ikollu loops u truf multipli. U għalhekk, fl-iżvilupp tal-listi klassiċi ta 'truf, nipproponi li tagħti attenzjoni lill-"iżvilupp / fergħa / modifika / mutazzjoni" tagħhom, jiġifieri: il-vettur ta' ħdejn xulxin u l-firxa ta 'adjaċenza assoċjattiva.

3.1 Vettur ta' adjaċenza

Każ (a1): graff mhux ippeżat

Aħna se nsejħu vettur ta' ħdejn xulxin għal graff mhux ippeżat sett ordnat ta' numru ugwali ta' numri interi (a[2i], a[2i+1],..., fejn i huwa nnumerat c 0), li fih kull par ta' numri. huwa a[2i], a[2i+1 ] jispeċifika xifer tal-graff bejn il-vertiċi a[2i] u a[2i+1], rispettivament.
Dan il-format ta' reġistrazzjoni ma fihx informazzjoni dwar jekk il-graff huwiex dirett (iż-żewġ għażliet huma possibbli). Meta tuża l-format tad-digraf, it-tarf jitqies li huwa dirett minn a[2i] għal a[2i+1]. Hawn u hawn taħt: għal graffs mhux diretti, jekk meħtieġ, jistgħu jiġu applikati rekwiżiti għall-ordni tar-reġistrazzjoni tal-vertiċi (per eżempju, li l-vertiċi bil-valur aktar baxx tan-numru assenjat lilu jiġi l-ewwel).

F'C++, huwa rakkomandabbli li tispeċifika vettur ta' adjaċenza bl-użu ta 'std::vector, għalhekk l-isem ta' din l-istruttura tad-dejta.

Każ (a2): graff mhux ippeżat, il-piżijiet tat-tarf huma sħaħ

B'analoġija mal-każ (a1), insejħu l-vettur ta' ħdejn xulxin għal graff peżat b'piżijiet ta' tarf integer sett ordnat (array dinamiku) ta' numri (a[3i], a[3i+1], a[3i+2], ..., fejn i hija nnumerata c 0), fejn kull “triplet” ta’ numri a[3i], a[3i+1], a[3i+2] jispeċifika tarf tal-graff bejn il-vertiċi nnumerati a[3i] u a[3i+1], rispettivament, u l-valur a [3i+2] huwa l-piż ta' dan it-tarf. Grafika bħal din tista' wkoll tkun jew diretta jew le.

Każ (b): graff mhux ippeżat, piżijiet tat-tarf mhux interi

Peress li huwa impossibbli li jinħażnu elementi eteroġenji f'firxa waħda (vettur), pereżempju, l-implimentazzjoni li ġejja hija possibbli. Il-graff huwa maħżun f'par ta' vettori, li fihom l-ewwel vettur huwa l-vettur ta' ħdejn il-graff mingħajr ma jiġu speċifikati l-piżijiet, u t-tieni vettur fih il-piżijiet korrispondenti (implimentazzjoni possibbli għal C++: std::par ). Għalhekk, għal tarf definit minn par ta' vertiċi taħt l-indiċi 2i, 2i+1 tal-ewwel vettur, il-piż ikun ugwali għall-element taħt l-indiċi i tat-tieni vettur.

Ukoll, għaliex dan huwa meħtieġ?

Ukoll, l-awtur ta 'dawn il-linji sabha pjuttost utli biex isolvi numru ta' problemi. Ukoll, mil-lat formali, se jkun hemm il-vantaġġi li ġejjin:

  • Il-vettur ta 'adjaċenza, bħal kull struttura "enumerattiva" oħra, huwa pjuttost kompatt, jieħu inqas memorja mill-matriċi ta' ħdejn (għal graffs skarsi), u huwa relattivament faċli biex jiġi implimentat.
  • Il-vertiċi tal-graff, fil-prinċipju, jistgħu wkoll ikunu mmarkati b'numri negattivi. X’jiġri jekk tkun meħtieġa “perverżjoni” bħal din?
  • Graffs jista 'jkun fihom truf multipli u loops multipli, b'piżijiet differenti (pożittivi, negattivi, anke żero). M'hemm l-ebda restrizzjonijiet hawn.
  • Tista' wkoll tassenja proprjetajiet differenti lit-truf - iżda għal aktar dwar dan, ara t-taqsima 4.

Madankollu, għandu jiġi ammess li din il-"lista" ma timplikax aċċess rapidu għat-tarf. U hawn l-Associative Adjacency Array jiġi għas-salvataġġ, li huwa diskuss hawn taħt.

3.2 Array ta' adjaċenza assoċjattiva

Allura, jekk l-aċċess għal tarf speċifiku, il-piż tiegħu u proprjetajiet oħra huwa kritiku għalina, u r-rekwiżiti tal-memorja ma jippermettux li nużaw il-matriċi ta 'adjaċenza, allura ejja naħsbu dwar kif nistgħu nibdlu l-vettur ta' ħdejna biex issolvi din il-problema. Allura, iċ-ċavetta hija tarf tal-graff, li jista 'jiġi speċifikat bħala par ordnat ta' numri interi. Kif jidher dan? Mhux ċavetta f'firxa assoċjattiva? U, jekk iva, għaliex ma nimplimentahx? Ejja jkollna firxa assoċjattiva fejn kull ċavetta - par ordnat ta 'numri interi - se tkun assoċjata ma' valur - numru sħiħ jew numru reali li jispeċifika l-piż tat-tarf. F'C++, huwa rakkomandabbli li timplimenta din l-istruttura bbażata fuq il-kontenitur std::map (std::map , int> jew std::map , double>), jew std::multimap jekk ikunu mistennija truf multipli. Ukoll, għandna struttura għall-ħażna ta 'grafiċi li tieħu inqas memorja minn strutturi "matriċi", tista' tiddefinixxi graffs b'linji u truf multipli, u lanqas biss għandha rekwiżiti stretti għan-nuqqas ta 'negattività ta' numri tal-vertiċi (ma nafx min għandu bżonn dan, iżda xorta).

4. L-istrutturi tad-dejta huma mimlija, iżda hemm xi ħaġa nieqsa

U huwa veru: meta nsolvu numru ta 'problemi, jista' jkun hemm bżonn li nassenjaw xi karatteristiċi lit-truf tal-graff u, għaldaqstant, naħżnuhom. Jekk huwa possibbli li dawn il-karatteristiċi jitnaqqsu b'mod mhux ambigwu għal numri interi, allura huwa possibbli li jinħażnu tali "graffs b'karatteristiċi addizzjonali" bl-użu ta 'verżjonijiet estiżi tal-vettur ta' adjaċenza u array ta 'adjaċenza assoċjattiva.

Allura, ejjew ikollna graff mhux ippeżat, għal kull tarf li tiegħu huwa meħtieġ li jinħażnu, pereżempju, 2 karatteristiċi addizzjonali speċifikati b'numri interi. F'dan il-każ, huwa possibbli li jiġi definit il-vettur ta' ħdejn xulxin bħala sett ordnat mhux ta' "pari", iżda ta' "kwartitti" ta' numri interi (a[2i], a[2i+1], a[2i+2], a [2i+3]...) , fejn a[2i+2] u a[2i+3] jiddeterminaw il-karatteristiċi tat-tarf korrispondenti. Għal graff b'piżijiet sħaħ tat-truf, l-ordni hija ġeneralment simili (l-unika differenza tkun li l-attributi se jsegwu l-piż tat-tarf u se jiġu speċifikati mill-elementi a[2i+3] u a[2i+4] , u t-tarf innifsu se jkun speċifikat mhux 4, iżda 5 numri ordnati). U għal graff b'piżijiet tat-tarf mhux interi, il-karatteristiċi jistgħu jinkitbu fil-komponent mhux ippeżat tiegħu.

Meta tuża firxa ta 'adjaċenza assoċjattiva għal graffs b'piżijiet tat-tarf integer, huwa possibbli li jiġi speċifikat bħala valur mhux numru wieħed, iżda firxa (vettur) ta' numri li jispeċifikaw, minbarra l-piż ta 'xifer, l-oħra kollha meħtieġa tagħha. karatteristiċi. Fl-istess ħin, inkonvenjenza għall-każ ta 'piżijiet mhux interi se tkun il-ħtieġa li jiġi speċifikat sinjal b'numru b'punt li jvarja (iva, dan huwa inkonvenjent, imma jekk ma jkunx hemm tant sinjali bħal dawn, u jekk inti don. m'għandekx issettjahom wisq "delikata" doppja, allura jista 'jkun xejn). Dan ifisser li f'C++ arrays ta' adjaċenza assoċjattiva estiżi jistgħu jiġu definiti kif ġej: std::map , std::vector> jew std::map , std::vector, li fih l-ewwel valur fil-"key-value-vector" se jkun il-piż tat-tarf, u mbagħad jinsabu d-denominazzjonijiet numeriċi tal-karatteristiċi tiegħu.

Letteratura:

Dwar graffs u algoritmi b'mod ġenerali:

1. Cormen, Thomas H., Leiserson, Charles I., Rivest, Ronald L., Stein, Clifford. Algoritmi: kostruzzjoni u analiżi, it-2 edizzjoni: Trans. mill-Ingliż – M.: Dar tal-Pubblikazzjoni Williams, 2011.
2. Harari Frank. Teorija tal-grafika. M.: Mir, 1973.
Ir-rapport tal-awtur dwar dawn l-istess vettur u firxa assoċjattiva ta' adjaċenzi:
3. Chernoukhov S.A. Vettur ta' adjaċenza u firxa ta' ħdejn assoċjati bħala modi biex tirrappreżenta u taħżen graffs / SA Chernouhov. Vettur ta' ħdejn u mappa ta' ħdejn bħala strutturi tad-dejta biex jirrappreżentaw graff // Ġabra ta 'artikoli tal-Konferenza Xjentifika u Prattika Internazzjonali "Problemi ta' implimentazzjoni tar-riżultati ta 'żviluppi innovattivi u modi biex issolvihom" (Saratov, 14.09.2019 ta' Settembru 2019). – Sterlitamak: AMI, 65, p. 69-XNUMX
Sorsi online utli dwar is-suġġett:
4. prog-cpp.ru/data-graph
5. ejuo.livejournal.com/4518.html

Sors: www.habr.com

Żid kumment