我遇到了问题,并提供了一个OK-ish解决方案。我希望有更好的解决方案。寻找任意子阵列中所有项目总和的最佳算法
问题
我有大约20万整数数组。给定两个指数i1和i2,我需要计算i1和i2之间所有元素的总和。数组中的每个整数都在1到4之间。例如:
a = [1, 3, 2, 4, 3, 2, 4, 1];
subsection_sum(a, 0, 3); // returns 6: (1 + 3 + 2)
此操作将执行大约200,000次,因此需要非常快。 for循环中的简单计数器是O(n),而且太慢了。阵列在施工后从不修改,所以可以有相对昂贵的预处理阶段。
我最好的解决方案至今
这种算法工作在O(log n)的时间:
第一焊盘原始数组用零,直到其长度为二的幂。接下来,将数组分成两个相等的部分并存储每个的总和。然后将数组分成四个部分并存储每个部分的总和。然后八分之一。继续这样做直到数组被分成2个元素长的段。对于上面的8个元素的阵列,这需要两个步骤:
halves = [(a[0] + a[1] + a[2] + a[3]), (a[4] + a[5] + a[6] + a[7])]
quarters = [(a[0] + a[1]), (a[2] + a[3]), (a[4] + a[5]), (a[6] + a[7])]
然后给出两个指数,现在有可能制定出subsection_sum在O(log n)的时间。例如,subsection_sum(a,2,7)== quarters [1] + halfves [1]。
完美,我不敢相信我想到了这样一个复杂的解决方案,错过了一个简单的解决方案!谢谢。 – 2011-05-22 14:36:39
与我的解决方案一样,但是却击败了我! +1 – 2011-05-22 14:38:08