以相反顺序搜索多图

时间:2011-04-05 14:48:03

标签: c++ algorithm stl complexity-theory multimap

是否存在以对数复杂度以相反顺序搜索多图(C / C ++ STL)的方法?

4 个答案:

答案 0 :(得分:3)

您的问题可以通过两种方式解释。如果你的意思是你插入了一堆具有相同键的元素,并且想要找到带有该键的最后插入元素,那么你可以尝试equal_range(key),它返回一对迭代器(一个指向第一个元素,另一个是最后一个元素。但是我不知道multimap是否对存储具有相同密钥的元素的顺序提供任何保证。

或者,如果您想要以相反的顺序遍历multimap,则可以使用rbegin()rend()来获取反向迭代器。

答案 1 :(得分:1)

我很确定,因为multimap基本上是一个树表示,唯一的搜索机制是遍历树 - 没有“前进”和“后退”。

您可以找到第一个匹配的元素lower_bound,一个匹配upper_bound的最后一个匹配元素,或者匹配一个密钥equal_range的完整范围。编辑:所有这些方法都以对数复杂度运行。

你能详细了解一下你需要什么吗?

答案 2 :(得分:0)

您可以正常使用upper_boundlower_bound,但可以反转您的迭代代码。

找到最后一个匹配元素:

ub = m.upper_bound(1);
lb = m.lower_bound(1);
if (ub != lb) {
  --ub;
  return ub->second;
}

或只使用一次查找:

ub = m.upper_bound(1);
if (ub != m.begin()) {
  --ub;
  if (ub->first == 1) {
    return ub->second;
  }
}

答案 3 :(得分:0)

我猜您正在寻找一种搜索算法来查找std::multimap中的密钥,

  1. 保证O(log n)找到multimapn个键中的任意键

  2. 保证O(1)找到multimap

  3. 所拥有的最大密钥的密钥

    内置没有这样的东西。大多数(全部?)多重映射都是作为平衡树实现的,对multimap::find()的调用首先测试映射的中间,因为那是树的根。如果您实施嘈杂的operator<,您可以亲眼看看。

    在调用rbegin()之前,只需测试multimap::find()指向的密钥是否满足您的要求?

    如果通过“最后插入”实际上意味着最近添加到地图中的元素,那么根本无法找到它,multimap和其他关联容器不会保留有关顺序的信息插入