我得到了一组n个元素。 是否有一个构建时间(预处理)为O(n)的数据结构。 从那以后可以回答查询以获取O(k)中的第k个最大元素? 有什么比O(k)好吗?
答案 0 :(得分:3)
在第O(n)
个构建时间和第{k个最大元素的搜索时间O(k log k)
处添加我的注释。
预处理只是建立一个堆h
,可以在O(n)
中完成
然后,在查询期间,您必须使用其他优先级队列q
,其中元素按值排序(降序)。该算法的工作原理如下:
首先将h
的根节点放入q
现在重复k
次:移除q
的头并将该元素的子元素(根据h
)放入q
最后一个被删除的元素是您的第k个最大元素
从q
(本身是堆)中删除元素是O(| q |)。在每一步中,q
将增长1个元素。经过k-1
个步骤后,其大小将为k
。因此,该算法在 O(k log k)