调整数组元素的位置使得两数组向量积最小
问题描述:
有长度为n的数组a,b,问如何调整数组内元素的位置使得
a⋅b 最小?
解的通俗描述:
对应小的乘大的,大的乘小的,得到的向量积最小。
证明:
- 重定义a的逆序
依据数组b来定义数组a的逆序,假设有a,b对应位置上的两对数
ai,aj和
bi,bj,如果有
bi<bj时
ai>aj,或者
bi>bj时
ai<aj,则称
ai,aj为一对逆序,否则不为逆序。
- 证明单调
假设现在有
bi<bj,
ai<aj,
i=0,1,⋯,n−1,
j=0,1,⋯,n−1,
i̸=j
则向量积
S1=k=0,k̸=i,k̸=j∑n−1ak⋅bk+ai⋅bi+aj⋅bj
若现在交换
ai,aj的位置,即数组a增加了一对逆序。
向量积变为
S2=k=0,k̸=i,k̸=j∑n−1ak⋅bk+ai⋅bj+aj⋅bi
可以证得
ai⋅bi+aj⋅bj>ai⋅bj+aj⋅bi(这个简单证明放在第3点)
即
S1>S2
所以结论是:保持b不变,a每增加一对逆序,a,b的向量积就一定会变小,两者呈反比。
所以当a是相对于b的全逆序时,a,b的向量积最小。相反的,当a是相对于b的全顺序时,a,b的向量积最大。
- 下面证明
ai⋅bi+aj⋅bj>ai⋅bj+aj⋅bi:
因为
bi<bj,
ai<aj,所以
bi−bj<0,
ai−aj<0
即
(ai−aj)⋅(bi−bj)>0
对上式展开移项即可得到要证明的结论。