มันจะขึ้นอยู่กับโครงสร้างข้อมูลของคุณ
สำหรับกราฟที่มีความหนาแน่นสูงที่มีขอบที่ไม่ได้บอกทิศทางคุณจะไม่สามารถเอาชนะรายการอาร์เรย์บิตที่เป็นตัวแทนของเมทริกซ์รูปสามเหลี่ยมได้ List<BitArray>
ตัวอย่างเช่น ตามหลักตรรกะแล้วมันจะมีลักษณะเช่นนี้:
0123
0
11
211
3001
41010
จากตรงนั้นคุณสามารถใช้ดัชนีของรูต BitArray เพื่อทำดัชนีลงในรายการที่เก็บข้อมูลโหนดของคุณ
ตัวอย่างเช่นการรับเพื่อนบ้านทั้งหมดของโหนดจะเป็นไปดังนี้:
// 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 เพื่อเก็บการเชื่อมต่อ ... เว้นเสียแต่ว่ามันจะเบาบางมากเมื่อเทียบกับจำนวนโหนดที่คุณสามารถไปที่รายการดัชนี