Segment tree 如何在数组间隔内找到第k个最小元素

Segment tree 如何在数组间隔内找到第k个最小元素,segment-tree,Segment Tree,假设我有一个长度为N的未排序整数数组a[]。 现在,我想找到给定间隔内的第k个最小整数a[I]-a[j](1您可以使用的修改来查找列表中的第k个最小/最大值。为了简单起见,让我们假设您尝试对整个数组执行此操作(请注意,没有区别) 基本上,您使用快速排序,但只使用一个递归调用,而不是两个。一旦放置了pivot,您只需要根据pivot的位置对其中一个分区调用快速排序。这是O(N2),但平均情况是O(N)。如果使用随机pivot,它几乎总是O(N).看看我明白了…问题是如果区间大小很大(比如j-I=1

假设我有一个长度为
N
的未排序整数数组
a[]
。 现在,我想找到给定间隔内的第k个最小整数
a[I]-a[j]
1您可以使用的修改来查找列表中的第k个最小/最大值。为了简单起见,让我们假设您尝试对整个数组执行此操作(请注意,没有区别)


基本上,您使用快速排序,但只使用一个递归调用,而不是两个。一旦放置了pivot,您只需要根据pivot的位置对其中一个分区调用快速排序。这是O(N2),但平均情况是O(N)。如果使用随机pivot,它几乎总是O(N).

看看我明白了…问题是如果区间大小很大(比如j-I=10^5)而查询数量很大(比如m=1000)…那么它需要m*(j-I)即几乎10^8次计算…所以我问我们是否可以为每个需要log(j-I)的查询进行计算计算…然后您将需要一个段树或任何相关的增强数据结构来完成。。。