如何在数组的区间内找到第k个最小元素

时间:2013-12-01 09:53:44

标签: segment-tree

假设我有一个长度为a[]的未排序整数数组N。 现在我想找到给定间隔a[i]-a[j]1 <= i <= j <= N)内的第k个最小整数。 例如:我有一个数组a[10]={10,15,3,8,17,11,9,25,38,29}。 现在我想找到a[2]-a[7]区间内的第3个最小元素。 答案是9。 我知道这可以通过排序该间隔来完成。但这需要花费O(Mlog(M))M = j - i + 1)的时间。另外,我知道,这可以通过分段树完成,但我无法理解如何修改它来处理这样的查询。

1 个答案:

答案 0 :(得分:0)

您可以使用QuickselectQuicksort的修改来查找列表中的k th 最小/最大值。为了简单起见,我们假设您正在尝试为整个数组执行此操作(请注意,没有区别)。

基本上你使用quicksort,但只使用一个递归调用而不是两个。放置它的枢轴后,您只需要为其中一个分区调用快速排序,具体取决于枢轴的位置。这是O(N 2 ),但是O(N)的平均情况。如果你使用随机枢轴,它几乎总是O(N)。