需要选择一个容器来存储我的数据

时间:2014-04-13 14:45:49

标签: c++ algorithm search

我有一个数据,我需要对其进行搜索和排序。数据只是一堆结构对象,看起来像这样:

struct ContactInfo {
    std::string name;
    std::string description;
    std::string phoneNumber;
    std::string email;

    ContactInfo(std::string name, std::string phone, std::string email, std::string desc);
    ContactInfo();
};

如果我将其保存在以“名称”为关键字的地图中,如果我搜索“description”,“phoneNumber”或“email”,我将必须执行线性搜索。

我的问题是:我有更好的办法让数据保持更快的搜索速度吗?

2 个答案:

答案 0 :(得分:1)

关联STL容器(mapunordered_map)围绕单个索引的最典型情况构建。

如果您希望在多个字段上编制索引,则可以使用以下几种解决方案:

  1. 最简单:使用多个容器,每个容器都在自己的字段上编制索引并保留记录的副本(更新记录会变得很痛苦)
  2. 比较难:使用多个容器,每个容器都在自己的字段上编制索引,共享记录(std::shared_ptr<ContactInfo>
  3. 更难:与之前相同,但使用&#34;主人&#34;拥有记录以提高效率(并减少间接)的容器
  4. 在您的情况下,如果您需要更新记录,我会从(1)开始并转到(2)。

    请记住,更新是一项复杂的任务,因为每次更新记录时都必须在更新的字段上重新编制索引。为了简化查找​​,您可以在每个容器中保留一个迭代器来引用该项,并使用它们进行擦除而无需查询:当您将项目放入{{insert时,调用map会返回此迭代器。 1}}(或unordered_map)。

答案 1 :(得分:0)

如果您希望能够在为多个字段指定查询值的情况下进行查询,那么如果字段总数很大,则每个查询获得最佳O(1)运行时间是一个痛苦的问题。但是,听起来您只想一次基于一个字段值进行查询。为此,只需使用Hashmap或您正在使用的任何名称来快速按名称编制索引,并对所有其他字段执行相同的操作。由于您需要O(#records *#fields)存储来存储您的原始数据,并且每个Hashmap或已排序的数组或您正在使用的任何内容都具有大小为O(#records),如果您执行此操作,则您拥有#fields对于每个字段,存储总量渐近地不大于原始数据存储大小(当然,您需要存储指向搜索结构中记录的指针而不是记录本身才能获得此存储绑定)。