问题是我有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;
}
我阅读了很多关于存储图形的方法的文章,但是没有找到这种巨大图形的真正好的解决方案。 任何想法我都会很高兴。谢谢
答案 0 :(得分:6)
你走在正确的道路上。
我建议的一些小改动:
struct Graph
{
unsigned int nodesAmount;
unsigned int arcsAmount;
vector<Node> NodeArr; // Store the nodes directly, not pointers
}
struct Node
{
unsigned int id;
int dimension; //how many arcs use this node
vector<int> Neighbours; // store neighbour IDs, saves memory
}
由于您在数据库和C之间移动,我强烈建议不要使用指针,因为那些不会转换。使用ID并按ID查找节点。如果你需要分别存储边缘,那么也可以通过ID而不是指针来完成。
答案 1 :(得分:2)
我知道此解决方案与您的代码段无关,但我想以另一种方式向您展示。
经常使用的选项是有两个数组 - 一个用于边,一个用于顶点。
顶点数组指向边数组,并说明相邻顶点的起始位置。 edges数组存储相邻的顶点。
例如:
V = 6, E = 7
vertices = [0, 1, 1, 2, 5, 6]
edges = [1, 2, 3, 4, 5, 6, 0]
考虑索引,edge数组看起来像:
| [1] | [] | [2] | [3, 4, 5] | [6] | [0] |
所以第一个顶点有一个相邻的顶点(id为1),第五个顶点有3个相邻的顶点,ID为3,4,5等。