求解未排序数组中元素的算法

时间:2015-10-05 02:29:39

标签: arrays algorithm

我有两个数组:

  • 数组 A = [ a 1 a 2 ,..., a n ]未分类。
  • 数组 B = [ b 1 b 2 ,..., b k ]已排序,其元素少于 A (即: k < / em>« n )。

对于每个 b i ,我想计算最大 b <的总和数组A中的em> i 元素。例如,如果

  • A = [10,5,3,9,8,15,4,7,11,1,20,6]
  • B = [2,3,4,6,7]

然后我想要 A 中的2,3,4,6和7个最大元素的总和:

  • [20 + 15,20 + 15 + 11,20 + 15 + 11 + 10,20 + 15 + 11 + 10 + 9 + 8,20 + 15 + 11 + 10 + 9 + 8 + 7]
  • 即:[35,46,56,73,80]

我知道如何计算O( n )时间内 b i 最大元素的总和,所以我可以轻松地为O( nk )时间内运行的整个事物编写算法;但我需要一个在O( n log k )时间内运行的算法。

那么,我怎样才能在O( n log k )时间内做到这一点?

2 个答案:

答案 0 :(得分:1)

基本上,你想在第一个数组中找到k个最大的元素。

这是算法的草图。你走过第一个阵列。您将元素插入数据结构 - 让我们说一个b树。插入到数据结构中的是log(k),因为数据结构结构限于k个元素。因此,对于k + 1记录,插入有点不同,因为较大的值将覆盖较小的值。 (有比b树更好的数据结构,比如堆,但你可能对树更熟悉。)

无论如何,插入此数据结构的是log(k)。您可以在O(n * log(k))操作中创建它。然后,您只需要读取数据结构,即k。因为k < n,它对复杂性没有贡献。所以,这就是你构建这样一个算法的方法。

答案 1 :(得分:0)

I'm not good in writing a complete algorithm. I'll try to illustrate my idea using your example:

Start with middle element of B (4) we found 10+15+11+20=56 as well as splitting A into

[10,15,11,20]  [5,3,9,8,4,7,1,6]

and B split into

[2,3]  [6,7]

Recursively we have two reduced summing up problem of:

Q1: A' = [10,15,11,20]      B' = [2,3]
Q2: A' = [5,3,9,8,4,7,1,6]  B' = [6-4, 7-4]

Take the middle element of B' of Q1 and Q2, each processing A' of Q1 and Q2 respectively. Total number of elements visited among all A' of the sub-problems is still O(n), and we continue to break down the problem into smaller sub-problem, until log(k) times.

There may be some operation to sum up the values in O(k). Since k << n (as defined in the question), this O(k) maybe ignored in compare with the O(n log k) time complexity.