寻找点,与线上所有其他点的距离总和最小

时间:2012-10-23 08:34:48

标签: algorithm recursion line

我一直想知道是否有可能以递归或“分而治之”的方式解决这个问题。 这是我的问题的可视化:

enter image description here

Input:
22 // point no 1
35 // point no 2
5  // ...
44
45
20
46

Output: 2 // point with number 2 has got the lowest sum (87)

我知道如何以迭代的方式做到这一点,但我正在考虑更优化的事情。

2 个答案:

答案 0 :(得分:5)

这称为median值。只需对值进行排序并选择中心。如果n是偶数,则两个中心值中的任何一个都可以。

还有O(n) algorithms来计算中位数。

答案 1 :(得分:2)

答案说解决方案是median是正确的,但可以有

多种解决方案

如果积分均匀: p 1 < ... p n < p n + 1 < ......< p 2n ,对于 x 的任何点,距离之和将是最小的,其中* p n ≤x≤p n + 1

要理解中位数的工作原理,请考虑这个

说明

假设我们有n个点,其中 p i < p i + 1 适用于所有适用的i

天真,我们可能认为 x = p 1 是最小化和 S 的最佳选择。将 x 增加一,总和 S 会发生什么?我们离 p 1 更远1,但距其他所有点更近。

因此, S p 1 + 1 = S p 1 + 1 - (n - 1)

总和继续以这种方式改变,直到 x = p 2 :斜率 1 - (n - 1)= 2 - n 通过点 p 2 后,斜率变为 2 - (n - 2)= 4 - n ,之后 6 - n ,然后 8 - n

很容易看出,在我们经过的每个点上,坡度总是增加2:接近点的数量减少一个,移动的点数量增加一个,因此斜率变化为2。

在某些时候,斜率将从负值变为

  • 正面 - 在奇数点的情况下
  • 零 - 在偶数个点的情况下

很容易看出,当存在均匀的点数时,斜率将在某个点处为零:
p 1 &lt; p 2 &lt; ... p n &lt; p n + 1 &lt; ... p 2n - 1 &lt; P <子> 2n个

如果我们位于 p n p n + 1 之间,则数量相等左侧和右侧的点数。这意味着,当我们在这两个点之间移动时,相同数量的点 - n ,确切地说 - 更接近并且距离更远,因此总和 S p < sub> n &lt; = x&lt; = p n + 1 保持不变。

如果存在奇数个点, p (n + 1)/ 2 标记最小值,因为它是斜率从负值变为正。