O(klogn)时间算法从Fenwick树中找到第k个最小元素

时间:2013-07-12 23:10:21

标签: c++ algorithm fenwick-tree

我的意思是在kth时间内在Fenwick树中找到O(k log(n))最小的实际频率。
如果我的数据是:

Tree = [1,3,1,10,3]
Actual frequency = [1,2,1,6,3]

所以第二个最小的元素是索引1。

2 个答案:

答案 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;
}

一开始就是答案。