【问题标题】:Need to choose a container to store my data需要选择一个容器来存储我的数据
【发布时间】:2014-05-27 11:18:57
【问题描述】:

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

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

如果我将它保存在以“名称”为键的地图中,如果我通过“描述”、“电话号码”或“电子邮件”进行搜索,我将不得不执行线性搜索。

我的问题是:我有没有更好的方法来保存数据以加快搜索速度?

【问题讨论】:

  • '我将不得不执行线性搜索......'您可以添加额外的索引映射,使用指向原始ContactInfo 实例的共享指针,以及您需要的各种搜索键需要。
  • @DieterLücking 这是为了上课,除了stl,我什么都不用。我猜 πάντα ῥεῖ 的解决方案是我唯一的选择
  • 你能根据颜色和大小对汽车进行分类吗?不是真的,如果你按颜色排序,那么你的尺寸就乱了,如果你按尺寸排序,那么你的颜色就会混淆。所以你的选择很明显:见评论 1。
  • 您应该使用更多空间来加快搜索速度。

标签: c++ algorithm search


【解决方案1】:

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

如果您希望在多个字段上建立索引,您有几种解决方案:

  1. 最简单:使用多个容器,每个容器都在自己的字段上建立索引并保留记录的副本(更新记录变得很痛苦)
  2. 再难一点:使用多个容器,每个容器都有自己的字段索引并共享记录 (std::shared_ptr<ContactInfo>)
  3. 更难:与上一个相同,但使用拥有记录的“主”容器以提高效率(并减少间接性)

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

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

【讨论】:

  • 我实际上使用了选项 2,尽管使用了简单的指针。我将移至 shared_ptrs。感谢您的帮助。
  • @gbjbaanb:阅读问题上的 cmets,只允许使用标准库。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2011-05-14
    • 2011-05-12
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多