【发布时间】:2013-02-23 05:00:17
【问题描述】:
我有 3 个文件。 F1,F2,F3。 F1 是具有 200K 条目的主文件。 F2 和 F3 可以包含超集或条目的子集(300K 或 100K)。我的目标是得出 F1 中不在 F2 和 F3 中的条目列表。到目前为止,这就是我实现它的方式。
- 在 C++ STL 映射中加载 F1 条目。
- 开始读取 F2。如果条目匹配,则减少计数(而不是从映射中删除)。计数 = F1 开始的大小。如果计数为 0,那么我知道 F1 中的所有条目都已在 F2 中找到,因此无需在 F2 中进一步遍历或遍历 F3。
- 我没有从我的映射中“删除”条目的原因是我读到 C++ STL 映射是一个二叉树。看看我的条目,我的树绝对不可能是平衡的二叉树。这是一棵极深的树。因此,任何擦除操作都变得昂贵。查找操作也可能很昂贵,但擦除操作必须在每次删除时重新创建树。
- 所以现在的问题是我如何到达 F2 中存在的条目列表。我是否维护一个带有布尔标志“found = true or false”的结构?暗示在完成 F2 和 F3 之后,我会遍历整个 STL 映射 - 然后查找找到 = false 的值,然后开始将增量写入文件?
有什么聪明、有效的方法吗?
【问题讨论】:
-
您知道文件中条目的顺序吗?例如,它们是否以某种自然的(和文件间一致的)顺序排序?如果是这样,您可以通过各种方式利用它……如果不是,使用
std::unordered_map而不是std::map(即哈希表而不是树)是一个明显的变化。 -
您的问题不清楚。一开始你说你的目标是找到 F1 中不在 F2 或 F3 中的条目,然后你说你需要找到 F2 中存在的条目。您究竟需要什么作为输出/结果?
-
对不起。我的意思是问,到达 F1 中不在 F2 和 F3 中的条目。 F1、F2 和 F3 中的所有条目都已排序,它们本质上是带有文件名的目录路径。所以条目就像 a/a1/b, a/a1/b/c, a/a1/b/c/d, a/a2, a/a2/b, a/a2/b/b1, a/a2 /b/b1/c 等无序地图有意义吗?还有其他方法可以实现吗?
-
改变它有什么意义 std::set 删除那个奇怪的标志并直接使用删除实现,然后看看从红黑树中擦除元素是否昂贵。
-
有一些算法可以平衡二叉树 - en.wikipedia.org/wiki/Self-balancing_binary_search_tree
标签: c++ data-structures