假设我有一个具有非负值的 BIT(Fenwick Tree),我想在 O(logN) 中找到给定累积频率的最小索引。
现在,我可以这样做 O(log^2(N)) 像这样。
int l = 0, r = n;
while(l < r) {
int midd = l + (r-l)/2;
if (get_sum(BIT, midd+1) < given_sum)
l = midd+1;
else
r = midd;
}
return midd + 1;
我知道我们可以在 O(logN) 中找到任何索引或最大索引,如此处所述,因此也希望找到具有相同时间复杂度的最低索引。树的实现方式是一种常见的方式。
vector<int> BIT(n+1);
void update(vector<int> &BIT, int idx, int delta){
for(int i = idx; i < BIT.size(); i +=(i&-i))
BIT[i] += delta;
}
int get_sum(vector<int>& BIT, int idx){
int sum = 0;
for(int i = idx; i > 0; i-=(i&-i))
sum += BIT[i];
return sum;
}
希望得到您的帮助:)