找出数组中两个子数组之和的最小绝对差值

时间:2014-12-14 09:20:13

标签: arrays algorithm time-complexity

我有一个包含N个元素的数组(未排序)。数组的每个元素可以是任何整数(正数或负数)。现在我必须以绝对(sum(sub_array1) - sum(sub_array2))最小的方式对这个数组进行分区。

实施例: A = {3,4,1,2,-5}

partition1 = sub_array1 {3},sub_array2 {4,1,2,-5} => abs(3-2)= 1

partition2 = sub_array1 {3,4},sub_array2 {1,2,-5} => abs(7 - ( - 2))= 9

partition3 = sub_array1 {3,4,1},sub_array2 {2,-5} => abs(8 - ( - 3))= 11

partition4 = sub_array1 {3,4,1,2},sub_array2 {-5} => abs(10 - ( - 5))= 15

答案= 1

我已经用O(N ^ 2)实现了解决方案,但我想用至少O(Nlog(N)),没有线程(并行解决方案)来实现。

2 个答案:

答案 0 :(得分:2)

这可以通过观察两个分区的总和是恒定的线性时间来完成:

  • 汇总数组中的所有元素(调用此S)。
  • 迭代数组,计算部分总和(在步骤P_i调用此i)。
  • 在迭代时,找到i以使abs(P_i - (S - P_i))最小化。

答案 1 :(得分:1)

首先,除非你拥有无限数量的线程,否则多线程对复杂性没有帮助。

你可以在O(N)中完成。这是一个大致方向 - 循环遍历可能的分区(N + 1),并计算前一个分区的每个分区(在每次迭代中,您将一个项目从分区移动到另一个分区)。