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