Algorithm 查找点,即与直线上所有其他点的距离之和是最小的

Algorithm 查找点,即与直线上所有其他点的距离之和是最小的,algorithm,recursion,line,Algorithm,Recursion,Line,我一直在想,是否有可能用递归或“分而治之”的方式解决这个问题。 以下是我的问题的想象: 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) 我知道如何以迭代的方式进行,但我正在考虑更优化的方法。这就是所谓的值。只需对值进行排序并选择中心。如果n为偶数,则两个中心值中的任何一个都可以 还有计算中位数

我一直在想,是否有可能用递归或“分而治之”的方式解决这个问题。 以下是我的问题的想象:

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)


我知道如何以迭代的方式进行,但我正在考虑更优化的方法。

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


还有计算中位数的方法。

答案是正确的,但也可能有

多种解决方案 如果点的数量为偶数:p1<…pn 理解中值为什么工作,考虑这个

解释 假设我们有
n
点,其中pii

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

因此,Sp1+1=Sp1+1-(n-1)

总和继续以这种方式变化,直到x=p2:斜率为1-(n-1)=2-n 通过点p2后,坡度变为2-(n-2)=4-n,然后变为6-n,然后变为8-n,以此类推

很容易看出,在我们经过的每个点上,坡度总是增加2:接近点的数量减少1,离开点的数量增加1,因此坡度变化2

在某一点上,坡度将从负变为负

  • 正–如果分数为奇数
  • 零–在点数为偶数的情况下
很容易看出,当有偶数个点时,斜率在某个点将为零:
p1
如果我们位于点pn和pn+1之间,则左右两侧的点数量相等。这意味着,当我们在这两个点之间移动时,等量的点(准确地说,n)会越来越近,越来越远,因此Spn No,100之和的累积差值为114,中位数102的累积差值为110。“如果n为偶数,两个中心值中的任何一个都可以”-或者它们之间的线段中的任何点,如果允许您在直线上选择一个点,而该点不是指定集合中的一个点。请删除我的答案,说明最接近平均值的点可能就是解决方案。我用很多随机集做了一些测试,数据集{2030,2633,4784,5694,5822,5876,6549}的平均值是4769.71,接近4784。然而,cumul dist为9710,而cumul dist为5694的中位数是令人烦恼的更好的8800。所以这可能是正确的。大纲证明是,如果你左边有N个点,右边>=N+2个点,那么你所在的位置不是问题的解决方案,因为通过向右移动一个点,你将距离减少到>=N+2点,减少常数d,你将距离增加到N+1点,增加常数d(N+1是左边的N点,加上你所在的点)。这减少了总的成本。因此,除非你两边都有(a)N个点,或者(b)一边有N个点,另一边有N+1,否则你就不在解的位置。因此,解决方案是用几句话而不是半篇文章来表达中间值,很好!这不应该移植到计算机科学吗,因为这与编程没有直接关系。@SteveJessop计算机科学是关于算法的,编程是关于实现算法的,因此,从这个角度来看,计算机科学更具普遍性,因此更适合这个问题。@SpaceTrucker:如果你是从头开始建立分类法的话,那可能是这样,但在我看来,目前的做法似乎是,关于算法的问题是以这样的方式为主题的。如果一个来自高位的命令改变了这一点,那就顺其自然吧。测试版中有cs.stackexchange,目前常见问题解答说它是为“计算机科学的学生、从业者和研究人员”准备的。除非目标是让人们在SE网络周围转圈,否则我认为如果程序员想要一个非愚蠢的算法来解决他们的问题,那么他们就在练习计算机科学,而不是编程,这是没有意义的。