除了邻接表或邻接矩阵之外,还有其他数据结构可以表示图吗?

Is there any other Data structure to represent Graph other than Adjacency List or Adjacency Matrix?

我一直在寻找不同的数据结构来表示图形,我偶然发现了 Nvidia CUDA 工具包,并在 source_indices、destination_offsets.[=10= 的帮助下找到了表示图形的新方法]

我被这种创新的图形表示法所吸引,开始寻找其他表示图形的方法。但是没有发现任何新东西。

我想知道除了邻接矩阵或列表之外是否还有其他方法来表示图...

I was wondering if there was any other way to represent Graph other than Adjacency Matrix or Lists...

有替代邻接表或邻接矩阵的方法,例如边列表邻接图转发 star 等等。给定这张图(图片取自 here):

  • 这是邻接矩阵表示:

  • 这是邻接表表示法:

  • 这将是另一种选择,边缘列表:

  • 另一个很常见的是前向星表示:

如果你进入这个研究领域,你会发现很多方法,主要是针对特定情况的优化,同时考虑到因素如:

  • 图表大小(节点数)
  • 图表的密度
  • 有向图或无向图
  • 静态或动态图
  • 在编译时已知或在运行时构建的图
  • 节点 ID(按顺序标记或不标记)
  • ...

例如,这些优化可以支持预处理阶段重新排序节点以增加参考位置最短路径算法有很多工作要做,特别是在计算世界地图中的最短路径时。

优化的一个例子是动态图结构Packed-Memory Graph (PMG)),它适用于large-scale交通网络

还有另一种使用邻接集表示图的方法。它与邻接表非常相似,但不是使用链表,而是使用不相交集 [Union-Find]。您可以阅读不相交集 ADT here.

若E为边数,V为图中顶点数,则图的邻接集表示占(E+V)space.

使用邻接集表示时其他操作的复杂性:

Checking edge between vertex v and w : log(Degree(v))
Iterate over edges incident to vertex v: Degree(v)