我有一个包含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)),没有线程(并行解决方案)来实现。
答案 0 :(得分:2)
这可以通过观察两个分区的总和是恒定的线性时间来完成:
S
)。P_i
调用此i
)。i
以使abs(P_i - (S - P_i))
最小化。答案 1 :(得分:1)
首先,除非你拥有无限数量的线程,否则多线程对复杂性没有帮助。
你可以在O(N)中完成。这是一个大致方向 - 循环遍历可能的分区(N + 1),并计算前一个分区的每个分区(在每次迭代中,您将一个项目从分区移动到另一个分区)。