【问题标题】:Which dataset should I use?我应该使用哪个数据集?
【发布时间】:2023-03-12 15:00:01
【问题描述】:

标题可能有点含糊,但我会感谢我对当前问题的一些想法。

这是一个数据集:

1   1/1/2013
2   1/1/2013
3   1/1/2013
1   1/2/2013
2   1/2/2013
1   1/3/2013
2   1/3/2013
3   1/3/2013

所以,我从第一条记录开始,看看我的列表中是否还有另一个 1。如果有,我忽略它,并返回第二条记录。如果我的列表中还有另外 2 个,我会忽略它,并返回到第 3 个记录,依此类推。

现在,我正在寻找的这个列表的期望结果是 ,因为它下面不存在 1 的其他记录。

同样,在这个数据集中:

1   1/1/2013
2   1/1/2013
3   1/1/2013
1   1/2/2013
2   1/2/2013
3   1/2/2013
4   1/2/2013
1   1/3/2013
2   1/3/2013
3   1/3/2013

所需的结果是 ,因为列表中没有其他 4 出现。

我的问题是,我该怎么做呢,我可以使用什么标准的 STL 容器?此外,这些是查询返回的结果。

很抱歉,我不使用 boost 或任何其他库,并希望通过 std 变量来完成这项工作。

【问题讨论】:

    标签: c++ algorithm sorting stl


    【解决方案1】:

    您可以使用两个映射 - 一个映射存储从键(您的第一列)到值(您的第二列)的映射,第二个映射存储从键(您的第一列)到记录号的映射:

    std::map<int, std::string> m1;
    std::map<int, int> m2;
    
    int counter = 0;
    while (...)
    {
      <...get record...>
      m1[record.key] = record.value;
      m2[record.key] = counter++;
    }
    

    然后你需要扫描第二张地图 m2 以找到位置最小的键:

    int keyMin = <...big number...>, posMin = <...big number...>;
    for (std::map<int, int>::const_iterator it = m2.begin(); it != m2.end(); ++it)
    {
      if (it->second < posMin)
      {
        keyMin = it->first;
        posMin = it->second;
      }
    }
    

    结果将是第一个键,以后没有该键的记录。使用此键和第一张地图 m1 您将能够找到其对应的值。

    【讨论】:

    • 那么,如果元素已经存在,我该怎么办?当我插入 时,m[1] 会发生什么?
    • 如果你为同一个“key”插入一个新的“value”,那么旧的“value”将会丢失——这就是你想要的,对吧?映射由对(键、值)组成,键是唯一的。
    • 所以 - 在地图中插入所有数据,然后对于每个“键”(您的第一列),您将获得 最新“值”(您的第二列) .
    • 我不想要最新的值。请看我的例子,它是列表中不再出现的值。
    • 你对你想要什么的描述有点模糊。例如,在您的第一个数据集中,您可以选择 因为(如您所写)“它下面不存在 2 的其他记录”。可能是,您正在寻找具有此条件的 first 记录?
    【解决方案2】:

    您可以从底部开始检查,并记住每个索引的第一次(从顶部数到最后一次)出现。在你完成这个之后(时间 O(n))你可以拿走你找到的最后一个。

    【讨论】:

      【解决方案3】:

      查询返回什么?如果它返回一个已知的结构,你可以选择std::vector&lt;some-structure&gt;,或者如果它返回一个字符串列表,你可以选择std::vector&lt;std::vector&lt;std::string&gt; &gt;。 然后从底部开始并记住所有你看到的唯一 ID,你能够在 o(n) 时间和 o(n) 内存中获得最后一个好的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 2011-02-22
        • 2022-10-25
        • 1970-01-01
        相关资源
        最近更新 更多