我一直想知道是否有可能以递归或“分而治之”的方式解决这个问题。 这是我的问题的可视化:
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)
我知道如何以迭代的方式做到这一点,但我正在考虑更优化的事情。
答案 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 < p 2 < ... p n < p n + 1 < ...
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 标记最小值,因为它是斜率从负值变为正。