找到给定数组中L到R范围内的值

时间:2015-08-15 17:34:17

标签: algorithm number-theory

给定数组 A ,以及两个索引 L R ,找到

的值
  

Summation(AS[i]*AS[j]*AS[k])

其中L<=i<j<k<=R成立,ASAL范围内R所有元素的有序集包容。

实施例: 让A=(4,4,1,6,1,3) L=0R=3给出AS=(1,4,6)Ans=1*4*6=24

我没有比O(n ^ 3)更好的方法,这非常慢。 请建议我一些更快的方法。

A中的元素数量最多为10 ^ 5。

1 个答案:

答案 0 :(得分:2)

正如评论员所说的那样,确定AS可以通过使用哈希表H来完成。您只需将A的元素从索引L迭代到R,然后将每个元素插入H。结果应该是您需要的元素集。您仍然需要对集合进行排序。为此,您可以将H的元素复制到一个数组中并对该数组进行排序。结果是AS。这不应超过O(NlogN)步骤,其中N=R-L

评论员没有说的是如何有效地计算总和。它可以在O(N)步骤中完成。这是如何。

我们首先进行以​​下观察:

Sum(AS[j]*AS[k], a <= j < k <= b) = 
   1/2*(AS[a] + AS[a+1] + ... + AS[b])^2 - 
   1/2*(AS[a]^2 + AS[a+1]^2 + ... + AS[b]^2)

我们按目标扩展目标金额:

S = Sum(AS[i]*AS[j]*AS[k]) = 
   AS[L]   * Sum(AS[j]*AS[k], L+1 <= j < k <= R) +     (iteration     1)
   AS[L+1] * Sum(AS[j]*AS[k], L+2 <= j < k <= R) +     (iteration     2)
   ...
   AS[R-2] * Sum(AS[j]*AS[k], R-1 <= j < k <= R).      (iteration R-L-1)

我们现在应用观察。

要有效地确定格式Sum(AS[j]*AS[k], a <= j < k <= b)的总和,我们可以先计算

S1 = AS[L] + AS[L+1] + ... + A[R]
S2 = AS[L]^2 + AS[L+1]^2 + ... + A[R]^2

然后逐步从每个和中减去第一项,因为我们将AS的元素从索引L迭代到R-2

因此,在确定O(N)后,可以在AS步骤中确定所需的总和。如果您使用某种比较排序方法,则整个算法应采用O(|A|) + O(NlogN) + O(N)步骤。