यह आपके डेटा की संरचना पर निर्भर करने वाला है।
अप्रत्यक्ष किनारों के साथ घने ग्राफ के लिए, आप वास्तव में त्रिकोणीय मैट्रिक्स का प्रतिनिधित्व करने वाले बिट सरणियों की सूची को हरा नहीं सकते हैं। एक List<BitArray>
उदाहरण के लिए। तार्किक रूप से, यह इस तरह दिखेगा:
0123
0
11
211
3001
41010
वहां से, आप रूट बिटअरे के सूचकांक को एक सूची में सूचीबद्ध करने के लिए उपयोग कर सकते हैं जो आपके नोड डेटा को संग्रहीत करता है।
उदाहरण के लिए, नोड के सभी पड़ोसियों को प्राप्त करना इस तरह होगा:
// C#
List<Node> Nodes = /* populated elsewhere */
List<BitArray> bits = /* populated elsewhere */
public static IEnumerable<Node> GetNeighbours(int x)
{
for (int i = 0; i < bits[idx].Count; i++)
{
if (this.bits[idx][i])
yield return this.Nodes[i];
}
for (int i = 0; i < this.Nodes.Count; i++)
{
if (idx < this.bits[i].Count && this.bits[i][idx])
yield return this.Nodes[i];
}
}
(ध्यान दें कि आप डेटा की मात्रा के आधार पर, अनुक्रमणिका प्रकार भी चुन सकते हैं, बाइट या ushort होने के लिए या उन रेखाओं के साथ कुछ ऐसा हो जो सभी अनुक्रमणिका सकारात्मक हो। मैं इसे सूक्ष्म-अनुकूलन नहीं मानता क्योंकि यह तुच्छ है)
एक निर्देशित ग्राफ के लिए, आप कनेक्टिविटी को संग्रहीत करने के लिए बिट्स के एक * n सरणी के मार्ग पर जाएंगे ... जब तक कि नोड्स की संख्या की तुलना में यह बहुत विरल न हो, जहां आप सूचकांकों की आसन्न सूची में जा सकते हैं।