Ini akan tergantung pada struktur data Anda.
Untuk grafik yang padat dengan tepi yang tidak terarah, Anda tidak bisa mengalahkan daftar bit array yang mewakili matriks segitiga. A List<BitArray>
misalnya. Logikanya, akan terlihat seperti ini:
0123
0
11
211
3001
41010
Dari sana, Anda dapat menggunakan indeks root BitArray untuk mengindeks ke daftar yang menyimpan data simpul Anda.
Misalnya, mendapatkan semua tetangga dari simpul akan seperti:
// 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];
}
}
(perhatikan bahwa Anda juga dapat memilih jenis indeks, tergantung pada jumlah data, menjadi byte atau ushort atau sesuatu di sepanjang baris tersebut karena semua indeks akan positif. Saya tidak menganggap ini sebagai optimasi mikro karena sepele)
Untuk grafik yang diarahkan, Anda akan pergi rute array * n bit untuk menyimpan konektivitas ... kecuali itu sangat jarang dibandingkan dengan jumlah node, di mana Anda dapat pergi ke daftar indeks kedekatan.