【问题标题】:C++ data structure to combine lookup and ordered data用于组合查找和有序数据的 C++ 数据结构
【发布时间】:2010-11-28 21:07:19
【问题描述】:

我有一个排序图,当我加载边时,我使用哈希表来查找顶点。边缘按源排序,因此我只需要查找“更深”的顶点。如果给定边的源顶点在 n 级别,则汇顶点必须在 m 级别,其中 m > n。我需要利用这种行为来提高性能。

“理想”的幼稚解决方案是每个级别的哈希表,我可以使用该级别找到正确的表,然后在表中找到元素。这也让我能够在源级别 n 大于级别时回收内存的额外好处。不幸的是,图表对于这种方法来说太大了,10^6 个级别和 10^9 个顶点。

有人对我应该查看什么数据结构有任何建议吗? 格拉西亚斯

【问题讨论】:

  • 为什么每个级别都需要一个哈希表?仅仅拥有一个普通的图结构有什么问题(为每个节点分配内存并有一个从每个节点到每个接收器的指针)?这仍然可以让您查找任何顶点,给定它的地址,并且从每个顶点中您可以找到它指向的所有顶点。也许我不明白您需要执行哪些操作。
  • 我正在创建和“着色”图表。我有一个包含所有边的文件,当我遇到新顶点时读取文件时,我给它一个颜色。问题是我只想为新顶点着色,我不想保留所有顶点的“平面”散列。我找不到节点并查找其邻居,因为我仍在创建图形,或者更确切地说是从磁盘加载它。

标签: c++ stl hashtable


【解决方案1】:

鉴于您对该问题的大小估计,我建议使用向量向量:外部向量包含每个级别的内部向量,因此它包含大约 100 万个条目;内部向量(每个包含大约 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

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多