【问题标题】:C++ Map : Smart algorithm neededC++ Map:需要智能算法
【发布时间】:2013-02-23 05:00:17
【问题描述】:

我有 3 个文件。 F1,F2,F3。 F1 是具有 200K 条目的主文件。 F2 和 F3 可以包含超集或条目的子集(300K 或 100K)。我的目标是得出 F1 中不在 F2 和 F3 中的条目列表。到目前为止,这就是我实现它的方式。

  1. 在 C++ STL 映射中加载 F1 条目。
  2. 开始读取 F2。如果条目匹配,则减少计数(而不是从映射中删除)。计数 = F1 开始的大小。如果计数为 0,那么我知道 F1 中的所有条目都已在 F2 中找到,因此无需在 F2 中进一步遍历或遍历 F3。
  3. 我没有从我的映射中“删除”条目的原因是我读到 C++ STL 映射是一个二叉树。看看我的条目,我的树绝对不可能是平衡的二叉树。这是一棵极深的树。因此,任何擦除操作都变得昂贵。查找操作也可能很昂贵,但擦除操作必须在每次删除时重新创建树。
  4. 所以现在的问题是我如何到达 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


【解决方案1】:

由于您在 cmets 中说您的输入已经排序,因此完全避免使用容器:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    ifstream f1("f1.data"), f2("f2.data"), f3("f3.data");
    string f1entry, f2entry, f3entry; 

    while ( getline(f1,f1entry) ) {
        while ( f2 && f2entry < f1entry ) getline(f2,f2entry);
        while ( f3 && f3entry < f1entry ) getline(f3,f3entry);
        if ( f1entry != f2entry
          && f1entry != f3entry )
            cout << f1entry << '\n';

    }
}

【讨论】:

    【解决方案2】:

    不知道你是从哪里得出这个结论的:

    我的树绝对不可能是平衡的二元树 树。

    但这是错误的。您对 std::map 的工作方式有奇怪的想法,并尝试根据这些想法过早地对其进行优化。因此,只需从地图中删除项目,从地图中的 F2 和 F3 删除元素后剩下的就是您需要的。如果标准映射不够快,请尝试哈希映射,即 unordered_map。

    PS 并且应该设置和 unordered_set

    【讨论】:

      【解决方案3】:

      为什么不同时读取 F2 和 F3 并将它们放入无序集合中。

      读F1,吐出这个集合中没有的物品。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 2010-12-29
        • 2021-04-23
        • 1970-01-01
        • 2016-10-17
        • 2010-11-22
        • 1970-01-01
        相关资源
        最近更新 更多