Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 获取k';th元素_Algorithm_Data Structures - Fatal编程技术网

Algorithm 获取k';th元素

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个最大元素

我得到了一组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个最大元素


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))
我想。对于集合的性质没有任何假设。