【发布时间】:2020-08-10 14:12:48
【问题描述】:
std::set 是否支持任何返回小于给定元素的元素数量的方法?
我知道我们有 lower_bound 将迭代器返回到给定元素的下限;但它不会返回给定元素之前的元素数量。
我知道我可以从头迭代到下界迭代器;但在最坏的情况下,这将花费O(n) 时间。我们在O(logn) 中是否有这样的方法?
【问题讨论】:
std::set 是否支持任何返回小于给定元素的元素数量的方法?
我知道我们有 lower_bound 将迭代器返回到给定元素的下限;但它不会返回给定元素之前的元素数量。
我知道我可以从头迭代到下界迭代器;但在最坏的情况下,这将花费O(n) 时间。我们在O(logn) 中是否有这样的方法?
【问题讨论】:
如果您特别有std::set,那么您可以像这样使用自定义std::set::lower_bound:
auto lb = s.lower_bound(key);
保证O(log n) 复杂度。
要获取元素的数量,您可以像这样使用std::distance:
auto count = std::distance(s.begin(), s.lower_bound(key));
但是,std::set 不支持随机访问迭代器,因此 std::distance 调用具有 O(n) 复杂性。
如果你有一些排序范围,你仍然可以像这样使用lower_bound 和distance:
auto lb = std::lower_bound(s.begin(), s.end(), key);
auto count = std::distance(s.begin(), lb);
但请注意,如果s 不支持随机访问,那么两个这两个操作都有O(n) 复杂度。
【讨论】:
std::distance(s.begin(), s.lower_bound(key)); 具有O(log(n)) 的复杂性。当然对lower_bound 的调用确实如此,但对distance 的调用是O(n)(对于可能更小的n)