用于表示图形的高效数据结构

时间:2019-06-18 13:32:39

标签: c data-structures graph

我必须实现一个有向图(有向图),该图被允许具有多个弧(多图),就像在链接的图像中一样。该图必须进行优化以处理许多节点,但要处理其中两个之间的一些边。该图必须经常更新,并且必须支持有效的路径搜索。哪种有效的数据结构可以在查询使用的空间和时间之间取得折中?语言是标准的C语言(仅libc)。

graph example

2 个答案:

答案 0 :(得分:2)

假设您有NODE_COUNT个节点。您创建长度为GRAPH的向量NODE_COUNT。在条目X上,您有一个可变大小的数组(动态分配)。每个条目看起来像GRAPH[X]=[A1, A2, A3],代表边缘{ (X,A1), (X,A2), (X,A3) }

如果需要搜索某些边缘,在条目GRAPH[X]上使用二叉搜索树也很方便。如果每个节点的边缘多于6条,则也可以考虑这种可能性,而不是在位置GRAPH[X]上使用无序数组。

由于图形具有许多节点,并且边缘很少,因此不应该使用矩阵。

如果您有数百万或数十亿个节点,那么问题就不一样了,您应该考虑使用BDDs。这是另一个主题,我不在此线程中输入详细信息。这个想法是,图可以表示为代表该图的集合的特征函数。

答案 1 :(得分:0)

您可以使用邻接矩阵。它本质上是一个显示邻接列表的2D数组。 adjaceny matrix

这是一个例子。我相信它们相当快,需要θ(1)时间才能确定图中是否存在边。

如果“频繁更新”是指更新边缘,这将是很好的,因为它需要花费恒定的时间来更新值之一。 (即,添加edge(3,2)将花费固定时间,因为您只需将矩阵中3,2处的值递增即可)

对于确定最短路径,Dijkstra的算法将是您最好的选择。