簡體   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