我有一个有序图,当我加载边时,我使用哈希表来查找顶点。边缘按源排序,因此我只需要查找“更深”的顶点。如果给定边缘具有级别 n 上的源顶点,则接收器顶点必须处于 m 级别,其中 m> Ñ即可。我需要利用这种行为来提高性能。
“理想的”天真解决方案是每个级别的哈希表,我可以使用该级别查找正确的表,然后在表中找到该元素。这也将使我能够在 n (源级别)大于级别时回收内存的额外好处。不幸的是,图表对于这种方法而言太大了,10 ^ 6级别和10 ^ 9个顶点。
有没有人对我应该关注的数据结构有任何建议? 格拉西亚斯
答案 0 :(得分:0)
根据你对问题的大小估计,我建议使用向量向量:外向量包含每个级别的一个内向量,因此它包含大约1百万个条目;内部向量(每个包含大约1000个条目?)应按排序顺序保存,并使用lower_bound()
等进行排序插入。
你可以通过复制/交换技巧回收内存,用空的替换旧的,未使用的内部向量。
typedef std::vector<Node> level_nodes;
typedef std::vector<level_nodes> graph_nodes;
graph_nodes g;
r.reserve(1000000); // OK, just a few MB
// ...
g[12].insert(std::lower_bound(g[12].begin(), g[12].end(), x), x);
level_nodes().swap(g[11]); // kill level 11 and reclaim memory