Datestrukture fir Grafiken ze späicheren: Iwwerpréiwung vun existéierenden an zwee "bal nei".

Salut alleguer.

An dëser Notiz hunn ech beschloss d'Haaptdatenstrukturen ze lëschten déi benotzt gi fir Grafiken an der Informatik ze späicheren, an ech wäert och iwwer e puer méi esou Strukturen schwätzen déi iergendwéi fir mech "kristalliséiert" hunn.

Also, loosst eis ufänken. Awer net vun Ufank un - ech mengen datt mir all scho wësse wat eng Grafik ass a wat se sinn (directed, ondirected, weighted, unweighted, with or without multiple edges and loops).

Also, loosst eis goen. Wéi eng Optioune fir Datestrukture fir "Grafiklagerung" hu mir?

1. Matrixentgasung Daten Strukturen

1.1 Noperschaft Matrixentgasung. D'Adjacency Matrix ass eng Matrix wou d'Zeilen an d'Kolonn Rubriken d'Zuelen vun de Wirbelen vun der Grafik entspriechen, an de Wäert vun all eenzel vun hiren Elementer a (i, j) gëtt duerch d'Präsenz oder d'Feele vu Kanten tëscht Wirbelen bestëmmt. i an j (et ass kloer datt fir eng ongeriicht Grafik sou eng Matrix symmetresch ass, oder mir kënnen averstane sinn datt mir all Wäerter nëmmen iwwer der Haaptdiagonal späicheren). Fir ongewiicht Grafike kann a(i,j) duerch d'Zuel vun de Kanten vun i bis j festgeluegt ginn (wann et keng esou Rand ass, dann a(i,j)= 0), a fir gewiichtte Grafike och duerch d'Gewiicht (Gesamtgewiicht) vun den ernimmten Kanten.

1.2 Heefegkeet Matrixentgasung. An dësem Fall ass eis Grafik och an enger Tabell gespäichert, an där d'Zeilennummeren an der Regel mat den Zuelen vu senge Wirbelen entspriechen, an d'Kolonnnummeren entspriechen de virnummeréierte Kanten. Wann e Wirt an e Rand openee fällt, da gëtt en net-Nullwäert an der entspriechender Zell geschriwwe (fir ongeriicht Grafike gëtt 1 geschriwwe wann d'Wirpunkt an de Rand Tëschefall sinn, fir orientéiert - "1" wann de Rand "Erausgoen" aus der Wirbelsäit an "-1" wann et "abegraff" an et (et ass einfach genuch ze erënneren, well de "Minus" Zeechen och schéngt "abegraff" an der Zuel "-1")). Fir gewiicht Grafiken, erëm, amplaz 1 an -1, kënnt Dir d'Gesamtgewiicht vum Rand uginn.

2. Opzielung Daten Strukturen

2.1 Adjacence Lëscht. Gutt, alles schéngt hei einfach ze sinn. All Wirbel vun der Grafik kann allgemeng mat all Opzielungsstruktur (Lëscht, Vecteure, Array, ...) verbonne sinn, déi d'Zuelen vun all Wirbelen niewent dem bestëmmte späicheren. Fir geriicht Grafike wäerte mir zu sou enger Lëscht nëmmen déi Wirbelen addéieren, op déi et e "direkten" Rand vun engem Feature-Vertex gëtt. Fir gewiichtte Grafike wäert d'Ëmsetzung méi komplex sinn.

2.2 Lëscht vun de Rippen. Ganz populär daten Struktur. D'Lëscht vun de Kanten, wéi de Captain Obviousness eis seet, ass tatsächlech eng Lëscht vun de Kante vun der Grafik, déi jidderee vum Startwirt spezifizéiert ass, den Endpunkt (fir ongeriicht Grafiken ass d'Uerdnung hei net wichteg, och wann Dir fir d'Vereenegung kënnt benotzt verschidde Regelen, zum Beispill d'Spezifikatioun vun de Wirbelen an Uerdnung ze erhéijen) a Gewiicht (nëmme fir gewiicht Grafike).

Dir kënnt d'Matrixlëscht hei uewen méi detailléiert kucken (a mat Illustratiounen), zum Beispill, hei.

2.3 Adjacency Array. Net déi allgemeng Struktur. Am Kär ass et eng Form fir Adjacenzlëschten an eng Enumeratiounsstruktur (Array, Vektor) ze "packen". Déi éischt n (no der Unzuel vun de Wirbelen vun der Grafik) Elementer vun esou enger Array enthalen d'Startindexe vun der selwechter Array, vu wou all Wirbelen niewent dem bestëmmten an enger Zeil geschriwwe sinn.

Hei hunn ech déi verständlechst (fir mech selwer) Erklärung fonnt: ejuo.livejournal.com/4518.html

3. Adjacency Vector an Associativ Adjacency Array

Et huet sech erausgestallt datt den Auteur vun dësen Zeilen, net e professionnelle Programméierer, awer periodesch mat Grafike beschäftegt ass, meeschtens mat Kantelëschte beschäftegt. Tatsächlech ass et bequem wann d'Grafik verschidde Schleifen a Kanten huet. An dofir, an der Entwécklung vun de klassesche Kantenlëschten, proposéieren ech op hir "Entwécklung / Branche / Modifikatioun / Mutatioun" opmierksam ze maachen, nämlech: den Adjacenzvektor an den assoziativen Adjacency Array.

3.1 Adjacency Vektor

Fall (a1): ongewiicht Graf

Mir nennen en Adjacencyvektor fir eng ongewiicht Grafik e bestallte Set vun enger gläicher Zuel vun ganz Zuelen (a[2i], a[2i+1],..., wou i nummeréiert ass c 0), an deem all Pair vun Zuelen ass a[2i], a[2i+1] spezifizéiert eng Grafikrand tëscht den Wirbelen a[2i] respektiv a[2i+1].
Dësen Opnamformat enthält keng Informatioun iwwer ob d'Grafik geriicht ass (béid Optioune si méiglech). Wann Dir d'Digraph Format benotzt, gëtt de Rand ugesinn als geriicht vun a[2i] op a[2i+1]. Hei an ënnen: fir onorientéiert Grafiken, wann néideg, Ufuerderunge fir d'Uerdnung vun den Opnamwirbelen kënnen ugewannt ginn (zum Beispill datt de Wirtpunkt mat dem nidderegen Wäert vun der Zuel, déi him zougewisen ass, als éischt kënnt).

Am C ++ ass et unzeroden en Adjacencyvektor ze spezifizéieren mat std :: Vector, dohier den Numm vun dëser Datestruktur.

Fall (a2): ongewiicht Grafik, Randgewichte sinn ganz Zuelen

An Analogie mam Fall (a1), nenne mir den Adjacenzvektor fir eng gewiicht Grafik mat ganzer Randgewiicht eng bestallt Set (dynamesch Array) vun Zuelen (a[3i], a[3i+1], a[3i+2], ..., wou i nummeréiert ass c 0), wou all "Trippel" vun Zuelen a[3i], a[3i+1], a[3i+2] e Rand vun der Grafik tëscht Wirbelen nummeréiert a[3i] spezifizéiert an a[3i+1], respektiv, an de Wäert a [3i+2] ass d'Gewiicht vun dëser Rand. Esou eng Grafik kann och entweder geriicht ginn oder net.

Fall (b): ongewiichtte Grafik, net ganz Zuelen Randgewichten

Well et onméiglech ass heterogen Elementer an engem Array (Vektor) ze späicheren, zum Beispill, ass déi folgend Ëmsetzung méiglech. D'Grafik gëtt an e Pair vu Vecteure gespäichert, an deem den éischte Vektor den Nopeschvektor vun der Grafik ass ouni d'Gewiichter ze spezifizéieren, an den zweete Vektor enthält déi entspriechend Gewiichter (méiglech Implementatioun fir C++: std::pair ). Also, fir e Rand definéiert duerch e Paar Wirbelen ënner Indexen 2i, 2i+1 vum éischte Vecteur, wäert d'Gewiicht gläich sinn wéi d'Element ënner Index i vum zweete Vektor.

Gutt, firwat ass dat néideg?

Gutt, den Auteur vun dëse Linnen huet et ganz nëtzlech fonnt fir eng Rei vu Probleemer ze léisen. Gutt, aus enger formell Siicht ginn et déi folgend Virdeeler:

  • Den Adjacencyvektor, wéi all aner "enumerativ" Struktur, ass relativ kompakt, hëlt manner Erënnerung op wéi d'Adjacency Matrix (fir spatzen Grafiken), an ass relativ einfach ze implementéieren.
  • D'Wierder vun der Grafik kënnen am Prinzip och mat negativen Zuelen markéiert ginn. Wat wann esou eng "Perversioun" gebraucht gëtt?
  • Grafike kënne verschidde Kanten a verschidde Schleifen enthalen, mat verschiddene Gewiichter (positiv, negativ, souguer Null). Et gi keng Restriktiounen hei.
  • Dir kënnt och verschidden Eegeschafte u Kanten zouginn - awer fir méi doriwwer, kuckt Sektioun 4.

Wéi och ëmmer, et muss zouginn datt dës "Lëscht" kee séieren Zougang zum Rand bedeit. An hei kënnt d'Associative Adjacency Array zur Rettung, déi hei ënnen diskutéiert gëtt.

3.2 Associativ Adjacency Array

Also, wann den Zougang zu engem spezifesche Rand, säi Gewiicht an aner Eegeschafte fir eis kritesch ass, an d'Erënnerungsfuerderunge erlaben eis net d'Adjacency Matrix ze benotzen, da loosst eis nodenken wéi mir den Adjacency Vektor änneren kënnen fir dëse Problem ze léisen. Also, de Schlëssel ass e Rand vun der Grafik, déi als bestallt Pair vun ganz Zuelen spezifizéiert ka ginn. Wéi gesäit dat aus? Ass et net e Schlëssel an engem assoziativen Array? A wa jo, firwat maache mir et net ëm? Loosst eis eng assoziativ Array hunn, wou all Schlëssel - e bestallt Pair vun ganz Zuelen - mat engem Wäert assoziéiert ass - eng ganz Zuel oder eng reell Zuel déi d'Gewiicht vum Rand spezifizéiert. An C++ ass et unzeroden dës Struktur op Basis vum std::map Container (std::map) ëmzesetzen , int> oder std::map , duebel>), oder std::multimap wa verschidde Kanten erwaart ginn. Gutt, mir hunn eng Struktur fir Grafiken ze späicheren, déi manner Erënnerung ophëlt wéi "Matrix" Strukturen, Grafike mat multiple Schleifen a Kanten definéiere kënnen, an net emol strikt Ufuerderunge fir d'Net-Negativitéit vun de Vertexnummeren hunn (ech weess et net). wien brauch dat, awer trotzdem).

4. Datestrukture si voll, awer eppes feelt

An et ass richteg: wann Dir eng Rei vu Probleemer léist, musse mir vläicht e puer Charakteristiken un d'Kante vun der Grafik zouginn an deementspriechend se späicheren. Wann et méiglech ass dës Fonctiounen eendeiteg op ganz Zuelen ze reduzéieren, ass et méiglech sou "Grafike mat zousätzlech Funktiounen" ze späicheren mat erweiderten Versioune vum Adjacencyvektor an assoziativen Adjacency Array.

Also, loosst eis eng ongewiicht Grafik hunn, fir all Rand vun deem et néideg ass ze späicheren, zum Beispill, 2 zousätzlech Funktiounen, déi duerch ganz Zuelen spezifizéiert sinn. An dësem Fall ass et méiglech seng Adjacenzvektor als e bestallten Set net vu "Pairen" ze definéieren, mee vu "Quartetten" vun ganz Zuelen (a[2i], a[2i+1], a[2i+2], a [2i+3]...), wou a[2i+2] an a[2i+3] d'Charakteristike vun der entspriechender Rand bestëmmen. Fir eng Grafik mat ganz Zuelengewichte vu Kanten ass d'Uerdnung allgemeng ähnlech (deen eenzegen Ënnerscheed ass datt d'Attributer d'Gewiicht vum Rand folgen an duerch d'Elementer a[2i+3] an a[2i+4] spezifizéiert ginn. , an de Rand selwer gëtt net 4 spezifizéiert, mee 5 bestallt Zuelen). A fir eng Grafik mat net ganz Zuelen Randgewichte kënnen d'Features a seng ongewiichtte Komponent geschriwwe ginn.

Wann Dir en assoziativen Adjacency-Array fir Grafike mat ganzer Randgewiicht benotzt, ass et méiglech, als Wäert net eng eenzeg Zuel ze spezifizéieren, mee en Array (Vektor) vun Zuelen, déi nieft dem Gewiicht vun engem Rand all seng aner noutwendeg spezifizéieren. Eegeschaften. Zur selwechter Zäit ass en Nodeel fir de Fall vun net ganz Zuelen Gewiichter de Besoin fir e Schëld mat enger schwiewend Punktnummer ze spezifizéieren (jo, dëst ass en Onbequemlechkeet, awer wann et net sou vill sou Schëlder gëtt, a wann Dir net Setzt se net ze "komplizéiert" duebel, da kann et näischt sinn). Dëst bedeit datt an C ++ verlängert assoziativ Adjacency Arrays wéi follegt definéiert kënne ginn: std :: map , std::vector> oder std::map , std :: Vektor, an deem den éischte Wäert am "Schlësselwäert-Vektor" d'Gewiicht vum Rand ass, an da sinn d'numeresch Bezeechnunge vu senge Charakteristiken.

Referenzen:

Iwwer Grafiken an Algorithmen am Allgemengen:

1. Cormen, Thomas H., Leiserson, Charles I., Rivest, Ronald L., Stein, Clifford. Algorithmen: Konstruktioun an Analyse, 2. Editioun: Trans. aus Englesch – M.: Williams Publishing House, 2011.
2. Harari Frank. Graftheorie. M.: Mir, 1973.
Dem Auteur säi Bericht iwwer dës selwescht Vektor an assoziativ Array vun Adjacencies:
3. Chernoukhov S.A. Adjacency Vecteure an assoziativ adjacency Array als Weeër fir Grafiken ze vertrieden an ze späicheren / SA Chernouhov. Adjacency Vecteure an Adjacency Kaart als Datestrukture fir eng Grafik ze representéieren // Sammlung vun Artikelen vun der Internationaler Wëssenschaftlech a Praktesch Konferenz "Problemer vun der Ëmsetzung vun de Resultater vun innovativen Entwécklungen a Weeër fir se ze léisen" (Saratov, September 14.09.2019, 2019). – Sterlitamak: AMI, 65, p. 69-XNUMX
Nëtzlech Online Quellen zum Thema:
4. prog-cpp.ru/data-graph
5. ejuo.livejournal.com/4518.html

Source: will.com

Setzt e Commentaire