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


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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值