给出一个排序列表
1, 3, 5, 6, 9....
假设所有数字都是整数,是否有快速算法而不是O(n)
来计算给定范围[a, b]
中的元素数量?
答案 0 :(得分:8)
这是一个O(log n)算法:使用binary search搜索两个端点,该范围内的元素数基本上是指数的差异。
要获得确切的数字,需要区分范围的端点在数组中的情况。
答案 1 :(得分:2)
由于列表已排序,您可以在O(log(n))时间内找到值的位置(或者,如果值不在列表中,则应插入位置)。您只需要为两端执行此操作并减去以获取范围内的元素计数。元素是否为整数没有区别;列表只需要排序。
如果元素不是唯一的,你需要小心;在这种情况下,在找到命中后,您可能需要对重复元素序列的末尾进行线性扫描。
答案 2 :(得分:1)
lower_bound
和upper_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;
}