Nā hana ʻikepili no ka mālama ʻana i nā kiʻi: he loiloi o nā mea i loaʻa a me ʻelua mau mea "aneane hou".

Aloha kākou kela kanaka.

Ma kēia memo, ua hoʻoholo wau e papa inoa i nā hale ʻikepili nui i hoʻohana ʻia no ka mālama ʻana i nā kiʻi i ka ʻepekema kamepiula, a e kamaʻilio pū wau e pili ana i kekahi mau hale like ʻole i "crystallized" noʻu.

No laila, e hoʻomaka kākou. ʻAʻole naʻe mai ka hoʻomaka ʻana - Manaʻo wau ua ʻike mua mākou a pau i ke ʻano o ka pakuhi a me ke ʻano o ia mau mea (directed, undirected, weighted, unweighted, me nā ʻaoʻao ʻole a me nā puka lou).

No laila, e hele kāua. He aha nā koho no nā hoʻolālā ʻikepili no ka "pūnaewele kiʻi" i loaʻa iā mākou?

1. Nā hale ʻikepili matrix

1.1 Matrix pili. ʻO ka matrix pili kahi matrix kahi e pili ai nā poʻomanaʻo lālani a me nā kolamu i nā helu o nā vertices o ka pakuhi, a ʻo ka waiwai o kēlā me kēia o kāna mau mea a(i,j) e hoʻoholo ʻia e ka hiki a i ʻole ka ʻole o nā kihi ma waena o nā vertices. i a me j (akaka no ka pakuhi i kuhikuhi ʻole ʻia e like ka matrix, a i ʻole hiki iā mākou ke ʻae e mālama mākou i nā waiwai āpau ma luna o ka diagonal nui). No nā kiʻi kaumaha ʻole, hiki ke hoʻonohonoho ʻia a(i,j) e ka helu o nā ʻaoʻao mai i a i j (inā ʻaʻohe ʻaoʻao like, a laila a(i,j)= 0), a no nā kiʻi kaumaha, me ke kaumaha. (kaumaha nui) o nā ʻaoʻao i ʻōlelo ʻia.

1.2 ʻO ka helu kuhi. Ma kēia hihia, mālama pū ʻia kā mākou pakuhi i loko o kahi pākaukau, ma ke ʻano maʻamau, pili nā helu lālani i nā helu o kona mau vertices, a pili nā helu kolamu me nā ʻaoʻao i helu mua ʻia. Inā pili ka piko a me ka ʻaoʻao i kekahi i kekahi, a laila ua kākau ʻia kahi waiwai ʻole-zero i loko o ke kelepona pili (no nā kiʻi kuhikuhi ʻole, kākau ʻia ka 1 inā he hanana ka vertex a me ka ʻaoʻao, no nā mea kuhikuhi - "1" inā ʻo ka ʻaoʻao. "puka" mai ka vertex a me "-1" inā "hoʻokomo" i loko o ia (he maʻalahi ka hoʻomanaʻo, no ka mea, ʻo ka hōʻailona "minus" me he mea lā ua "hoʻokomo ʻia" i ka helu "-1")). No nā pakuhi paona, hou, ma kahi o 1 a me -1, hiki iā ʻoe ke kuhikuhi i ka nui o ke kaumaha o ka lihi.

2. Nā hoʻonohonoho ʻikepili helu

2.1 Papa inoa pili. ʻAe, ua maʻalahi nā mea a pau ma ʻaneʻi. Hiki i kēlā me kēia piko o ka pakuhi, ma ke ʻano laulā, ke hoʻopili ʻia me kekahi ʻano helu helu (papa inoa, vector, array, ...), e mālama i nā helu o nā vertices āpau e pili ana i ka mea i hāʻawi ʻia. No nā kiʻi kuhikuhi ʻia, e hoʻohui mākou i kēlā papa inoa i kēlā mau vertex wale nō i loaʻa kahi ʻaoʻao "kuhikuhi" mai kahi vertex hiʻona. No nā pakuhi paona e ʻoi aku ka paʻakikī o ka hoʻokō.

2.2 Papa inoa o na iwi aoao. He ʻano ʻikepili kaulana loa. ʻO ka papa inoa o nā ʻaoʻao, e like me kā Kāpena Obviousness e haʻi mai nei iā mākou, he papa inoa maoli nō ia o nā kihi o ka pakuhi, kēlā me kēia mea i kuhikuhi ʻia e ka vertex hoʻomaka, ka vertex hope (no nā kiʻi kuhikuhi ʻole he mea nui ke kauoha ma aneʻi, ʻoiai no ka hui ʻana hiki iā ʻoe ke hiki. e hoʻohana i nā lula like ʻole, no ka laʻana, ka wehewehe ʻana i nā vertices i ka hoʻonui ʻana) a me ke kaumaha (no nā kiʻi kaumaha wale nō).

Hiki iā ʻoe ke nānā i nā papa inoa matrix i helu ʻia ma luna me nā kikoʻī hou aku (a me nā kiʻi), no ka laʻana, maanei.

2.3 Laina pili. ʻAʻole ka hale maʻamau. Ma kona kumu, he ʻano ia o nā papa inoa pili "hoʻopili" i hoʻokahi papa helu helu (array, vector). ʻO ka n mua (e like me ka helu o nā vertices o ka pakuhi) nā mea o ia ʻano i loaʻa nā helu hoʻomaka o ka ʻano like, e hoʻomaka ana e kākau ʻia nā vertices a pau e pili ana i ka mea i hāʻawi ʻia i ka lālani.

Maʻaneʻi ua loaʻa iaʻu ka wehewehe maopopo loa (noʻu iho): ejuo.livejournal.com/4518.html

3. Hoʻopili pili a me nā hui pili pili

Ua ʻike ʻia ʻo ka mea kākau o kēia mau laina, ʻaʻole ia he mea hoʻolālā ʻoihana, akā nāna i hana i nā kiʻi i kēlā me kēia manawa, e hana pinepine i nā papa inoa o nā kihi. ʻOiaʻiʻo, maʻalahi inā loaʻa i ka pakuhi nā puka lou a me nā ʻaoʻao. A no laila, i ka hoʻomohala ʻana i nā papa inoa maʻamau o nā ʻaoʻao, manaʻo wau e hoʻolohe i kā lākou "hoʻomohala / lālā / hoʻololi / hoʻololi", ʻo ia hoʻi: ka vector pili a me ka hui pili pili.

3.1 Vektor pili

Kekahi (a1): ka pakuhi kaumaha ʻole

E kapa mākou i kahi vector pili no ka pakuhi kaumaha ʻole he pūʻulu i kauoha ʻia o ka helu like ʻole (a[2i], a[2i+1],..., kahi i helu ʻia c 0), i loko o kēlā me kēia pālua o nā helu. he a[2i], a[2i+1 ] e kuhikuhi ana i ka lihi pakuhi ma waena o nā piko a[2i] a me a[2i+1].
ʻAʻole i loaʻa i kēia ʻano hoʻopaʻa palapala ka ʻike e pili ana i ke kuhikuhi ʻana o ka pakuhi (hiki i nā koho ʻelua). I ka hoʻohana ʻana i ke ʻano digraph, manaʻo ʻia ke kuhikuhi ʻia ka ʻaoʻao mai kahi [2i] a i kahi [2i+1]. Ma ʻaneʻi a ma lalo: no nā kiʻi kuhikuhi ʻole, inā pono, hiki ke hoʻohana ʻia nā koi no ke ʻano o ka hoʻopaʻa ʻana i nā vertices (no ka laʻana, ʻo ka vertex me ka haʻahaʻa haʻahaʻa o ka helu i hāʻawi ʻia iā ia ke hele mua mai).

Ma C++, pono e kuhikuhi i kahi vector pili me ka std::vector, no laila ka inoa o kēia ʻano ʻikepili.

Ka hihia (a2): ka pakuhi kaumaha ʻole, ʻo ke kaupaona ʻana he helu helu

Ma ka hoʻohālikelike me ka hihia (a1), kapa mākou i ka vector pili no ka pakuhi paona me nā paona lihi integer he hoʻonohonoho i kauoha ʻia (ka hoʻonohonoho ikaika) o nā helu (a[3i], a[3i+1], a[3i+2], ..., kahi i helu ʻia c 0), kahi e wehewehe ai kēlā me kēia "ʻekolu" o nā helu a[3i], a[3i+1], a[3i+2] i kahi kihi o ka pakuhi ma waena o nā piko i helu ʻia a[3i] a me a[3i+1], a me ka waiwai a [3i+2] ke kaumaha o keia lihi. Hiki ke kuhikuhi ʻia a ʻaʻole paha ia pakuhi.

Kekahi (b): ka pakuhi kaumaha ʻole, nā kaupaona lihi ʻole

No ka mea hiki ʻole ke mālama i nā mea heterogeneous i hoʻokahi array (vector), no ka laʻana, hiki ke hoʻokō ʻia. Mālama ʻia ka pakuhi i loko o nā vectors ʻelua, a ʻo ka vector mua ka vector pili o ka pakuhi me ka ʻole o ka hōʻike ʻana i nā kaupaona, a ʻo ka lua o ka vector i loaʻa nā kaupaona kūpono (hiki ke hoʻokō ʻia no C++: std::pair. ). No laila, no ka ʻaoʻao i wehewehe ʻia e kekahi mau vertices ma lalo o nā kuhikuhi 2i, 2i+1 o ka vector mua, e like ke kaumaha me ka mea ma lalo o ka kuhikuhi i o ka vector ʻelua.

ʻAe, no ke aha e pono ai kēia?

ʻAe, ua ʻike ka mea kākau o kēia mau laina he mea pono no ka hoʻoponopono ʻana i nā pilikia. ʻAe, mai kahi manaʻo maʻamau, e loaʻa nā pono aʻe:

  • ʻO ka vector pili, e like me nā ʻano "enumerative" ʻē aʻe, he paʻa loa, ʻoi aku ka liʻiliʻi o ka hoʻomanaʻo ma mua o ka matrix pili (no nā kiʻi liʻiliʻi), a maʻalahi ke hoʻokō.
  • Hiki ke kaha ʻia nā piko o ka pakuhi me nā helu ʻino. He aha inā makemake ʻia kēlā "perversion"?
  • Hiki i nā kiʻi ke loaʻa nā ʻaoʻao he nui a me nā puka lou he nui, me nā kaupaona ʻokoʻa (maikaʻi, ʻino, ʻole ʻole). ʻAʻohe kapu ma ʻaneʻi.
  • Hiki iā ʻoe ke hāʻawi i nā waiwai like ʻole i nā ʻaoʻao - akā no nā mea hou aʻe, e ʻike i ka pauku 4.

Eia naʻe, pono e ʻae ʻia kēia "papa inoa" ʻaʻole ia e kuhikuhi i ke komo wikiwiki i ka lihi. A eia ka Associative Adjacency Array e hoʻopakele, i kūkākūkā ʻia ma lalo nei.

3.2 Huina pili pili

No laila, inā hiki ke komo i kahi lihi kikoʻī, ʻo kona kaumaha a me nā waiwai ʻē aʻe he mea koʻikoʻi no mākou, a ʻaʻole ʻae nā koi hoʻomanaʻo iā mākou e hoʻohana i ka matrix adjacency, a laila e noʻonoʻo kākou pehea e hiki ai iā mākou ke hoʻololi i ka vector adjacency e hoʻoponopono i kēia pilikia. No laila, ʻo ke kī he ʻaoʻao o ka pakuhi, hiki ke kuhikuhi ʻia ma ke ʻano he ʻelua i kauoha ʻia. Pehea ke ano o keia? ʻAʻole anei he kī i loko o kahi hui hui? A inā pēlā, no ke aha mākou e hoʻokō ʻole ai? E loaʻa iā mākou kahi hui hui kahi e hoʻopili ʻia ai kēlā me kēia kī - he ʻelua i kauoha ʻia - me kahi waiwai - he integer a i ʻole ka helu maoli e hōʻike ana i ke kaumaha o ka lihi. Ma C ++, pono e hoʻokō i kēia hoʻolālā e pili ana i ka std:: map ipu (std:: map , int> a i ʻole std::map , pālua>), a i ʻole std::multimap inā manaʻo ʻia nā ʻaoʻao he nui. ʻAe, loaʻa iā mākou kahi hale no ka mālama ʻana i nā kiʻi i emi iho ka hoʻomanaʻo ma mua o nā hale "matrix", hiki ke wehewehe i nā kiʻi me nā puka lou a me nā kihi he nui, a ʻaʻohe koi koʻikoʻi no ka negativity ʻole o nā helu vertex (ʻaʻole wau ʻike. ʻo wai ka mea e pono ai kēia, akā naʻe).

4. Ua piha nā hale ʻikepili, akā ua nalowale kekahi mea

A he ʻoiaʻiʻo: i ka wā e hoʻoponopono ai i kekahi mau pilikia, pono paha mākou e kau i kekahi mau hiʻohiʻona i nā kihi o ka pakuhi a, no laila, e mālama iā lākou. Inā hiki ke hōʻemi pono i kēia mau hiʻohiʻona i nā helu helu, a laila hiki ke mālama i nā "kiʻi me nā hiʻohiʻona hou" me ka hoʻohana ʻana i nā mana lōʻihi o ka vector adjacency a me nā hui pili pili.

No laila, e loaʻa iā mākou kahi pakuhi kaumaha ʻole, no kēlā me kēia ʻaoʻao kahi e pono ai e mālama, no ka laʻana, 2 mau hiʻohiʻona hou i kuhikuhi ʻia e nā helu helu. I kēia hihia, hiki ke wehewehe i kona vector pili ma ke ʻano he hoʻonohonoho kauoha ʻaʻole o "pālua", akā ʻo nā "quartets" o nā huina helu (a[2i], a[2i+1], a[2i+2], a [2i+3]…) , kahi e hoʻoholo ai a[2i+2] a me a[2i+3] i nā ʻano o ka lihi pili. No ka pakuhi me nā paona integer o nā ʻaoʻao, ʻano like ke ʻano (ʻo ka ʻokoʻa wale nō e hahai nā ʻano i ke kaumaha o ka lihi a e kuhikuhi ʻia e nā mea a[2i+3] a me a[2i+4] , a ʻo ka ʻaoʻao ponoʻī e kuhikuhi ʻia ʻaʻole 4, akā 5 mau helu kauoha). A no ka pakuhi me nā kaupaona lihi ʻole, hiki ke kākau ʻia nā hiʻohiʻona i loko o kāna ʻāpana kaumaha ʻole.

I ka hoʻohana ʻana i kahi hui pili pili no nā kiʻi me nā kaupaona ʻaoʻao integer, hiki ke kuhikuhi ʻia ma ke ʻano he waiwai ʻaʻole he helu hoʻokahi, akā he pūʻulu (vector) o nā helu e kuhikuhi ana, me ka hoʻohui ʻana i ke kaumaha o kahi lihi, nā mea pono ʻē aʻe a pau. hiʻona. I ka manawa like, ʻo kahi pilikia no ka hihia o nā paona helu ʻole ka pono e wehewehe i kahi hōʻailona me kahi helu lana (ʻae, he pilikia kēia, akā inā ʻaʻole nui nā hōʻailona like ʻole, a inā ʻoe e hana. 'a'ole ho'onohonoho 'oe iā lākou he "tricky" pāpālua, a laila he mea 'ole). ʻO ia hoʻi, ma C ++, hiki ke wehewehe ʻia nā ʻano hui like ʻole e like me kēia: std::map , std::vector> a i ʻole std::map , std::vector, kahi o ka waiwai mua ma ka "key-value-vector" e lilo i ke kaumaha o ka lihi, a laila e loaʻa nā helu helu o kona mau ʻano.

Palapala:

E pili ana i nā pakuhi a me nā algorithms ma ka laulā:

1. Cormen, Thomas H., Leiserson, Charles I., Rivest, Ronald L., Stein, Clifford. Algorithms: kūkulu a me ka nānā ʻana, 2nd edition: Trans. mai ka ʻōlelo Pelekania – M.: Hale Publishing Williams, 2011.
2. Harari Frank. Ka manaʻo kiʻi. M.: Mir, 1973.
ʻO ka hōʻike a ka mea kākau e pili ana i kēia mau vector like ʻole a me nā hui pili o nā mea pili:
3. Chernoukhov S.A. ʻO nā vector pili a me nā hui pili pili i nā ala e hōʻike a mālama i nā kiʻi / SA Chernouhov. ʻO ka vector a me ka palapala ʻāina pili e like me nā hoʻonohonoho ʻikepili e hōʻike i kahi pakuhi // Kohi o nā ʻatikala o ka International Scientific and Practical Conference "Nā pilikia o ka hoʻokō ʻana i nā hopena o nā hoʻomohala hou a me nā ala e hoʻoponopono ai" (Saratov, Kepakemapa 14.09.2019, 2019). – Sterlitamak: AMI, 65, p. 69-XNUMX
Nā kumu punaewele ma ke kumuhana:
4. prog-cpp.ru/data-graph
5. ejuo.livejournal.com/4518.html

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka