查找排序区域中元素数量的最快方法是什么?

What's the fastest way to find the number of elements in a sorted range?

本文关键字:方法 是什么 区域 排序 元素 查找      更新时间:2023-10-16

给定排序列表
1, 3, 5, 6, 9....
假设所有数字都是整数,是否有一种快速算法而不是O(n)来计算给定范围[a, b]中的元素数量?

这里有一个O(logn)算法:使用二进制搜索来搜索两个端点,范围内的元素数量基本上就是索引的差异。

要获得确切的数字,需要区分范围的端点是否在数组中的情况。

由于列表是排序的,您可以在O(log(n))时间内找到值的位置(或者,如果值不在列表中,则可以找到它应该插入的位置)。只需对两端执行此操作,然后相减即可获得该范围内的元素数。元素是否为整数没有区别;只需要对列表进行排序。

如果元素不是唯一的,您确实需要小心;在这种情况下,在找到命中后,您可能需要对重复元素序列的末尾进行线性扫描。

lower_boundupper_bound对已排序的容器进行操作。

首先在该范围中找到较低的值,然后从那里搜索到最后查找较高的值。函数的实现可能使用二进制搜索:

#include <algorithm>
#include <list>
#include <iterator>
int main() {
    using std::list;
    using std::upper_bound;
    using std::lower_bound;
    using std::distance;
    list<int> numbers = {1, 3, 5, 6, 9};
    int a = 3;
    int b = 6;
    auto lower = lower_bound(numbers.begin(), numbers.end(),
                             a);
    auto upper = upper_bound(lower, numbers.end(),
                             b);
    int count = distance(lower, upper);
    return 0;
}