我试图在二进制索引树(BIT)中找到具有给定累积频率的索引。
我能够在O(log(n)* log(n))中通过二进制搜索和在任何索引处计算累积频率的函数实现它来解决这个问题。
但我想在O(log(n))中解决这个问题。
所以请帮忙。
答案 0 :(得分:0)
来自topcoder tutorial的此算法显示了如何在O(logn)中找到具有给定累积频率的最大索引:
找到具有给定累积频率的索引的简单且最简单的解决方案只是简单地迭代所有索引,计算累积频率,并检查它是否等于给定值。在负频率的情况下,它是唯一的解决方案。但是,如果我们的树中只有非负频率(这意味着更大索引的累积频率不小),我们可以计算出对数算法,即二进制搜索的修改。我们遍历所有位(从最高位开始),制作索引,比较当前索引和给定值的累积频率,并根据结果,取出间隔的较低或较高的一半(就像二进制搜索一样) )。
// if in tree exists more than one index with a same
// cumulative frequency, this procedure will return
// the greatest one
int findG(int cumFre){
int idx = 0;
while ((bitMask != 0) && (idx < MaxVal)){
int tIdx = idx + bitMask;
if (cumFre >= tree[tIdx]){
// if current cumulative frequency is equal to cumFre,
// we are still looking for higher index (if exists)
idx = tIdx;
cumFre -= tree[tIdx];
}
bitMask >>= 1;
}
if (cumFre != 0)
return -1;
else
return idx;
}