我的意思是在kth
时间内在Fenwick树中找到O(k log(n))
最小的实际频率。
如果我的数据是:
Tree = [1,3,1,10,3]
Actual frequency = [1,2,1,6,3]
所以第二个最小的元素是索引1。
答案 0 :(得分:0)
您需要第k个最小实际频率,我认为如果不对实际频率进行排序,则无法确定。如果您唯一拥有的是Fenwick树,那么您可以在 O(n * log(n))时间内计算实际频率的顺序(因为您可以计算O中的每个实际频率( log(n))(见here),你有n个频率)。通过快速排序对实际频率序列进行排序需要 O(n * log(n)),并且找到排序序列的第k个元素需要 O(n)(可能是具有相同实际频率的条目,因此您不能在O(1)中执行此操作;但您可以使用线性搜索)。 因此整个搜索可以在O(n * log(n))中完成。
希望这会有所帮助。我不知道如何在O(k * log(n))中完成这项工作。
答案 1 :(得分:-2)
我想到了一个可能的解决方案,
while(start<=end){
int mid=(start+end)>>1;
if(read(mid)>=k)end=mid-1; // read(mid) returns the cummulative frequency.
else start=mid+1;
}
一开始就是答案。