我应该使用哪个数据集?

时间:2013-12-05 00:10:37

标签: c++ algorithm sorting stl

标题可能有点模糊,但我会对我目前遇到的问题有所了解。

这是一个数据集:

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

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

现在,我要查找的此列表的期望结果是< 1,1 / 3/2013>,因为在它下面不存在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/1/2013>,因为列表中没有其他4个出现。

我的问题是,我该如何做到这一点,我可以使用什么样的标准STL容器?此外,这些是查询返回的结果。

对不起,我不使用boost或任何其他库,并希望使用std变量完成此操作。

3 个答案:

答案 0 :(得分:2)

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

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 ,您将能够找到其对应的值。

答案 1 :(得分:1)

您可以从底部进行检查,并记住每个索引的第一个(从顶部算起的最后一个)外观。在你完成这个之后(在时间O(n)中)你可以选择你找到的最后一个。

答案 2 :(得分:0)

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