繁体   English   中英

是否可以通过 std::upper_bound 对 std::map 进行高效的部分搜索?

[英]Is it possible to do an efficient and partial search of std::map via std::upper_bound?

我有一个std::map和两个键key_small, key_big我计算upper_bound 已知key_small <= key_big 这是我目前的做法:

#include <map>
#include <algorithm>

int main() {
  // Some example data
  std::map<int, char> data{{1, 'a'}, {2, 'b'}, {4, 'c'}, {5, 'd'}, {5, 'e'}};
  int key_small = 1,
      key_big = 3; // key_small <= key_big is always true

  auto it_1 = data.upper_bound(key_big);
  auto it_2 = data.upper_bound(key_small);

  // Do something with it_1, then do something with it_2
}

我想以更有效的方式计算it_1it_2 上面it_2的计算没有利用我已经计算it_1的事实。 它第二次搜索整个map 我试图解决这个问题是做以下事情:

auto it_2 = (it_1 == data.end())
                    ? data.upper_bound(key_small)
                    : std::upper_bound(data.begin(), std::next(it_1), key_small);

第二次调用似乎忽略了底层数据结构。 因此,它也是低效的。

有没有更好的计算it_2的方法? 在我看来,使用log(std::distance(data.begin(), it_1)比较应该可以找到第二个迭代器。在工作面试中有人告诉我这是可能的。

我不在乎该解决方案是否仅在 c++20 中可用。 我也接受特定于 libstdc++ 或 libc++ 的解决方案。 如果该解决方案也适用于find ,那就太好了。

是否可以通过 std::upper_bound 对 std::map 进行高效的部分搜索?

尽管std::upper_bound可以与非随机访问迭代器一起使用,但它与那些迭代器具有线性复杂度。 所以,是的,可以这样做,但这种线性搜索是否有效取决于特定情况,在最坏的情况下,它会比两次std::map::upper_bound查找慢。

如果distance(it_1, it_2) < log2(N) ,那么它可能更有效率。

有没有办法从两种计算 it_2 的方式中获益?

该接口不提供此类算法。 我认为没有任何算法可以比这两个查找渐近地更好地处理最坏情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM