我有两个数组:
对于每个 b i ,我想计算最大 b <的总和数组A中的em> i 元素。例如,如果
然后我想要 A 中的2,3,4,6和7个最大元素的总和:
我知道如何计算O( n )时间内 b i 最大元素的总和,所以我可以轻松地为O( nk )时间内运行的整个事物编写算法;但我需要一个在O( n log k )时间内运行的算法。
那么,我怎样才能在O( n log k )时间内做到这一点?
答案 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.