寻找合适的数据结构

时间:2014-05-12 13:21:47

标签: c++ c

我的数据如下:

  1->  (2,3),(4,5),(6,7),(8,2)      //up to 10000 values
  9->  (4,5),(7,90),(8,1),(9,10)    //up to 1000000 values
  11-> (9,10),(11,2),(12,1)
  ...

我想要一个适合快速查找两个键值的数据结构:行和列,因此find(9, 7)应该从上面的示例中提供90

请注意,值序列已经排序,并且我对查找时间比插入时间更感兴趣。

3 个答案:

答案 0 :(得分:3)

我推荐

map<int, set<pair<int, int> > >

std::set已排序容器。

请注意,您必须使用比较函数(operator<)声明该集合,以便它知道按其第一个元素对其对进行排序。

答案 1 :(得分:2)

我不确定我理解这个问题,但是......

map<int, vector<pair<int, int>>

是您示例的直接翻译。如果您的密钥不需要保持有序,请使用unordered_map

这在空间方面非常有效,因为向量只是连续地将所有对包装在内存中,并且每对只是一个具有两个字段的简单结构类对象。

答案 2 :(得分:1)

可以使用的容器是:

  • std::map<key,value>,提供对数时间查找
  • std::unordered_map<key,value>,提供持续时间查询
  • 排序std::vector<pair<key,value>>,它提供对数时间查找。它占用的空间比前两个少,但构建速度较慢,查找代码更复杂。

似乎符合您要求的最简单的事情是:

std::unordered_map<int, std::unordered_map<int,int> >

请注意,这会丢弃一些信息,因为值类型不再排序......但查找行为应该仍然很好。

如果你想出于某种原因保持排序(请在声明速度之前先进行基准测试),你可以使用

std::unordered_map<int, std::vector<std::pair<int,int> > >

并使用标准库提供的二进制搜索算法(例如std::lower_bound)。