【问题标题】:effective search with multi key map使用多键映射进行有效搜索
【发布时间】:2014-10-26 07:41:02
【问题描述】:

我有一个以键为结构的地图。 struct(key) 包含两个字符串 x 和 y。

两个键的 x 值可以相同,但 y 值肯定不同。

我很好奇使用这两个键寻找最佳价值。

【问题讨论】:

  • 用代码解释自己。
  • 添加到上面...映射结构(上面提到的)作为键和值另一个结构。我可以在其中获得接近 O(1) 的插入/删除/搜索吗?
  • 您可以使用哈希算法来获取地图的唯一键
  • A std::map 被实现为平衡二叉树,永远不会是 O(1),但相对来说很少会出现缓慢的问题。它保持一个排序的顺序 - 这在迭代时很明显 - 所以如果你关心你迭代元素的顺序 - 或者很高兴它主要是 y 然后是 x - 考虑首先比较 y 如果它更有可能有所不同。如果您不需要订单,std::unordered_map 可能是一个选项 - 您可以找到一个 hash_combine 函数来组合各个字符串的哈希值。大量示例说明如何在 SO 和其他地方完成所有这些操作。
  • 进一步提示 - 如果您使用std::pair<std::string, std::string> 作为键而不是您自己的struct,那么std::map 将知道如何比较它们(.first 是主键,@987654331 @二级)。

标签: c++ search map


【解决方案1】:

map 应该只包含每个键值一次。这就是为什么它可以为操作员[] 提供唯一地址特定键的原因。

如果同一个键有多个值,则应改用multimaps。使用多图,您必须使用 find() 来访问这些值。

您可以尝试这个小而非常基本的示例:

std::map<char, int> mymap;              // unique key 
std::multimap<char, int> mymulti;       // non-unique key 

mymap.insert(std::pair<char, int>('a', 10));        
mymap.insert(std::pair<char, int>('b', 15));
mymap.insert(std::pair<char, int>('b', 20));    // problem: will not be inserted !  
mymulti.insert(std::pair<char, int>('a', 10));
mymulti.insert(std::pair<char, int>('b', 15));
mymulti.insert(std::pair<char, int>('b', 20));  // no problem
mymulti.insert(std::pair<char, int>('c', 25));
std::cout << "First:\n";             // b is there only once
for (auto x : mymap) std::cout << x.first << ":" << x.second << "\n";
std::cout << "\nSecond:\n";           // b is ther twice
for (auto x : mymulti) std::cout << x.first << ":" << x.second << "\n";

std::cout << "first[b]=" << mymap['b'] << std::endl;    // map access (direct)
std::cout << "Second[b]={";                             // multimap access  (iterator)
for (auto x = mymulti.find('b'); x != mymulti.end() && x->first == 'b'; x++) std::cout << x->second << " ";
std::cout << "}\n";

maps 和 multimaps 通常都实现为二叉搜索树。所以搜索效率很高。

【讨论】:

  • 抱歉造成混淆......我可以使用 map 因为我用作键的 pair 肯定是唯一的,因为 y 是唯一的。问题是如何使用这两个键以有效的方式插入/删除/搜索。
猜你喜欢
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2021-05-28
  • 1970-01-01
  • 2014-06-07
相关资源
最近更新 更多