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