查找比数组中给出的数字更大的数字

时间:2016-09-30 19:26:35

标签: arrays algorithm search time-complexity

有一个 UNSORTED 数字序列:a1,a2,...,an

而且,我们有一个数字,所以我们有 ai

我们想要找到数字,j j<iaj>ai 像这样:

3,4,9,1,8,10,2,2,6,1
if i=8 then j=6
if i=7, j=6 again
if i=10 then j=9
if i=1 then j=NIL (Not In List)

1 个答案:

答案 0 :(得分:1)

可以使用Segment tree在每个查询的O(n)预处理和O(log n)中执行此操作。

每个查询在O(log ^ 2 n)中执行它非常简单。首先,构建一个支持在O(log n)上的段上获得最大值的段树。其次,对每个查询进行二分查找。

我表示max(a_i, ..., a_j) as max(i, j)。假设查询索引为i。如果max(i+1, n) <= a_i那么显然没有这样的元素。否则,您必须找到j这样的最小max(i+1, j) > a_i,这是通过j上的二进制搜索完成的。

为了进一步改进,您需要深入研究分段树结构。我会给你一个基本的想法。假设您必须在数组中找到大于x的第一个元素。最初,您位于细分树的根部。如果左子树的最大值为> x,则转到左子树,否则转到右侧。可以很容易地显示完成的叶子对应于数组中最左边的元素> x