【发布时间】:2013-12-10 10:31:09
【问题描述】:
问题是我有 150 000+ 个节点,其中 200 000+ 个(可能会变化到 1 000 000 甚至更多)所有这些节点都被写入数据库。 现在我想创建一个普通图,它将打开对路由的访问。所以,我需要使用现有数据库中的数据来组合它。 我们的想法是构建这个巨大的图表,将其分成小块并写入 DB BLOBS 进行存储。我尝试以递归方式构建它,但在我看来,堆栈无法存储这么多数据,而且我的算法一直因分配错误而中断。所以,现在我对一种允许我构建这个图表的方式有点困惑。我正在考虑某种迭代方法,但主要问题是架构,我的意思是我将用于存储节点和弧的结构。 当我看到这个解决方案时,它应该是这样的:
struct Graph
{
unsigned int nodesAmount;
unsigned int arcsAmount;
vector<Node*> NodeArr; //Some kind of container to store all existing Nodes
}
struct Node
{
unsigned int id;
int dimension; //how many arcs use this node
vector<Arcs*> ArcArr;
}
struct Arcs
{
unsigned int id;
double cost;
Node* Node_from;
Node* Node_to;
}
我阅读了很多关于存储图形的方法的文章,但是对于如此庞大的图形并没有找到真正好的解决方案。 我会很高兴有任何想法。谢谢
【问题讨论】:
-
深思熟虑:您可以使用(稀疏?)数组或矩阵,而不是使用链表。每个节点都有一个 id(无符号整数),矩阵可以是
<pseudocode> matrix<uint, uint, bool> </pseudocode>。该矩阵将表示邻接矩阵:True 表示存在从节点 x 到节点 y 的弧。 -
@ibizaman 实际上我正在考虑使用矩阵,但它似乎很大并且有很多零。这就是为什么我正在寻找另一种方式
-
这就是稀疏矩阵出现的地方。它只存储非零值。顺便说一句,Danstahr 的回答是更好地考虑空间使用情况。
标签: c++ database graph architecture