Data zvimiro zvekuchengetedza magirafu: wongororo yearipo uye maviri "angangoita matsva" ayo

Mhoroi munhu wese.

Mune ino chinyorwa, ndakafunga kunyora iwo makuru data zvimiro anoshandiswa kuchengetedza magirafu musainzi yekombuta, uye ini zvakare ndichataura nezve akati wandei mamwe maumbirwo akadaro ayo neimwe nzira "yakandirovedzera" ini.

Saka, ngatitange. Asi kwete kubva pakutanga - ndinofunga isu tese tatoziva kuti girafu chii uye kuti chii (yakatungamirwa, isina kutungamirwa, kuremerwa, isina uremu, ine kana isina mipendero yakawanda uye zvishwe).

Saka, handei. Ndedzipi sarudzo dze data zvimiro zve "graph storage" dzatinadzo?

1. Matrix data zvimiro

1.1 Adjacency matrix. Iyo adjacency matrix ndeye matrix apo mutsara uye mbiru misoro inoenderana nenhamba dzema vertices egirafu, uye kukosha kwechimwe nechimwe chezvinhu zvayo a(i,j) inotarwa nekuvapo kana kusavapo kwemicheto pakati pemavheti. i uye j (zviri pachena kuti kune isina kurongeka girafu yakadaro matrix ichave yakaenzana, kana isu tinogona kubvumirana kuti isu tinochengeta zvese zvakakosha chete pamusoro peiyo diagonal huru). Pamagirafu asina uremu, a(i,j) inogona kuiswa nenhamba yemapendero kubva panai kusvika j (kana pasina mupendero wakadaro, zvino a(i,j)= 0), uye yemagirafu akayerwa, zvakare nehuremu. (huremu hwese) hwemapendero ataurwa.

1.2 Chiitiko matrix. Muchiitiko ichi, girafu yedu inochengetwawo mutafura umo, sekutonga, nhamba dzemutsara dzinoenderana nenhamba dzema vertices ayo, uye nhamba dzekoramu dzinoenderana nemiganhu isati yaverengwa. Kana vertex uye mupendero zvikaitika kune mumwe nemumwe, ipapo kukosha kusiri zero kunonyorwa musero rinoenderana (kune magirafu asina kurongeka, 1 inonyorwa kana vertex uye mupendero zviri chiitiko, kune akatariswa magirafu - "1" kana mupendero. "inobuda" kubva kune vertex uye "-1" kana "inosanganisira" mairi (zviri nyore kuyeuka, nokuti chiratidzo che "minus" chinoratidzika se "chakabatanidzwa" munhamba "-1")). Kune akaremerwa magirafu, zvakare, panzvimbo ye1 uye -1, unogona kutsanangura huremu hwese hwemupendero.

2. Nhamba dze data zvimiro

2.1 Adjacency list. Zvakanaka, zvese zvinoita kunge zviri nyore pano. Imwe neimwe vertex yegirafu inogona, kazhinji, kubatanidzwa nechero chimiro chekuverenga (rondedzero, vector, array, ...), iyo inochengetedza nhamba dzemavertices ese ari padhuze neakapihwa. Kune magirafu akatungamirwa, isu tichawedzera kune yakadaro rondedzero chete iwo mavertices ane "anotungamirwa" mupendero kubva kune chimiro vertex. Kune akaremerwa magirafu kuita kunenge kwakaoma.

2.2 Rondedzero yembabvu. Yakanyanya kufarirwa data chimiro. Rondedzero yemapendero, sezvatinoudzwa naCaptain Obviousness, irwo runyoro rwemipendero yegirafu, imwe neimwe inotsanangurwa neinotangira vertex, iyo yekupedzisira vertex (kune magirafu asina kurongeka, kurongeka hakuna kukosha pano, kunyangwe pakubatana unogona. shandisa mitemo yakasiyana-siyana, semuenzaniso, kutsanangura vertices kuitira kuwedzera) uye uremu (kune uremu hwegirafu chete).

Iwe unogona kutarisa pane matrix rondedzero akanyorwa pamusoro zvakadzama (uye nemifananidzo), semuenzaniso, pano.

2.3 Adjacency array. Kwete chimiro chakajairika. Pakati payo, imhando ye "kurongedza" adjacency rondedzero mune imwe enumeration chimiro (array, vector). Yekutanga n (maererano nenhamba ye vertices yegirafu) zvinhu zvemutsetse wakadaro zvine matangiro ekutanga emutsetse wakafanana, kutangira papi mavertices ese aripadhuze neakapihwa anonyorwa mumutsara.

Pano ndakawana inonzwisisika (pachangu) tsananguro: ejuo.livejournal.com/4518.html

3. Adjacency Vector uye Associative Adjacency Array

Zvakazoitika kuti munyori wemitsara iyi, asiri mugadziri wehunyanzvi, asi aigara achibata magirafu, kazhinji aibata nemazita emapendero. Chokwadi, zviri nyore kana girafu iine akawanda zvishwe nemapendero. Uye saka, mukuvandudza mazita echinyakare emapendero, ini ndinokurudzira kutarisisa kune yavo "budiriro / bazi / gadziriso / shanduko", iyo: iyo adjacency vector uye associative adjacency array.

3.1 Adjacency vector

Nyaya (a1): isina uremu girafu

Tichadaidza adjacency vector yegirafu isina uremu seti yakaodha yenhamba dzakaenzana (a[2i], a[2i+1],..., painoverengwa c 0), umo nhamba imwe neimwe yenhamba. is a[2i], a[2i+1] inotsanangura mupendero wegirafu pakati pemavertices a[2i] na[2i+1], zvichiteerana.
Iyi fomati yekurekodha haina ruzivo rwekuti girafu inotungamirwa (zvose zviri zviviri zvinogoneka). Paunenge uchishandisa iyo digraph fomati, mupendero unofungidzirwa kuti unotungamirwa kubva ku[2i] kuenda ku[2i + 1]. Pano uye pazasi: kune magirafu asina kutungamirwa, kana zvichidikanwa, zvinodiwa zvekurongeka kwekurekodha vertices zvinogona kushandiswa (somuenzaniso, iyo vertex ine kukosha kwakaderera kwenhamba yakapihwa iyo inouya kutanga).

MuC ++, zvinokurudzirwa kudoma adjacency vector uchishandisa std::vector, saka zita reiyo data data.

Nyaya (a2): isina uremu girafu, kumucheto uremu ari integer

Nekufananidza nekesi (a1), tinodaidza iyo adjacency vector yegirafu yakayerwa ine uremu hwakakwana seti yakarongedzerwa (dynamic array) yenhamba (a[3i], a[3i+1], a[3i+2], ..., pandinoverengerwa c 0), apo “katatu” kwenhamba imwe neimwe a[3i], a[3i+1], a[3i+2] inotsanangura mupendero wegirafu pakati pemavertice ane nhamba a[3i] uye a[3i+1], zvichiteerana, uye kukosha kwe [3i+2] uremu hwemupendero uyu. Girafu yakadaro inogona zvakare kutungamirwa kana kusadaro.

Nyaya (b): isina uremu girafu, asiri-integer edge uremu

Sezvo zvisingabviri kuchengetedza heterogeneous zvinhu mune imwe array (vector), semuenzaniso, kutevedzera kunotevera kunogoneka. Girafu inochengetwa mune maviri mavheji, mune yekutanga vector iri graph's adjacency vector pasina kutsanangura huremu, uye yechipiri vheji ine huremu hunoenderana (zvinogoneka kuita C++: std:: pair ) Saka, kumucheto kunotsanangurwa nepeya ye vertices pasi pe indexes 2i, 2i + 1 yevheti yekutanga, uremu huchafanana nechinhu chiri pasi pe index i yechipiri vector.

Zvakanaka, nei izvi zvichidikanwa?

Zvakanaka, munyori wemitsara iyi akaona zvichibatsira pakugadzirisa akati wandei matambudziko. Zvakanaka, kubva pakuona kwemaitiro, pachave nemabhenefiti anotevera:

  • Iyo yepedyo vector, senge chero imwe "yekuverengera" chimiro, yakanyatso compact, inotora ndangariro shoma pane yepedyo matrix (ye sparse graph), uye iri nyore kuita.
  • Mavertices egirafu, mumusimboti, anogonawo kucherechedzwa nenhamba dzisina kunaka. Zvakadini kana “kutsveyamisa” kwakadaro kuchidikanwa?
  • Magirafu anogona kunge aine mipendero yakawanda uye akawanda zvishwe, ane uremu hwakasiyana (zvakanaka, zvakaipa, kunyange zero). Hapana zvirambidzo pano.
  • Iwe unogona zvakare kugovera akasiyana zvivakwa kumapendero - asi kune zvimwe pane izvo, ona chikamu 4.

Nekudaro, zvinofanirwa kubvumwa kuti iyi "rondedzero" hairevi kukurumidza kusvika kumucheto. Uye pano iyo Associative Adjacency Array inouya kuzonunura, iyo inokurukurwa pazasi.

3.2 Associative adjacency array

Saka, kana kuwana kune imwe mucheto, uremu hwayo uye zvimwe zvinhu zvakakosha kwatiri, uye zvinodiwa zvekuyeuka hazvitibvumiri kushandisa matrix adjacency, saka ngatifungei pamusoro pekuti tingashandura sei vector yepedyo kugadzirisa dambudziko iri. Saka, kiyi ndeyekumucheto kwegirafu, iyo inogona kutsanangurwa seyakarongedzerwa nhamba dzenhamba. Izvi zvinotaridzika sei? Haisi kiyi mune asociative array here? Uye, kana zvakadaro, sei isu tisingazvishandisi? Ngativei neasociative array apo kiyi yega yega - maviri akaodha emanhamba - achabatanidzwa neukoshi - nhamba yakakwana kana nhamba chaiyo inotsanangura huremu hwemupendero. MuC++, zvinokurudzirwa kushandisa chimiro ichi zvichibva pane std::mepu mudziyo (std::mepu. , int> kana std::mepu , kaviri>), kana std::multimap kana mipendero yakawanda ichitarisirwa. Zvakanaka, isu tine chimiro chekuchengeta magirafu anotora ndangariro shoma pane "matrix" zvimiro, anogona kutsanangura magirafu ane akawanda zvishwe uye mipendero, uye haina kana zvakaomesesa zvinodikanwa zvekusava negativity yenhamba dzevertex (ini handizive. ndiani anoda izvi, asi zvakadaro).

4. Zvinyorwa zvinyorwa zvizere, asi chimwe chinhu chisipo

Uye ichokwadi: pakugadzirisa akati wandei matambudziko, isu tingangoda kugovera mamwe maitiro kumicheto yegirafu uye, saizvozvo, chengetedza. Kana zvichikwanisika kudzikisira zvisina tsarukano izvi zvimiro kusvika kunhamba, saka zvinokwanisika kuchengetedza "magirafu ane mamwe maficha" uchishandisa akawedzera mavhezheni eiyo adjacency vector uye associative adjacency array.

Saka, ngativei negirafu risina uremu, pamucheto wega wega waunoda kuchengeta, semuenzaniso, 2 mamwe maitiro anotsanangurwa neintegers. Muchiitiko ichi, zvinogoneka kutsanangura vheji yayo yepedyo seti yakarairwa kwete ye "vaviri", asi ye "quartets" yenhamba (a[2i], a[2i+1], a[2i+2], a [2i+3]…) , apo a[2i+2] uye [2i+3] zvicharatidza maitiro emupendero unoenderana. Kune girafu rine huremu hwakakwana hwemipendero, kurongeka kunowanzofanana (mutsauko chete uchange uri wekuti hunhu hunotevera huremu hwemupendero uye huchatsanangurwa nezvinhu a[2i+3] uye [2i+4] , uye mupendero pachawo uchatsanangurwa kwete 4, asi 5 nhamba dzakarongedzerwa). Uye kune girafu ine-integer edge uremu, maficha anogona kunyorwa muchikamu chayo chisina uremu.

Paunenge uchishandisa associative adjacency array yemagirafu ane integer edge huremu, zvinokwanisika kutsanangura semutengo kwete nhamba imwe chete, asi rondedzero (vector) yenhamba dzinotsanangura, kuwedzera kune huremu hwemupendero, zvimwe zvese zvinodiwa. features. Panguva imwecheteyo, kusagadzikana kwenyaya yeasiri-integer uremu kuchave kudikanwa kwekutsanangura chiratidzo chine inoyangarara nhamba yenhamba (hongu, izvi zvinokanganisa, asi kana pasina akawanda akadaro zviratidzo, uye kana iwe usingaite. 'Musavaisawo "inonyengera" kaviri, saka zvingasava chinhu) . Izvi zvinoreva kuti muC++ yakawedzera mubatanidzwa arrays anogona kutsanangurwa seizvi: std::mepu. , std::vector> kana std::mepu , std :: vector, umo kukosha kwekutanga mu "key-value-vector" ichava uremu hwemucheto, uye ipapo mazita enhamba yemaitiro ayo anowanikwa.

Mabhuku:

Nezve magirafu uye algorithms zvakajairika:

1. Cormen, Thomas H., Leiserson, Charles I., Rivest, Ronald L., Stein, Clifford. Algorithms: kuvaka uye kuongorora, 2nd edition: Trans. kubva kuChirungu - M.: Williams Publishing House, 2011.
2. Harari Frank. Girafu dzidziso. M.: Mir, 1973.
Chirevo chemunyori nezve aya mavheti mamwechete uye asociative array ye adjacencies:
3. Chernoukhov S.A. Adjacency vector uye associative adjacency array senzira dzekumiririra uye kuchengeta magirafu / SA Chernouhov. Adjacency vector uye mepu yepedyo se data zvimiro zvekumiririra girafu // Kuunganidzwa kwezvinyorwa zveInternational Sayenzi uye Inoshanda Musangano "Matambudziko ekuita mhedzisiro yekuvandudza budiriro uye nzira dzekuagadzirisa" (Saratov, Gunyana 14.09.2019, 2019). -Sterlitamak: AMI, 65, p. 69-XNUMX
Zvishandiso zvepamhepo zvinobatsira pane iyo nyaya:
4. prog-cpp.ru/data-graph
5. ejuo.livejournal.com/4518.html

Source: www.habr.com

Voeg