相邻名单:
我们正在创建一个列表,每个节点也指向另一个列表。您的列表将包含 N元素,并且每个元素将指向一个列表,该列表的项数等于该节点的邻居数(查看图像以获得更好的可视化效果)。所以它占用的内存空间与 N + m成正比。检查(u,v)是否是一条边将需要 O (deg (u))时间,其中 deg (u)等于 u 的邻居数。因为最多只能迭代 u 指向的列表。识别所有的边将需要 Θ (n + m)。
这个实现的一个小的折衷是,它将具有空间复杂度 O (V + 2E) ,而不是常规邻接列表中的 O (V + E) ,因为边在这里表示两次(因为每个顶点都有自己的散列边集)。但是像 AddVertex,AddEdge,RemoveEdge这样的操作可以通过这个实现在分摊时间 O (1)中完成,除了 移除顶点,它将像数组索引查找字典一样在邻接矩阵中分摊 O (V)。这意味着除了实现的简单性,邻接矩阵没有任何特定的优势。我们可以节省空间的稀疏图与几乎相同的性能在这个邻接列表实现。
有关详细信息,请参阅下面 Github C # 存储库中的实现。注意,对于加权图,它使用嵌套字典代替字典-哈希集合组合,以适应加权值。类似地,对于有向图,有单独的散列集用于输入和输出边。