Algorithm 获取k';th元素
我得到了一组n个元素。 是否存在构建时间(预处理)为O(n)的数据结构。 从那时起,你能回答问题,得到O(k)中的第k大元素吗?Algorithm 获取k';th元素,algorithm,data-structures,Algorithm,Data Structures,我得到了一组n个元素。 是否存在构建时间(预处理)为O(n)的数据结构。 从那时起,你能回答问题,得到O(k)中的第k大元素吗? 还有什么比O(k)更好的吗?为O(n)构建时间和O(k log k)第k个最大元素的搜索时间勾勒出我的注释 预处理只是构建一个堆h,可以在O(n) 然后在查询期间,您必须使用额外的优先级队列q,其中元素按值排序(降序)。该算法的工作原理如下: 首先将h的根节点放入q 现在重复k次:移除q的头部,并将该元素的子元素(根据h)放入q 移除的最后一个元素是第k个最大元素
还有什么比O(k)更好的吗?为
O(n)
构建时间和O(k log k)
第k个最大元素的搜索时间勾勒出我的注释
预处理只是构建一个堆h
,可以在O(n)
然后在查询期间,您必须使用额外的优先级队列q
,其中元素按值排序(降序)。该算法的工作原理如下:
- 首先将
的根节点放入h
q
- 现在重复
次:移除k
的头部,并将该元素的子元素(根据q
)放入h
q
- 移除的最后一个元素是第k个最大元素
从
q
(它本身就是一个堆)中删除一个元素是O(| q |)。在每个步骤中,q
将增加1个元素。经过k-1
步骤后,其大小将为k
。因此,该算法运行于O(k log k)为什么不按降序对数组(唯一元素)进行排序?您可以回答每个查询,以在O(1)时间内获得最大的k
。因为排序至少需要O(nlog(n))时间进行预处理。此问题称为选择:。一个简单的方法是使用堆,但还有更有效的方法。@elihar好的,但是数据集的性质如何?如果只有一定范围的数字,如从1
到10000
,则可以声明大小为10000
的数组并赋值。因此,预处理是在O(1)
时间内完成的(因为它不会随着输入而增长),甚至回答查询也是O(1)
。否则,您可以使用堆,但回答查询将是O(k*log(n))
我想。对于集合的性质没有任何假设。