以相反顺序搜索multimap

Searching a multimap in reverse order

本文关键字:multimap 顺序搜索      更新时间:2023-10-16

是否存在以对数复杂度倒序搜索multimap (C/c++ STL)的方法?

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

或者,如果您的意思是要按反向顺序遍历multimap,您可以使用rbegin()rend()来获得反向迭代器。

我很确定,因为multimap基本上是一个树表示,唯一的搜索机制是遍历树-没有"向前"answers"向后"。

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

你能更详细地说一下你需要什么吗?

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

  1. 保证O(log n)n密钥的multimap中找到任何密钥

  2. 保证O(1)找到multimap持有的最大的密钥

没有这种内置的东西。大多数(所有?)multimaps是作为平衡树实现的,对multimap::find()的调用首先测试映射的中间,因为这是树的根所在的位置。如果你实现了一个嘈杂的operator<,你可以自己看看。

在调用multimap::find()之前简单地测试rbegin()指向的键是否满足您的要求?

如果"最后插入"实际上是指最近添加到映射中的元素,那么根本没有办法找到它,multimap和其他关联容器不保留有关插入顺序的信息。

您可以正常使用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;
  }
}