Struktur data pikeun nyimpen grafik: tinjauan anu aya sareng dua anu "ampir anyar".

Sampurasun sadayana.

Dina catetan ieu, kuring mutuskeun pikeun daptar struktur data utama dipaké pikeun nyimpen grafik dina elmu komputer, sarta kuring ogé bakal ngobrol ngeunaan sababaraha leuwih struktur sapertos nu kumaha bae "crystallized" keur kuring.

Ku kituna, hayu urang mimitian. Tapi teu ti mimiti pisan - Jigana urang sadayana geus nyaho naon grafik na naon aranjeunna (diarahkeun, undirected, weighted, unweighted, kalawan atawa tanpa sababaraha edges na loop).

Ku kituna, hayu urang balik. Pilihan naon pikeun struktur data pikeun "panyimpenan grafik" urang gaduh?

1. Struktur data matriks

1.1 Matriks Adjacency. Matriks adjacency nyaéta matriks dimana judul baris sareng kolom pakait sareng jumlah titik-titik dina grafik, sareng nilai unggal unsurna a(i,j) ditangtukeun ku ayana atanapi henteuna sisi-sisi antara titik-titik. i sareng j (écés yén pikeun grafik anu teu diarahkeun matriks sapertos kitu bakal simetris, atanapi urang tiasa satuju yén urang nyimpen sadaya nilai ngan ukur di luhur diagonal utama). Pikeun grafik anu teu kabeurat, a(i,j) tiasa diatur ku jumlah sisi ti i ka j (upami teu aya ujung sapertos kitu, maka a(i,j)= 0), sareng pikeun grafik anu beurat, ogé ku beurat. (total beurat) tina edges disebutkeun.

1.2 Matriks kajadian. Dina hal ieu, grafik urang ogé disimpen dina tabel nu, sakumaha aturan, nomer baris pakait jeung angka tina vertices na, sarta nomer kolom pakait edges pre-nomer. Lamun hiji vertex jeung hiji sisi téh kajadian jeung hiji sarua séjén, nilai non-enol ditulis dina sél pakait (pikeun grafik teu diarahkeun, 1 ditulis lamun vertex jeung tepi téh kajadian, pikeun grafik berorientasi - "1" lamun ujung. "kaluar" ti vertex jeung "-1" lamun eta "kaasup" dina eta (éta cukup gampang pikeun nginget, sabab tanda "minus" ogé sigana "kaasup" dina angka "-1")). Pikeun grafik weighted, deui, tinimbang 1 jeung -1, Anjeun bisa nangtukeun total beurat tepi.

2. Struktur data enumerasi

2.1 Daptar Adjacency. Nya, sadayana sigana saderhana di dieu. Unggal vertex grafik bisa, sacara umum, pakait sareng struktur enumerasi (daftar, véktor, array, ...), nu bakal nyimpen nomer tina sagala vertices padeukeut jeung hiji dibikeun. Pikeun grafik diarahkeun, urang bakal nambahan kana daptar misalna ngan maranéhanana vertex nu aya "diarahkeun" ujung ti vertex fitur. Pikeun grafik weighted palaksanaan bakal leuwih kompleks.

2.2 Daptar iga. Struktur data anu cukup populér. Daptar edges, sakumaha Kaptén Obviousness ngabejaan urang, sabenerna mangrupa daptar edges tina grafik, nu masing-masing dieusian ku vertex awal, vertex tungtung (pikeun grafik undirected urutan teu penting di dieu, sanajan keur ngahijikeun Tatar anjeun tiasa. ngagunakeun rupa-rupa aturan, contona, nangtukeun titik dina raraga ngaronjatkeun) jeung beurat (pikeun grafik weighted wungkul).

Anjeun tiasa ningali daptar matriks anu didaptarkeun di luhur sacara langkung rinci (sareng ilustrasi), contona, di dieu.

2.3 Asép Sunandar Sunarya. Teu struktur paling umum. Dina inti na, éta mangrupa wangun "packing" daptar adjacency kana hiji struktur enumeration (array, vektor). The n munggaran (nurutkeun jumlah vertices tina grafik) elemen Asép Sunandar Sunarya sapertos ngandung indéks mimiti Asép Sunandar Sunarya sarua, mimitian ti nu sagala vertices padeukeut jeung hiji dibikeun ditulis dina baris.

Di dieu kuring mendakan panjelasan anu paling kaharti (pikeun kuring sorangan): ejuo.livejournal.com/4518.html

3. Adjacency Véktor jeung Associative Adjacency Array

Tétéla yén panulis garis ieu, lain programmer profésional, tapi anu périodik diurus grafik, paling mindeng diurus daptar edges. Mémang, éta merenah lamun grafik boga sababaraha loops na edges. Ku kituna, dina ngembangkeun daptar Palasik of edges, abdi ngajukeun nengetan maranéhanana "pangmekaran / cabang / modifikasi / mutasi", nyaéta: véktor adjacency jeung susunan adjacency associative.

3.1 Vektor Adjacency

Kasus (a1): grafik unweighted

Urang bakal nelepon hiji véktor adjacency pikeun grafik unweighted susunan maréntahkeun hiji genap jumlah wilangan bulat (a[2i], a[2i+1],..., dimana i ieu wilanganana c 0), nu unggal pasangan angka. nyaeta a[2i], a[2i+1 ] nangtukeun tepi grafik antara verteks a[2i] jeung a[2i+1], masing-masing.
Format rekaman ieu henteu ngandung inpormasi ngeunaan naha grafik diarahkeun (dua pilihan tiasa waé). Lamun ngagunakeun format digraph, tepi dianggap diarahkeun ti a[2i] ka a[2i+1]. Di dieu sareng di handap: pikeun grafik anu henteu diarahkeun, upami diperyogikeun, syarat pikeun ngarékam simpul tiasa diterapkeun (contona, yén vertex kalayan nilai anu langkung handap tina jumlah anu ditugaskeun ka éta asalna heula).

Dina C ++, éta sasaena pikeun nangtukeun hiji véktor adjacency maké std :: vektor, ku kituna ngaran struktur data ieu.

Kasus (a2): grafik unweighted, beurat ujung integer

Ku analogi jeung kasus (a1), urang nyebut véktor adjacency pikeun grafik weighted kalawan integer integer beurat integer susunan susunan (Asép Sunandar Sunarya dinamis) angka (a[3i], a[3i+1], a[3i+2], ..., dimana i wilanganana c 0), dimana unggal "triplet" tina wilangan a[3i], a[3i+1], a[3i+2] nangtukeun ujung grafik antara verteks wilanganana a[3i] jeung a[3i+1], masing-masing, sarta nilai a [3i+2] nyaeta beurat ujung ieu. Grafik sapertos kitu ogé tiasa diarahkeun atanapi henteu.

Kasus (b): grafik teu beurat, beurat ujung non-integer

Kusabab mustahil pikeun nyimpen unsur hétérogén dina hiji Asép Sunandar Sunarya (vektor), contona, palaksanaan di handap ieu mungkin. Grafik disimpen dina sapasang vektor, dimana véktor kahiji nyaéta véktor padeukeut grafik tanpa nangtukeun beurat, sareng véktor kadua ngandung beurat anu saluyu (kamungkinan palaksanaan pikeun C++: std:: pair). Ku kituna, pikeun sisi anu didefinisikeun ku sapasang vertex handapeun indéks 2i, 2i + 1 tina véktor kahiji, beurat bakal sarua jeung unsur dina indéks i tina véktor kadua.

Muhun, naha ieu diperlukeun?

Nya, panulis garis ieu mendakan éta mangpaat pikeun ngarengsekeun sababaraha masalah. Nya, tina sudut pandang formal, bakal aya kaunggulan ieu:

  • Vektor adjacency, kawas sagala séjén "enumerative" struktur, cukup kompak, nyokot memori kirang ti matrix adjacency (pikeun grafik sparse), sarta relatif gampang pikeun nerapkeun.
  • The vertex grafik, prinsipna mah, ogé bisa ditandaan ku angka négatip. Kumaha upami "perversion" sapertos kitu diperyogikeun?
  • Grafik tiasa ngandung sababaraha sisi sareng sababaraha puteran, kalayan beurat anu béda (positip, négatip, bahkan nol). Henteu aya larangan di dieu.
  • Anjeun ogé tiasa napelkeun sipat anu béda-béda pikeun sisi - tapi pikeun langkung seueur ngeunaan éta, tingali bagian 4.

Sanajan kitu, eta kudu ngaku yén "daptar" ieu teu imply aksés gancang ka tepi. Sareng di dieu Associative Adjacency Array sumping ka nyalametkeun, anu dibahas di handap ieu.

3.2 Asép Sunandar Sunarya associative

Ku kituna, upami aksés ka ujung husus, beurat sarta sipat séjén anu kritis pikeun urang, sarta sarat memori teu ngidinan urang ngagunakeun matrix adjacency, lajeng hayu urang pikir ngeunaan kumaha carana ngarobah vektor adjacency pikeun ngajawab masalah ieu. Janten, koncina nyaéta ujung grafik, anu tiasa ditetepkeun salaku pasangan integer anu maréntahkeun. Kumaha ieu kasampak kawas? Éta henteu konci dina Asép Sunandar Sunarya associative? Sareng, upami kitu, naha urang henteu ngalaksanakeunana? Hayu urang boga hiji Asép Sunandar Sunarya associative dimana unggal konci - hiji pasangan maréntahkeun integer - bakal pakait sareng nilai a - integer atawa wilangan riil nu nangtukeun beurat tepi. Dina C++, disarankeun pikeun nerapkeun struktur ieu dumasar kana wadahna std::map (std::map , int> atanapi std::map , double>), atawa std::multimap lamun sababaraha edges diperkirakeun. Nya, urang gaduh struktur pikeun nyimpen grafik anu nyandak memori kirang ti struktur "matriks", tiasa ngartikeun grafik kalayan sababaraha puteran sareng ujung, sareng henteu ngagaduhan syarat anu ketat pikeun non-negativitas nomer vertex (Kuring henteu terang. anu peryogi ieu, tapi tetep).

4. Struktur data pinuh, tapi aya anu leungit

Sareng leres: nalika ngarengsekeun sababaraha masalah, urang panginten kedah napelkeun sababaraha ciri dina ujung grafik sareng, sasuai, simpenana. Lamun kasebut nyaéta dimungkinkeun pikeun unambiguously ngurangan fitur ieu pikeun integers, teras kasebut nyaéta dimungkinkeun pikeun nyimpen misalna "grafik kalawan fitur tambahan" ngagunakeun versi nambahan tina vektor adjacency jeung Asép Sunandar Sunarya adjacency associative.

Ku kituna, hayu urang boga grafik unweighted, pikeun tiap ujung nu perlu pikeun nyimpen, contona, 2 fitur tambahan dieusian ku integer. Dina hal ieu, kasebut nyaéta dimungkinkeun pikeun nangtukeun véktor adjacency na salaku susunan susunan teu "pasangan", tapi tina "quartets" integers (a[2i], a[2i+1], a[2i+2], a [2i+3]…) , dimana a[2i+2] jeung a[2i+3] bakal nangtukeun ciri-ciri sisi anu saluyu. Pikeun grafik kalawan beurat integer of edges, urutan umumna sarupa (hiji-hijina bédana bakal yén atribut bakal nuturkeun beurat tepi sarta bakal dieusian ku elemen a[2i+3] jeung a[2i+4] , sarta ujung sorangan bakal dieusian moal 4, tapi 5 maréntahkeun angka). Jeung pikeun grafik kalawan beurat ujung non-integer, fitur bisa ditulis kana komponén unweighted na.

Lamun ngagunakeun susunan adjacency associative pikeun grafik kalawan beurat ujung integer, kasebut nyaéta dimungkinkeun pikeun nangtukeun salaku nilai lain angka tunggal, tapi hiji Asép Sunandar Sunarya (vektor) tina angka nu nangtukeun, salian ti beurat hiji ujung, sagala séjén diperlukeun. Fitur. Dina waktu nu sarua, hiji kasulitan pikeun hal non-integer beurat bakal jadi kabutuhan pikeun nangtukeun tanda kalawan angka floating point (enya, ieu mangrupa kasulitan, tapi lamun aya teu jadi loba tanda sapertos, sarta lamun henteu. 'T set aranjeunna teuing "tricky" ganda, mangka bisa jadi nanaon). Ieu ngandung harti yén dina C++, arrays adjacency associative diperpanjang bisa dieusian kieu: std::map , std::vector> or std::map , std::vector, dimana nilai munggaran dina "key-value-vector" bakal janten beurat tepi, teras lokasi numerik tina ciri-cirina.

Sastra:

Ngeunaan grafik sareng algoritma sacara umum:

1. Cormen, Thomas H., Leiserson, Charles I., Rivest, Ronald L., Stein, Clifford. Algoritma: konstruksi jeung analisis, 2nd édisi: Trans. ti basa Inggris - M.: Williams Publishing House, 2011.
2. Harari Frank. Téori grafik. M.: Mir, 1973.
Laporan panulis ngeunaan vektor anu sami sareng susunan asosiatif tina adjacencies:
3. Chernoukhov S.A. Vektor Adjacency sareng Asép Sunandar Sunarya associative salaku cara pikeun ngagambarkeun sareng nyimpen grafik / S.A. Chernouhov. Vektor Adjacency sareng peta adjacency salaku struktur data pikeun ngagambarkeun grafik // Kumpulan artikel Konperénsi Ilmiah sareng Praktis Internasional "Masalah ngalaksanakeun hasil pamekaran inovatif sareng cara pikeun ngabéréskeunana" (Saratov, 14.09.2019 Séptémber 2019). – Sterlitamak: AMI, 65, p. 69-XNUMX
Sumber online mangpaat dina topik:
4. prog-cpp.ru/data-graph
5. ejuo.livejournal.com/4518.html

sumber: www.habr.com

Tambahkeun komentar