Algorithm 查找数组中第n个最小元素

Algorithm 查找数组中第n个最小元素,algorithm,Algorithm,可能重复: 我现在坐在一个课程作业前。 任务是找到数组中第n个最小的元素。没有分类 我试图理解BFPRT算法,但从我得到的结果来看,它只有在你想计算中值而不是第n个最小元素时才有用 我的另一个想法是,通过将较小/较大的节点附加到根节点的左/右,将数组转换为树。但我不确定这是否算作排序。 为了加快速度,我可以在每个节点中存储子节点的数量 完整赋值还包括算法必须是递归的。 还有一点需要考虑其他数据结构 你觉得我把数组转换成平衡树的想法怎么样 还有其他我可能错过的选择吗 编辑:我看了各种类似的问题,

可能重复:

我现在坐在一个课程作业前。 任务是找到数组中第n个最小的元素。没有分类

我试图理解BFPRT算法,但从我得到的结果来看,它只有在你想计算中值而不是第n个最小元素时才有用

我的另一个想法是,通过将较小/较大的节点附加到根节点的左/右,将数组转换为树。但我不确定这是否算作排序。 为了加快速度,我可以在每个节点中存储子节点的数量

完整赋值还包括算法必须是递归的。 还有一点需要考虑其他数据结构

你觉得我把数组转换成平衡树的想法怎么样

还有其他我可能错过的选择吗


编辑:我看了各种类似的问题,但无法完全理解答案/将其应用于我的具体任务。

理论上有一个相当复杂的算法。在实践中,它有点慢。请查看此链接:。维基百科上也有关于这个问题的条目:

编辑:

解决此问题的简单伪码算法:

k=第k个元素是我们正在寻找的

FindKthSmallest(Array, k)
pivot = some pivot element of the array. 

L = Set of all elements smaller than pivot in Array
R = Set of all elements greater than pivot in Array

if |L| > k FindKthSmalles(L, k)
else if(|L|+1 == k) return pivot
else return FindKthSmallest(R, k-|L|+1)

解决这个问题的传统方法顺序统计问题让人想起快速排序。假设您正在寻找第k个最小元素。选择一个随机枢轴元素,将其余元素分成两个组,而不对这两个组进行排序:L包含除枢轴元素本身之外小于或等于枢轴元素的所有元素,G包含大于枢轴元素的所有元素。我有多大?如果它正好包含k-1元素,那么pivot元素必须是第k个最小的元素,您就完成了。如果L包含超过k-1个元素,则第k个最小元素必须在L中;否则,它在G中。现在,对L或G应用相同的算法,如果需要使用G,则必须调整k,因为您不再寻找G的第k个最小元素,而是总体上的第k个最小元素

该算法在预期的时间内运行;然而,存在一个巧妙的算法修改,以保证在最坏的情况下准时


编辑:正如@Ishtar指出的,聪明的修改是BFPRT算法。它的核心思想是确保您永远不会选择一个坏的pivot元素,这样两个分区L和G就不会变得太不平衡。只要你能保证一个分区的大小永远不会超过另一个分区的c倍(对于某些任意但固定的c),运行时就会打开。

我喜欢这里的竞赛算法-它非常直观且易于理解


我已经看过你的两个链接了。PowerPoint幻灯片很好,但我不理解那里写的所有内容。此外,所描述的算法是BFPRT算法,据我所知,该算法仅用于返回数组的中值,而不是第n个最小值。@Martin Klepsch-您可以很容易地从该算法中获得第n个最小值。我将很快编辑我的帖子。好的,你的文章帮助我至少比以前做得更好。此PDF中解释了此修改:注意:您只在一侧递归,而不是在两侧递归,这是用于排序的日志N和用于选择的日志N之间的关键区别。这一巧妙的修改是BFPRT算法,中间值。听起来像是一个简洁的答案我发现关于数据结构的暗示令人惊讶。解决此问题的典型算法不需要额外的数据结构。