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

Need to choose a container to store my data

本文关键字:存储 数据 我的 一个 选择      更新时间:2023-10-16

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

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();
};

如果我把它放在以"名称"为关键字的地图中,如果我搜索"描述"、"电话号码"或"电子邮件",我将不得不执行线性搜索。

我的问题是:我有更好的方法来保存数据,以便更快地进行搜索吗?

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

如果你想在多个字段上建立索引,你有几个解决方案:

  1. 最简单的方法是:使用多个容器,每个容器都在自己的字段上建立索引,并保留记录的副本(更新记录会很麻烦)
  2. 更难的是:使用多个容器,每个容器都在自己的字段上建立索引,共享记录(std::shared_ptr<ContactInfo>
  3. 更难:与前一个相同,但使用拥有记录的"主"容器可以提高效率(减少间接性)

在您的情况下,如果您必须更新记录,我将从(1)开始,然后转到(2)。

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

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