最小向量积

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/L__ear/article/details/86757843

调整数组元素的位置使得两数组向量积最小

问题描述:

有长度为n的数组a,b,问如何调整数组内元素的位置使得 a b a\cdot b 最小?

解的通俗描述:

对应小的乘大的,大的乘小的,得到的向量积最小。

证明:

  1. 重定义a的逆序
    依据数组b来定义数组a的逆序,假设有a,b对应位置上的两对数 a i , a j a_{i},a_{j} b i , b j b_{i},b_{j} ,如果有 b i < b j b_{i}<b_{j} a i > a j a_{i}>a_{j} ,或者 b i > b j b_{i}>b_{j} a i < a j a_{i}<a_{j} ,则称 a i , a j a_{i},a_{j} 为一对逆序,否则不为逆序。
  2. 证明单调
    假设现在有 b i < b j b_{i}<b_{j} a i < a j a_{i}<a_{j} i = 0 , 1 ,   , n 1 i=0,1,\cdots,n-1 j = 0 , 1 ,   , n 1 j=0,1,\cdots,n-1 i j i\ne 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}
    若现在交换 a i , a j a_{i},a_{j} 的位置,即数组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}
    可以证得 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} (这个简单证明放在第3点)
    S 1 > S 2 S_{1}>S_{2}
    所以结论是:保持b不变,a每增加一对逆序,a,b的向量积就一定会变小,两者呈反比。

所以当a是相对于b的全逆序时,a,b的向量积最小。相反的,当a是相对于b的全顺序时,a,b的向量积最大。

  1. 下面证明 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}
    因为 b i < b j b_{i}<b_{j} a i < a j a_{i}<a_{j} ,所以 b i b j < 0 b_{i}-b_{j}<0 a i a j < 0 a_{i}-a_{j}<0
    ( a i a j ) ( b i b j ) > 0 (a_{i}-a_{j})\cdot(b_{i}-b_{j})>0
    对上式展开移项即可得到要证明的结论。

猜你喜欢

转载自blog.csdn.net/L__ear/article/details/86757843