Data structurae pro repono graphs: recensio entium et duo "fere nova" sunt

Omnis salve.

Hac nota, praecipuas notitias structuras in reponendas graphas in computatrum scientia enumerare decrevi, et etiam loqui de duobus structuris quae mihi aliquo modo "crystallized" sunt.

Incipiamus igitur. Sed non ab ipso initio - Omnes enim iam novimus quid lacinia sit et quid sint (directa, indirecta, ponderata, sine pondere, sine oras et ansulas multiplices).

Eamus igitur. Quae optiones pro data structurae pro "graphis repono" habemus?

1. Matrix notitia structurae

1.1 Matricas adiacentia. Matrix adiacentia est matrix, ubi versuum et columnarum capita respondent numeris verticerum graphi, et valor singulorum elementorum a(i,j) determinatur praesentia vel absentia marginum inter vertices. i et j (patet pro graphe indirecto talem matricem esse symmetricam, vel consentire possumus omnes valores tantum supra diametrum principalem condimus). Nam graphi non sunt ponderati, a(i,j) numero marginum ab i ad j constitui possunt (si nulla talis extremitas est, tum a(i,j)=0), et pro graphis ponderatis tum pondere. (Summa pondus) praefatae oras.

1.2 Incidentiam matricis. In hoc casu etiam grapha nostra reponitur in tabula, in qua numeri versuum fere respondent numerorum verticerum, et columnae numeris orae praenumeratis respondent. Si vertex et margo inter se incident, tunc valor non nullus in cellula respondenti (pro graphe indirecta, 1 scriptum est si vertex et margo incidant, pro ordinantur - "1" si marg. exitus a vertice et -1, si "includit" in eo (facile est meminisse, quia "minus" signum etiam in numero "-1") videtur inclusum esse). Pro graphis praegravibus, iterum pro 1 et -1, totum pondus oris exprimere potes.

2. Enumeratio notitia structurae

2.1 Adiacentia enumeratio. Bene hic omnia simplicia esse videntur. Quaelibet graphi vertex in universum coniungi potest cum quavis enumeratione structurae (album, vectoris, ordinatae ...), quae numeros omnium verticerum uni dato adiacentium congregabit. Pro graphis directis, tali indice solum vertices illos addimus, quibus a pluma vertexis ora directa est. Nam graphs praegravis exsecutio magis implicata erit.

2.2 Indicem costarum. Vulgaris notitia satis structurae. Elenchus orarum, ut Praefectus Obviorum monet, re vera est index orarum graphi, quarum singulae a vertice incipiente specificantur, vertex desinentis (nam graphorum indirecta ordo hic non refert, licet ad unitatem potes. variis regulis utere, exempli gratia, vertices in crescendo denotans) et pondus (pro graphis tantum gravatis).

Inspicere potes matrix indices supra fusius enumeratos (et cum illustrationibus), v.gr. hic.

2.3 Adiacentia ordinata. Non frequentissima structura. In suo nucleo, forma adiacentis tabulae "stipare" in unam enumerationem structuram (ordinata, vector). Prima n (secundum numerum verticerum graphi) elementorum talium ordinatarum continent indices initiorum eiusdem ordinatae, ex quibus omnes vertices dato adiacentes ordine scribuntur.

Hic inveni notissimam explicationem; ejuo.livejournal.com/4518.html

3. Adiacentia Vector et Associative Adiacentia Forum

Evenit ut auctor harum linearum, non programmator professionalis, sed qui periodice graphas tractavit, saepissime de tabulis marginibus tractavit. Immo commodum est si grapha plures habeat ansas et oras. Itaque in evolutione classicorum orarum indices operam dare propono eorum "progressio/bran/modificationis/mutationis", scilicet: vectoris adiacentii et ordinata adiacentia adiacentia.

3.1 Adiacentia vector

Causa (a1): graph

Appellabimus adiacentia vectorem in graphi non ponderis graphi ordinati numeri integri (a[2i], a[2i+1],...., ubi numeratur c 0 i), in quo singulae par numerorum. est a[2i], a[2i+1 ] graphi marginis speciem inter vertices a[2i] et a[2i+1], respective.
Haec forma recordationis non refert informationes circa an graph directa sit (ambo bene possibilia sunt). Cum forma digraphia adhibita, ora ab a[2i] ad a[2i+1] dirigenda censetur. Hic et infra: nam graphae indirectae, si opus est, requiruntur ad ordinem vertices recordationis applicari possunt (exempli gratia, quod vertex minore valore numeri assignati praecedit).

In C++, adiacentia vectoris uti std ::vector denotare convenit, unde nomen huius notae structurae.

Casus (a2): graphi sine pondere, in margine gravia sunt integra

Per analogiam cum casu (a1), vocamus vectorem adjacentiam pro grapho ponderato cum ore integro ponderato numerorum (a[3i], a[3i+1], ordinatorum ponderum (a[3i]], a[2i+0]; ..., ubi i numeratur c 3), ubi quilibet "tripletus" numerorum a[3i], a[1i+3], a[2i+3] designat marginem graphi inter vertices numeratos a[3i] et a[1i+3] respective, et valor a [2i+XNUMX] est pondus hujus ori. Etiam lacinia purus vel nulla dictum vel.

Casus (b): Aliquam lacinia purus sine pondere, non integer ore ponderum

Cum impossibile sit elementa heterogenea in uno ordine condere (vector), exempli gratia, haec exsecutio fieri potest. Graphium repositum est in duobus vectoribus, in quo primus vector est graphi adiacentia vectoris sine ponderibus specificatis, et secundus vector continet pondera correspondentia (activum possibile pro C++: std :: par ). Sic, pro margine per binos vertices sub indicibus 2i, 2i+1 definito vectoris primi, pondus aequale erit elemento sub indice i vectoris secundi.

Hem, quid hoc opus est?

Bene, auctor harum versuum satis utilem invenit problemata solvenda. Ex formali autem sententia erunt sequentia commoda;

  • Vector adiacentia, sicut quaelibet alia structura "enumerativa", satis compacta est, minus memoriam quam adiacentia matricis (pro graphis sparsis), et faciliter ad efficiendum.
  • Vertices graphi in principio etiam numeris negativis notari possunt. Quid si talis perversio necessaria est?
  • Graphii plures oras et plures ansas continere possunt, cum ponderibus diversis (positivis, negativis, etiam positis). Hic restrictiones nullae sunt.
  • Possis etiam varias proprietates marginibus assignare - sed de eo plura vide sectionem IV.

Attamen fatendum est hoc "album" non cito ad marginem accedere. Hic autem succurrit Associativa Adiacentia Array, de qua infra.

3.2 Associative adiacentia ordinata

Si igitur accessus ad marginem specificum, eius pondus et aliae proprietates criticae nobis sunt, et memoria requisita non sinunt nos uti matrice adiacentiis, tunc cogitemus quomodo vector adiacentiam mutare possit ad hanc problema solvendam. Ita, clavis est extremitas graphi, quae tamquam par ordinatus integrorum specificari potest. Quid hoc simile? Nonne clavis est in ordine associabili? Et, si ita est, cur non illud efficimus? Ordinationem associativam habeamus ubi quaeque clavis - par ordinatae integris - associatur valore - integer vel verus numerus qui specificat extremitatis pondus. In C++, expedit ut structuram hanc efficias ex std ::mappa continentis (std ::map. , int> or std ::map , duplum, vel std::multimap, si plures margines desiderantur. Bene habemus structuram grapharum recondendarum quae minus memoriam capiunt quam "matrix" structurae, graphas multiplicibus ansulis et marginibus definire potest, nec etiam stricte requisita ad numerum vertex non-negativum (nescio nescio. qui hoc indiget, sed tamen).

4. Data structurae plenae sunt, sed aliquid deest

Verum est: cum plures difficultates solvendo, notas nonnullas in graphio assignare et proinde eas reponere necesse est. Si potest sine ambiguitate has notas ad integros reducere, tunc possibile est tales "graphas cum notis additis" uti versiones extensae vectoris adiacentis et ordinatae adiacentis adiacentis.

Habeamus igitur graphium sine pondere, cuius ad utramque partem necesse est condere, exempli gratia, 2 lineamenta additamenta ab integris specificata. Quo in casu, adiacentia vector ordinati non "jugorum", sed "quadratorum" integri (a[2i], a[2i+1], a. [2i+2]…) , ubi a[2i+3] et a[2i+2] notas ora respondentis determinabit. Pro graphe integris ponderibus marginum, ordo fere similis est (sola erit differentia, quod attributa sequantur gravitatem hore, et ab elementis a[2i+3] et a[2i+3] sequentur. et ipse margo non 2 sed 4 numeri ordinati denotabuntur. Et pro graphe cum ponderibus non integris in margine, lineamenta in non pondus suum scribi possunt.

Cum adhibita adiacentia adiacentia ordinata ad graphas cum ponderibus integris marginem, definire potest ut valorem non unum numerum, sed ordinatam numerorum qui specificant, praeter pondus crepidinis, omnia alia necessaria. lineamentis. Eodem tempore incommodum erit pro ponderibus non integris signum cum fluctuetur numero (sic, hoc incommodum est, sed si tot non sint talia signa, et si induas. ' t ' eas quoque ' fallacias ' duplum , tunc forte nihil est . Id quod in C++ adiacentia adiacentiae extensa vestit potest definiri sic: std :: map , std ::vector> vel std ::map , std::vector, in quo prima valor in "clavis-vector" pondus extremitatis erit, ac deinde notationes numerales suarum notarum collocantur.

Litterae:

De graphis et algorithmis in genere:

1. Cormen, Thomas H., Leiserson, Charles I., Rivest, Ronald L., Stein, Clifford. Algorithmus: constructio et analysis, editio 2a: Trans. ex Anglica - M.: Williams Publishing House, MMXI.
2. Harari Frank. Aliquam lacinia purus theoria. M.: Mir, 1973.
Auctoris relatio de iisdem vectoribus et associativis adiacentium ordinata:
3. Chernoukhov S.A. Adiacentia vector et adiacentia adiacentia ordinata sicut vias ad repraesentandum et reponunt graphs / SA Chernouhov. Adiacentia vector et adiacentia map as notitia structurae ad repraesentandum graph // Collection of articles of the International Scientific and Practical Conference "Problemata exsequendi proventus evolutionis et viae ad eas solvendas" (Saratov, die 14.09.2019 Septembris 2019). – Sterlitamak: AMI, 65, p. 69-XNUMX
Utile est fontes online in re:
4. prog-cpp.ru/data-graph
5. ejuo.livejournal.com/4518.html

Source: www.habr.com

Add a comment