【发布时间】:2014-02-01 00:39:17
【问题描述】:
我想制作一个类似地图的结构,以允许通过两个键进行搜索,这两个键都是字符串,这是一个示例:
我的班级;
人 p = s.find("大卫"); // 按名称搜索
// OR
p = s.find("XXXXX"); // 按 ID 搜索
我不想要代码解决方案,我只是想要一些帮助来开始,比如我可以用来实现我想要的结构,感谢帮助,伙计们,这是决赛周。
【问题讨论】:
我想制作一个类似地图的结构,以允许通过两个键进行搜索,这两个键都是字符串,这是一个示例:
我的班级;
人 p = s.find("大卫"); // 按名称搜索
// OR
p = s.find("XXXXX"); // 按 ID 搜索
我不想要代码解决方案,我只是想要一些帮助来开始,比如我可以用来实现我想要的结构,感谢帮助,伙计们,这是决赛周。
【问题讨论】:
将您的记录放入向量(或列表)中。将指向记录对象的指针添加到两个映射中,一个带有一个键,一个带有另一个。
【讨论】:
std::set_intersection 找到答案。
有许多不同的方法可以实现这一目标。问题是:您的目标是插入、删除和查找操作的复杂性是什么?
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))
id 和 name 应该是 Person 的属性,这样当您找到给定其中一个键的具体元素时,您也会立即拥有另一个names 中的任何一个都不应同时是其他人的 id,反之亦然(id 不应是其他人的 name)【讨论】:
O(log(2*n)) 只是一个更精确的评估,它明确表达了将容器尺寸加倍的成本。