Nó sẽ phụ thuộc vào cấu trúc dữ liệu của bạn.
Đối với một biểu đồ dày đặc với các cạnh không được xác định, bạn thực sự không thể đánh bại một danh sách các mảng bit biểu thị một ma trận tam giác. Một List<BitArray>
ví dụ. Theo logic, nó sẽ trông như thế này:
0123
0
11
211
3001
41010
Từ đó, bạn có thể sử dụng chỉ mục của BitArray gốc để lập chỉ mục vào danh sách lưu trữ dữ liệu nút của bạn.
Ví dụ: nhận được tất cả các hàng xóm của một nút sẽ như sau:
// 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];
}
}
(lưu ý rằng bạn cũng có thể chọn loại chỉ mục, tùy thuộc vào lượng dữ liệu, là byte hoặc ushort hoặc thứ gì đó dọc theo các dòng đó vì tất cả các chỉ mục sẽ dương. Tôi không coi đây là tối ưu hóa vi mô vì nó tầm thường)
Đối với biểu đồ có hướng, bạn sẽ đi theo tuyến của một mảng * n để lưu trữ kết nối ... trừ khi nó rất thưa so với số lượng nút, nơi bạn có thể đi đến danh sách các chỉ số kề.