【问题标题】:STL map like data structure to allow searching based on two keys类似于 STL 映射的数据结构,允许基于两个键进行搜索
【发布时间】:2014-02-01 00:39:17
【问题描述】:

我想制作一个类似地图的结构,以允许通过两个键进行搜索,这两个键都是字符串,这是一个示例:

我的班级;

人 p = s.find("大卫"); // 按名称搜索

// OR

p = s.find("XXXXX"); // 按 ID 搜索

我不想要代码解决方案,我只是想要一些帮助来开始,比如我可以用来实现我想要的结构,感谢帮助,伙计们,这是决赛周。

【问题讨论】:

    标签: c++ list vector map stl


    【解决方案1】:

    将您的记录放入向量(或列表)中。将指向记录对象的指针添加到两个映射中,一个带有一个键,一个带有另一个。

    【讨论】:

    • 通过一些工作,您甚至可以使用std::set_intersection 找到答案。
    【解决方案2】:

    有许多不同的方法可以实现这一目标。问题是:您的目标是插入、删除和查找操作的复杂性是什么?

    std::map 被实现为红黑树,它提供了令人难以置信的快速自平衡(旋转)和所有提到的操作(查找/查找、插入、删除),复杂性为O(log(n))。请注意,这适合单键的想法。

    使用 2 个键,您无法保持元素排序,因为基于一个键的顺序很可能与基于另一个键的顺序不同。最直接和最自然的方法是将记录存储在一个容器中,并将该容器使用的密钥保存在 2 种不同的结构中,一种为检索此键而优化,给定id,另一种用于检索它给定name

    如果存在将所有内容存储在一个地方的限制,而您希望优化支持两个不同键的查找操作,那么您可以创建一个 std::map<std::string, Person> 的包装器,其中每个元素将被包含两次(每次在不同的键下),即:

    std::map<std::string, Person> myContainer;
    ...
    Person p;
    std::string id = "1E57A";
    std::string name = "David";
    myContainer[id] = p;
    myContainer[name] = p;
    
    我可以想到这样做的两个好处:
    • 相当令人满意的表现:
      • 查找复杂O(log(2*n))
      • 插入和删除复杂O(2*log(2*n))
    • 极其简单的实现(使用现有容器)
      • 您只需要记住容器的“预期”大小是其实际大小的一半
      • 这两个键:idname 应该是 Person 的属性,这样当您找到给定其中一个键的具体元素时,您也会立即拥有另一个
    缺点是它会消耗 2 倍的内存,甚至可能存在以下约束:
    • names 中的任何一个都不应同时是其他人的 id,反之亦然(id 不应是其他人的 name

    【讨论】:

    • O(log(2*n)) 复杂度只是 O(log(n))。它不是一个很好的系统来谈论常数和因素。
    • @woolstar:O(log(2*n)) 只是一个更精确的评估,它明确表达了将容器尺寸加倍的成本。
    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多