存储用于最短路径计算的巨大图表

时间:2013-02-03 17:09:30

标签: java mysql

我正在尝试在MySQL数据库中存储一个超过5GB的未加权有向图,以便以有效的方式查找最短路径。 目前它存储在一个包含列源和comlumn目标(逗号分隔)的表中,但我感觉这不是要走的路,所以我打算将它转换为带有顶点和表的表有边缘。

我有两个问题:

  1. 存储图表的最佳方法是什么?
  2. 我应该使用什么最短路径算法?

2 个答案:

答案 0 :(得分:2)

你应该有两张桌子。一个用于节点,一个用于边缘。在edge表中,您应该有source_node_id和dest_node_id。这样,您可以轻松地对边缘表进行查询,以获取Dijkstra算法使用的所有传出节点。

对于简单的Dijksra算法解释,请参阅: http://www.sce.carleton.ca/faculty/chinneck/po/Chapter8.pdf

答案 1 :(得分:1)

另一种存储密集图的非常有效的方法(稀疏图不是那么有效)是使用邻接矩阵。这是一个解释它的链接 -

Storing graphs using adjacency matrix

现在,要在MySQL数据库中存储矩阵,您必须使用rowid作为行的顶点id(假设您将顶点标识​​为1,2,...)。列可以再次是正常的顶点名称或顶点ID。您可以保留一个将顶点名称映射到ID的表。

您将面临的一个问题是最大列数。如果矩阵太大,则可能必须将列拆分为多个表。如果您有一个索引方案/散列方案,可以立即告诉您所需节点的表名,那么查询应该相对较快。

对于其他人提到的最短路径,Dijkstra算法是最好的最短路径寻找算法。