求解两个数组中总体平均的差的绝对值和最小

来源:互联网 发布:python数据分析 pdf 编辑:程序博客网 时间:2024/06/03 14:29


1.贪心策略:

   由于需要最小化公式,所以对于A中的数需要求其在B中差值最小的。由此的具体方案,对AB进行排序,这在A中的第i个数分配B中第i个数进行求差值。

2.贪心选择性:

  A中最小的数分配一个B中最小的数,然后在剩余的数组中重复配对,就能得到最小的绝对差值和

  证明:

  i,j 是A中最小和i!=j的两个下标,且i<j,按照贪心策略配对,绝对差值为abs=|A[i]-B[i]|+|A[j]-B[j]|;假设不按照贪心策略配对,给Ai分配Bj,给Aj分配Bi,绝对差值为abs=|A[i]-B[j]|+|A[j]-B[i]|

  下面分情况讨论:

  1.A[i]<A[j]<B[i]<B[j],abs=B[i]-A[i]+B[j]-A[j],abs'=B[j]-A[i]+B[i]-A[j],abs=abs'

  2.A[i]<B[i]<A[j]<B[j],abs=B[i]-A[i]+B[j]-A[j],abs'=B[j]-A[i]+A[j]-B[i],abs<abs'

  3.A[i]<B[i]<B[j]<A[j],abs=B[i]-A[i]+A[j]-B[j],abs'=B[j]-A[i]+A[j]-B[i],abs<abs'

  4.B[i]<A[i]<B[j]<A[j],abs=A[i]-B[i]+A[j]-B[j],abs'=B[j]-A[i]+A[j]-B[i],abs<abs'

  5.B[i]<B[j]<A[i]<A[j],abs=A[i]-B[i]+A[j]-B[j],abs'=A[i]-B[j]+A[j]-B[i],abs=abs'

综上所述abs<=abs',可得如果不按照贪心策略进行配对的话,则绝对差值不是最小的,因此要按照贪心策略进行配对,每次分配一个最小的。

3.优化子结构:

  当按照贪心策略配对后得到优化解abs,如果同时去除A和B中最大的两个数k和t,abs'=abs-|k-t|是去除k和t的优化解

  证明:

  假设abs'是不是去除A和B中最大的k和t 的优化解,当加上k和t 两个树

后,根据贪心策略,优化解abs''=abs’+|k-t|,于是abs''等于abs,而abs是优化解,出现矛盾,所以当按照贪心策略配对后得到优化解C,如果同时去除A和B中最大的两个数k和t,abs'=abs-|k-t|是去除k和t的优化解

4.伪代码:

  function getMin_Sum_Abs

 sort(A);//这里可以用时间复杂度为nlogn的算法,比如快排

 sort(B);//同上

 sum = 0

 for i=0 to A.length

    sum+=abs(A[i]-B[i]);

 return sum;

5.算法复杂度:O(nlogn)

0 0