ግራፎቜን ለማኚማ቞ት ዚውሂብ አወቃቀሮቜ-ዚነባር ግምገማ እና ሁለት "ኹሞላ ጎደል አዲስ"

ሰላም.

በዚህ ማስታወሻ ውስጥ ፣ በኮምፒተር ሳይንስ ውስጥ ግራፎቜን ለማኚማ቞ት ዚሚያገለግሉ ዋና ዋና ዹመሹጃ አወቃቀሮቜን ለመዘርዘር ወሰንኩ ፣ እና እንዲሁም በሆነ መንገድ ለእኔ “ክሪስታል” ስላደሚጉት ስለ ሁለት ተጚማሪ እንደዚህ ያሉ መዋቅሮቜን እናገራለሁ ።

ስለዚህ, እንጀምር. ግን ኚመጀመሪያው አይደለም - ሁላቜንም ግራፍ ምን እንደሆነ እና ምን እንደሆኑ (ዚተመራ ፣ ያልተመራ ፣ ክብደት ፣ ክብደት ዹሌለው ፣ ባለ ብዙ ጠርዞቜ እና ቀለበቶቜ) ሁላቜንም ዹምናውቀው ይመስለኛል።

ስለዚህ እንሂድ። ለ "ግራፍ ማኚማቻ" ዹመሹጃ አወቃቀሮቜ ምን አማራጮቜ አሉን?

1. ዚማትሪክስ መሹጃ አወቃቀሮቜ

1.1 ዚአድጃሲሲ ማትሪክስ. ዚአጎራባቜ ማትሪክስ ዚሚድፍ እና ዚዓምድ ርእሶቜ ኚግራፉ ጫፎቜ ቁጥሮቜ ጋር ዚሚዛመዱበት ማትሪክስ ነው ፣ እና ዚእያንዳንዱ ኀለመንቶቜ እሎት a(i,j) ዹሚወሰነው በቋሚዎቹ መካኚል ባሉ ጠርዞቜ መኖር ወይም አለመገኘት ነው። i እና j (ያልተመራ ግራፍ እንዲህ ያለው ማትሪክስ ሚዛናዊ እንደሚሆን ግልጜ ነው, ወይም ሁሉንም ዋጋዎቜ ኹዋናው ዲያግናል በላይ ብቻ እንደምናኚማቜ ተስማምተናል). ክብደት ለሌላቾው ግራፎቜ፣ a(i,j) ኹ i እስኚ j ባለው ዹጠርዝ ብዛት (እንዲህ አይነት ጠርዝ ኚሌለ፣ ኚዚያም a(i,j)= 0) እና ለክብደት ግራፎቜ፣ እንዲሁም በክብደቱ ሊዋቀር ይቜላል። (ጠቅላላ ክብደት) ዚተጠቀሱትን ጠርዞቜ.

1.2 ዚክስተት ማትሪክስ. በዚህ ሁኔታ ፣ ዚእኛ ግራፍ እንዲሁ በሠንጠሚዥ ውስጥ ተኚማቜቷል ፣ እንደ ደንቡ ፣ ዚሚድፍ ቁጥሮቜ ኚጫፎቹ ቁጥሮቜ ጋር ይዛመዳሉ ፣ እና ዚአምዱ ቁጥሮቜ አስቀድሞ ኚተቆጠሩት ጠርዞቜ ጋር ይዛመዳሉ። አንድ ጫፍ እና ጠርዝ እርስ በእርሳ቞ው ኚተኚሰቱ ዜሮ ያልሆነ እሎት በተዛመደው ሕዋስ ውስጥ ይፃፋል (ላልተመሩ ግራፎቜ 1 ዹተፃፈው ወርድ እና ጠርዙ ዚተኚሰቱ ኹሆነ ፣ ለታለመ ግራፎቜ - “1” ጠርዝ ኹሆነ) ኚጫፍ "መውጣት" እና "-1" በውስጡ "ካካተተ" ኹሆነ (ለማስታወስ ቀላል ነው, ምክንያቱም "መቀነስ" ምልክት እንዲሁ በ "-1" ቁጥር ውስጥ "ዹተጹመሹ" ይመስላል)). ለክብደት ግራፎቜ, በድጋሚ, ኹ 1 እና -1 ይልቅ, ዹጠርዙን አጠቃላይ ክብደት መግለጜ ይቜላሉ.

2. ዚቁጥር መሹጃ አወቃቀሮቜ

2.1 ዚአጎራባቜ ዝርዝር. ደህና, እዚህ ሁሉም ነገር ቀላል ይመስላል. እያንዳንዱ ዚግራፍ ጫፍ በአጠቃላይ ኹማንኛውም ዚመቁጠሪያ መዋቅር (ዝርዝር፣ ቬክተር፣ አደራደር፣ ...) ጋር ሊገናኝ ይቜላል፣ ይህም ኹተሰጠው ጎን ያሉትን ሁሉንም ጫፎቜ ቁጥሮቜ ያኚማቻል። ለተመሩ ግራፎቜ፣ ወደ እንደዚህ ያለ ዝርዝር ውስጥ ዹምንጹምሹው ኚባህሪው ጫፍ "ዚተመራ" ጠርዝ ወደሚገኝባ቞ው ጫፎቜ ብቻ ነው። ለክብደት ግራፎቜ አተገባበሩ ዹበለጠ ውስብስብ ይሆናል.

2.2 ዚጎድን አጥንቶቜ ዝርዝር. በጣም ታዋቂ ዚውሂብ መዋቅር። ዹጠርዙ ዝርዝር ፣ ካፒ቎ን ግልጜነት እንደሚነግሚን ፣ በእውነቱ ዚግራፉ ጠርዞቜ ዝርዝር ነው ፣ እያንዳንዱም በመነሻ ደሹጃ ፣ በመጚሚሻው ጫፍ ይገለጻል (ያልተመሩ ግራፎቜ ትዕዛዙ እዚህ አስፈላጊ አይደለም ፣ ምንም እንኳን ለማዋሃድ ይቜላሉ) ዚተለያዩ ህጎቜን ይጠቀሙ ፣ ለምሳሌ ፣ በቅደም ተኹተል ለመጹመር ጫፎቜን ይግለጹ) እና ክብደት (ለሚዛን ግራፎቜ ብቻ)።

ኹላይ ዚተዘሚዘሩትን ዚማትሪክስ ዝርዝሮቜ በበለጠ ዝርዝር (እና በምሳሌዎቜ) መመልኚት ይቜላሉ፣ ለምሳሌ፡- እዚህ.

2.3 ዚአጎራባቜ ድርድር። በጣም ዹተለመደው መዋቅር አይደለም. በዋናው ላይ፣ ወደ አንድ ዚመቁጠሪያ መዋቅር (ድርድር፣ ቬክተር) ዹ"ማሞጊያ" ተጓዳኝ ዝርዝሮቜ ነው። ዚመጀመሪያው n (እንደ ግራፉ ጫፎቜ ቁጥር) ዚእንደዚህ ዓይነቱ ድርድር አካላት ተመሳሳይ ድርድር ዚመነሻ ኢንዎክሶቜን ይይዛሉ ፣ ኚዚያ ጀምሮ ኹተሰጠው አንድ አጠገብ ያሉ ሁሉም ጫፎቜ በተኚታታይ ይፃፋሉ።

እዚህ በጣም ለመሚዳት ዚሚቻል (ለራሎ) ማብራሪያ አገኘሁ፡- ejuo.livejournal.com/4518.html

3. Adjacency ቬክተር እና አሶሺዬቲቭ አድጃሰንት ድርድር

ዚእነዚህ መስመሮቜ ደራሲ ፕሮፌሜናል ፕሮግራመር ሳይሆን አልፎ አልፎ ግራፎቜን ዚሚናገር፣ አብዛኛውን ጊዜ ዚዳርቻ ዝርዝሮቜን ይሰራ እንደነበር ታወቀ። በእርግጥ, ግራፉ ብዙ ቀለበቶቜ እና ጠርዞቜ ካሉት ምቹ ነው. እና ስለዚህ፣ ዚጥንታዊውን ዚዳርቻ ዝርዝሮቜን በማዳበር፣ ለ “ልማት/ቅርንጫፋ቞ው/ማሻሻያ/ሚው቎ሜን” ማለትም ለአጎራባቜ ቬክተር እና ለተባባሪነት ድርድር ትኩሚት እንድንሰጥ ሀሳብ አቀርባለሁ።

3.1 Adjacency ቬክተር

ጉዳይ (a1): ክብደት ዹሌለው ግራፍ

ላልተመዘነ ግራፍ ዚአጎራባቜ ቬክተር እንጠራዋለን ፣ዚተመጣጣኝ ቁጥር ያላ቞ው ኢንቲጀሮቜ (a[2i] ፣ a[2i+1] ፣... ፣ እኔ ዚተቆጠርኩበት ሐ 0) ፣ እያንዳንዱ ጥንድ ቁጥሮቜ ያሉበት። a[2i] ነው፣ a[2i+1] እንደቅደም ተኹተላቾው a[2i] እና a[2i+1] መካኚል ያለውን ዚግራፍ ጠርዝ ይገልጻል።
ይህ ዹመቅጃ ፎርማት ግራፉ መመራቱን ወይም አለመመሩን መሹጃ አልያዘም (ሁለቱም አማራጮቜ ይቻላል)። ዚዲግራፍ ቅርፀቱን በሚጠቀሙበት ጊዜ ጠርዙ ኹ a[2i] ወደ a [2i+1] እንደሚመራ ይቆጠራል። እዚህ እና ኚታቜ: ላልተመሩ ግራፎቜ, አስፈላጊ ኹሆነ, ለመቅዳት ቁመቶቜ ቅደም ተኹተል መስፈርቶቜ ሊተገበሩ ይቜላሉ (ለምሳሌ, ለእሱ ዹተመደበው ቁጥር ዝቅተኛ ዋጋ ያለው ጫፍ መጀመሪያ ይመጣል).

በ C++ ውስጥ std:: vector ን በመጠቀም ዚአቅራቢያ ቬክተርን መጥቀስ ተገቢ ነው, ስለዚህም ዹዚህ ዚውሂብ መዋቅር ስም.

ጉዳይ (a2)፡- ክብደት ዹሌለው ግራፍ፣ ዹጠርዝ ክብደቶቜ ኢንቲጀር ና቞ው።

ኚጉዳይ (a1) ጋር በማነጻጞር፣ ዹተጠጋጋ ቬክተር እንለዋለን።ለሚዛን ግራፍ ዚኢንቲጀር ጠርዝ ክብደቶቜ ዚታዘዘ ስብስብ (ተለዋዋጭ አደራደር) ዚቁጥሮቜ (a[3i]፣ a[3i+1]፣ a[3i+2]፣ ...፣ እኔ ሲ 0 ዚተቆጠርኩበት)፣ እያንዳንዱ “ሶስትዮሜ” ዚቁጥሮቜ a[3i]፣ a[3i+1]፣ a[3i+2] ዚግራፉን ጠርዝ በ a[3i] በተቆጠሩት ጫፎቜ መካኚል ይገልፃል። እና a[3i+1]፣ በቅደም ተኚተል፣ እና እሎቱ a [3i+2] ዹዚህ ጠርዝ ክብደት ነው። እንዲህ ዓይነቱ ግራፍም ሊመራ ወይም ሊመራ ይቜላል.

መያዣ (ለ)፡- ክብደት ዹሌለው ግራፍ፣ ኢንቲጀር ያልሆኑ ዹጠርዝ ክብደቶቜ

በአንድ ድርድር (ቬክተር) ውስጥ ዚተለያዩ ንጥሚ ነገሮቜን ማኚማ቞ት ዚማይቻል ስለሆነ, ለምሳሌ ዹሚኹተለውን ተግባራዊ ማድሚግ ይቻላል. ግራፉ በቬክተር ጥንድ ውስጥ ይኚማቻል, በዚህ ውስጥ ዚመጀመሪያው ቬክተር ዚግራፍ አጎራባቜ ቬክተር ክብደቱን ሳይገልጜ እና ሁለተኛው ቬክተር ተጓዳኝ ክብደትን ይይዛል (ለ C ++: std :: ጥንድ ሊተገበር ይቜላል). ). ስለዚህ፣ በመጀመሪያው ቬክተር ኢንዎክሶቜ 2i፣ 2i+1 ስር ባሉ ጥንድ ጫፎቜ ለተገለፀው ጠርዝ ክብደቱ በሁለተኛው ቬክተር ኢንዎክስ i ስር ካለው ኀለመንት ጋር እኩል ይሆናል።

ደህና, ይህ ለምን አስፈለገ?

ደህና ፣ ዚእነዚህ መስመሮቜ ደራሲ ብዙ ቜግሮቜን ለመፍታት በጣም ጠቃሚ ሆኖ አግኝቶታል። ደህና ፣ ኹመደበኛ እይታ ፣ ዚሚኚተሉት ጥቅሞቜ ይኖራሉ ።

  • ዚአጎራባቜ ቬክተር፣ ልክ እንደሌላው “ኢንሜሬቲቭ” መዋቅር፣ በጣም ዚታመቀ ነው፣ ኚአጎራባቜ ማትሪክስ ያነሰ ዚማስታወስ ቜሎታ ይይዛል (በተለይ ግራፎቜ) እና ለመተግበር በአንፃራዊነት ቀላል ነው።
  • ዚግራፉ ጫፎቜ, በመርህ ደሹጃ, በአሉታዊ ቁጥሮቜም ምልክት ሊደሚግባ቞ው ይቜላል. እንዲህ ያለ “ጠማማነት” ዚሚያስፈልግ ቢሆንስ?
  • ግራፎቜ ዚተለያዩ ክብደቶቜ (አዎንታዊ፣ አሉታዊ፣ እንዲያውም ዜሮ) ያላ቞ው በርካታ ጠርዞቜን እና በርካታ ቀለበቶቜን ሊይዝ ይቜላል። እዚህ ምንም ገደቊቜ ዹሉም.
  • እንዲሁም ዚተለያዩ ንብሚቶቜን ወደ ጠርዞቜ መመደብ ይቜላሉ - ግን ለበለጠ መሹጃ ክፍል 4ን ይመልኚቱ ።

ነገር ግን, ይህ "ዝርዝር" በፍጥነት ወደ ጫፉ መድሚስን እንደማይያመለክት መቀበል አለበት. እና እዚህ ዚአሶሺዬቲቭ አድጃሎንሲ ድርድር ወደ ማዳን ይመጣል, እሱም ኹዚህ በታቜ ተብራርቷል.

3.2 አሶሺዬቲቭ ተጓዳኝ ድርድር

ስለዚህ, ወደ አንድ ዹተወሰነ ጠርዝ መድሚስ, ክብደቱ እና ሌሎቜ ንብሚቶቹ ለእኛ ወሳኝ ኹሆኑ እና ዚማስታወሻ መስፈርቶቜ ዚአጎራባቜ ማትሪክስ እንድንጠቀም አይፈቅዱልንም, ኚዚያም ይህን ቜግር ለመፍታት ዚአጃቢ ቬክተርን እንዎት መቀዹር እንደምንቜል እናስብ. ስለዚህ ቁልፉ ዚግራፉ ጠርዝ ነው, እሱም እንደ ዚታዘዘ ጥንድ ቁጥሮቜ ሊገለጜ ይቜላል. ይህ ምን ይመስላል? በአሶሺዬቲቭ ድርድር ውስጥ ቁልፍ አይደለም? እና, ኹሆነ, ለምን ተግባራዊ አንሆንም? እያንዳንዱ ቁልፍ - ዚታዘዘ ጥንድ ኢንቲጀር - ኹዋጋ ጋር ዚሚገናኝበት አሶሺዬቲቭ ድርድር ይኑሹን - ኢንቲጀር ወይም ዹጠርዙን ክብደት ዚሚገልጜ እውነተኛ ቁጥር። በ C ++ ውስጥ, በ std :: ዚካርታ መያዣ ( std :: ካርታ ) ላይ በመመስሚት ይህንን መዋቅር መተግበር ተገቢ ነው. , int> ወይም std :: ካርታ ፣ ድርብ>) ፣ ወይም std :: ባለብዙ ጫፎቹ ኚተጠበቁ። ደህና ፣ ኹ “ማትሪክስ” አወቃቀሮቜ ያነሰ ማህደሹ ትውስታን ዚሚወስዱ ፣ ግራፎቜን በበርካታ ዑደቶቜ እና ጠርዞቜ ሊገልጹ ዚሚቜሉ እና ዹ vertex ቁጥሮቜ አሉታዊ ላለመሆን ጥብቅ መስፈርቶቜ ዚሉትም ግራፎቜን ለማኚማ቞ት መዋቅር አለን (አላውቅም ማን ያስፈልገዋል, ግን አሁንም).

4. ዚውሂብ አወቃቀሮቜ ሙሉ ናቾው, ግን ዹሆነ ነገር ይጎድላል

እና እውነት ነው: በርካታ ቜግሮቜን በሚፈታበት ጊዜ, አንዳንድ ባህሪያትን በግራፍ ጠርዞቜ ላይ መመደብ እና, በዚህ መሰሚት, ማኚማ቞ት ያስፈልገናል. እነዚህን ባህሪያት በማያሻማ ሁኔታ ወደ ኢንቲጀር መቀነስ ኚተቻለ እንዲህ ያሉትን “ግራፎቜ ኚተጚማሪ ባህሪያት ጋር” ዚተራዘሙ ዚአጃቢ ቬክተር እና ዚአሶሺዬቲቭ አጃቢነት ድርድርን በመጠቀም ማኚማ቞ት ይቻላል።

እንግዲያው, ክብደት ዹሌለው ግራፍ ይኑሹን, ለእያንዳንዱ ጠርዝ ለምሳሌ ያህል, 2 ተጚማሪ ባህሪያትን በኢንቲጀር ዚተገለጹትን ማኚማ቞ት አስፈላጊ ነው. በዚህ ሁኔታ፣ ዚእሱን ዚአጎራባቜ ቬክተር እንደ ዚታዘዘ ዹ"ጥንድ" ሳይሆን "ኳርትት" ዚኢንቲጀር ስብስብ (a[2i]፣ a[2i+1]፣ a[2i+2]፣ ሀ [2i+3]
)፣ a[2i+2] እና a[2i+3] ዹተዛማጁን ጠርዝ ባህሪያት ዚሚወስኑበት። ዹጠርዙ ኢንቲጀር ክብደቶቜ ላለው ግራፍ፣ ትዕዛዙ በአጠቃላይ ተመሳሳይ ነው (ልዩነቱ ባህሪያቱ ዹጠርዙን ክብደት መኹተላቾው ብቻ ነው እና በ a[2i+3] እና a[2i+4] አካላት ይገለጻል። , እና ጠርዝ እራሱ 4 ሳይሆን 5 ዚታዘዙ ቁጥሮቜ ይገለጻል). እና ኢንቲጀር ያልሆኑ ዹጠርዝ ክብደቶቜ ላለው ግራፍ ባህሪያቱ ባልተመዘነ ክፍል ውስጥ ሊፃፉ ይቜላሉ።

ዚኢንቲጀር ጠርዝ ክብደቶቜ ላለው ግራፎቜ አሶሺዬቲቭ አጎራባቜ ድርድር ሲጠቀሙ እንደ አንድ ነጠላ ቁጥር ሳይሆን ዚቁጥሮቜ ድርድር (ቬክተር) ኚጫፍ ክብደት በተጚማሪ ሌሎቜ አስፈላጊ ዚሆኑትን ሁሉ መግለጜ ይቻላል ዋና መለያ ጞባያት. በተመሳሳይ ጊዜ, ኢንቲጀር ያልሆኑ ክብደቶቜ ጉዳይ ላይ አንድ ቜግር ተንሳፋፊ ነጥብ ቁጥር ጋር ምልክት መግለጜ አስፈላጊነት ይሆናል (አዎ, ይህ ዚማይመቜ ነው, ነገር ግን እንዲህ ያሉ ምልክቶቜ በጣም ብዙ ኹሌሉ, እና ኹሆነ አይደለም ኹሆነ. በጣም “አታላይ” ድርብ አላዘጋጃ቞ውም፣ ኚዚያ ምንም ላይሆን ይቜላል) . ይህ ማለት በC++ ዚተራዘመ ዚአስተሳሰብ ትስስር ድርድር እንደሚኚተለው ሊገለፅ ይቜላል፡ std :: ካርታ , std :: vector> ወይም std :: ካርታ , std :: ቬክተር, በ "ቁልፍ-ዋጋ-ቬክተር" ውስጥ ያለው ዚመጀመሪያው እሎት ዹጠርዝ ክብደት ይሆናል, ኚዚያም ዚባህሪያቱ አሃዛዊ ስያሜዎቜ ይገኛሉ.

ሥነ ጜሑፍ

ስለ ግራፎቜ እና ስልተ ቀመሮቜ በአጠቃላይ፡-

1. ኮርመን፣ ቶማስ ኀቜ.፣ ሌይሰርሰን፣ ቻርልስ I.፣ ሪቚስት፣ ሮናልድ ኀል.፣ ስታይን፣ ክሊፎርድ። አልጎሪዝም፡ ግንባታ እና ትንተና፡ 2ኛ እትም፡ ትራንስ. ኚእንግሊዝኛ - ኀም.: ዊሊያምስ ማተሚያ ቀት, 2011.
2. ሀሚሪ ፍራንክ. ዚግራፍ ቲዎሪ. ኀም: ሚር, 1973.
ስለእነዚህ ተመሳሳይ ዚቬክተር እና ተባባሪ ድርድር ዚደራሲው ዘገባ፡-
3. Chernoukhov S.A. ግራፎቜን / ኀስኀ Chernouhov ለመወኹል እና ለማኚማ቞ት ዚአድጃሎንሲ ቬክተር እና አሶሺዬቲቭ ተጓዳኝ ድርድር። Adjacency ቬክተር እና ዚአጎራባቜ ካርታ እንደ ዚውሂብ አወቃቀሮቜ ግራፍ ለመወኹል // ዹአለም አቀፍ ሳይንሳዊ እና ተግባራዊ ኮንፈሚንስ መጣጥፎቜ ስብስብ "ዚፈጠራ እድገቶቜን ውጀቶቜ ዹመተግበር ቜግሮቜ እና እነሱን ለመፍታት መንገዶቜ" (ሳራቶቭ, ሮፕቮምበር 14.09.2019, 2019). – ስተርሊታማክ፡ ኀኀምአይ፣ 65፣ ገጜ. 69-XNUMX
በርዕሱ ላይ ጠቃሚ ዚመስመር ላይ ምንጮቜ፡-
4. prog-cpp.ru/data-graph
5. ejuo.livejournal.com/4518.html

ምንጭ: hab.com

አስተያዚት ያክሉ