繁体   English   中英

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

[英]O(klogn) time algorithm to find kth smallest element from a Fenwick-Tree

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

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

因此,第二小的元素将在索引1处。

您需要第k个最小实际频率,我认为如果不对实际频率进行排序就无法确定。 如果只有Fenwick树,则可以计算O(n * log(n))时间中的实际频率序列(因为可以计算O(log(n))中的每个实际频率)(请参阅这里 ),您有n个频率)。 通过quicksort对实际频率序列进行排序需要O(n * log(n)) ,而找到已排序序列的第k个元素需要O(n) (可能存在具有相同实际频率的条目,因此您不能在O(1);但您可以使用线性搜索)。 因此,整个搜索可以在O(n * log(n))中完成。

希望这可以帮助。 我不知道如何在O(k * log(n))中完成此操作。

好吧,我想到了一个可能的解决方案,

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

开始必须是答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM