解决距离问题的最佳方法

时间:2009-02-05 06:25:10

标签: algorithm

有一组共线点。问题是添加一个位于同一行的新点,以便从新点到现有点的距离总和最小。 (假设该点位于水平线上)。

我想到的解决方案是:

  1. 根据x坐标对点进行排序(无论如何,y无关紧要)。
  2. 如果no.of点是奇数,则将新点放在与中间点相同的坐标处。
  3. 否则,将该点放在n / 2和n / 2 + 1点的中点。
  4. 我无法证明上述方法有效。这是对的吗?还有什么更好的解决方法吗?

7 个答案:

答案 0 :(得分:8)

如果我们希望最小化绝对距离的总和,我认为中位数是正确答案,这是明显的解释。如果我们希望最小化平方距离的总和,则平均值是正确的。对于y = 0和x = 0,1,2,101处的点,平均值为26,我们可以将中位数设为1.5。距平均值的绝对距离之和为149,距中值的绝对距离之和为102。

在中间位置,左侧的点数与右侧的点数相同。向左移动一小部分会增加到右边各点的所有距离,并减少到左边各点的所有距离相同的量 - 没有变化。如果距离中位数一点或更远,则可以通过向具有更多点的区域移动来减少绝对距离的总和。这减少了距离有多个点的区域的距离总和超过了距离点数较少的区域的距离总和 - 所以如果你不在中位数,你可以通过移动来改善走向它。这是统计数据中相当标准的结果。

答案 1 :(得分:3)

我认为你可以通过归纳来证明这一点。我会做奇怪的,你可以扩展它:

不失一般性,我们可以说这些点位于y = 0的线上,并且中心点位于(0,0)。这是因为仿射变换如旋转和平移不会影响相对距离。

让线上的点集定义为P = {(x,0)< = x is real} 将点X的距离定义为总和(P => | P - X |)

引理1 :中心点必须沿y = 0线。假设中心点位于(x,y),y!= 0.考虑点(x,0 )。

sum(P - (x,y)) = sum( sqrt( (p-x)*(p-x) + (0-y)*(0-y) ) )
               = sum( sqrt( p*p - 2xp + x*x + y*y ) )
               > sum( sqrt( p*p - 2xp + x*x + (0-0)*(0-0) ) )
               = sum(P - (x,0))

这是一个矛盾,因此y = 0必须为真。

1个元素的基本情况:它是奇数个元素,所以选择它:(0,0)。假设存在点X =(x,0)使得x更接近。那意味着| x - 0 | < (0 - 0),或者| x | < 0,这是不可能的。因此(0,0)是中心点。

3个元素的基本情况:它是奇数个元素,因此选择中间点:(0,0)。不失一般性,让其他两个点为(a <0,0)和(b> 0,0)。假设存在更接近的点X =(x,0)。那意味着:

| x - 0 | + | x - a | + | x - b | &LT; | 0 - 0 | + | 0 - a | + | 0 - b |

&LT; =&GT;

| X | + | x - a | + | x - b | &LT; | A | + | b |

然而:

| X | + | x - a | + | x - b | &gt; = | x | + | a | + | b | &gt; = | a | + | b |,与假设相矛盾,因此(0,0)是中心点。

N个元素的案例(N个奇数)。假设所有奇数点都满足上述条件。设P为具有N个元素的集合,并按如下方式排列:

{(a,0),Q = {N-2个元素集,中心位于(0,0)},(b,0)}

假设中心点是X =(x,0)。

sum(P - X) = |x-a| + |x-b| + sum(Q - X)
           > |x-a| + |x-b| + sum(Q - (0,0))
           >= |a| + |b| + sum(Q - (0,0))
           = sum(P - (0,0))

这意味着假设是矛盾的,因此(0,0)必须是中心点。

这证明了它适用于所有奇数。偶数应该相似。

答案 2 :(得分:1)

以下不是最佳解决方案。但给出了正确的价值。

  1. 首先找到线条的角度,将所有点旋转以反转该角度,使其成为水平线
  2. 对所有X点进行排序,因为Y在旋转后将保持不变
  3. 设为X(1),X(2),X(3),...... X(N)
  4. 然后将每个R的计算距离D(R)从1到N存储为[(2R-N)* X(R)] - [X(1)+ X(2)+ X(3).. + X(R)] + [X(R + 1)+ X(R + 2)+ X(R + 3)... + X(N)]
  5. 获取minimun D(R)。
  6. 将X(R),Y旋转回原始角度。
  7. 这是您的预期价值。
  8. 如果加入D(R)&amp; D(R + 1)相同,则X(R),Y和D之间的所有旋转点都相同。 X(R + 1),Y将是您的预期值。
  9. 如果R为中间,则间隔,则答案将是最小的,因为加法次数[X(1)+ .. X(R)]和[X(R + 1)+ .. X(N)]几乎相等然后差异是最小的,否则如果一侧的加法数量更高,则总差异将高于相等加法的数量。类似地,如果存在偶数个点,则在(N)/ 2到(N / 2)+1之间的所有点将具有相同的相等距离​​。
  10. 因此,MEDIAN是正确答案。
  11. 希望这对你有用。

答案 3 :(得分:1)

通过找到中位数来解决这个问题。请参阅http://en.wikipedia.org/wiki/Geometric_median(“属性”部分)。在x或y坐标上执行计算就足够了。只要沿着所选轴的坐标对于该线不是恒定的,就可以使用它们。

答案 4 :(得分:0)

有趣的问题!

编辑:以下是错误的,但我不明白我的错误在哪里。

您在问题中解释的中位数解决方案是错误的解决方案。

既然你想证明正确性,我想尝试解决这个问题如下:

首先,由于所有点都是共线的,我们可以很容易地将它们分成X和Y分量。然后我们独立地为X和Y解决问题。假设我们得到值V[0] to V[n-1],其中n是点数。

现在问题在于计算x以使SUM( (V[0 ... n-1] - x)^2 )变得最小。我们构建了衍生2*n*x - 2*SUM( V[0 ... n-1] )

-n * x + SUM( V[0 ... n-1] )变为0。因此,x = SUM( V[0 ... n-1] ) / n

所以只需添加所有值并将它们除以n即可得到正确的最小解。在对x和y执行此操作后,您将获得所需的点。

这也等于我在第一次考虑你的问题时做出的假设,它适用于我测试的一些值。希望这可以帮助。 :)

答案 5 :(得分:0)

以上,mcdowella,FryGuy和ShreevatsaR在我的回复中有想法。

设n是线上的点数。设点为p(1),...,p(n),从左到右标记。

案例n = 1.正确。

案例n = 2.正确。您可以选择两点之间的任何一点。

案例n&gt; = 3.引入x-y坐标系。旋转飞机 这些点在x轴上。

最小化到其他点的距离的点必须在区间[p(1),p(n)]中,因为以下推理:如果它在p(1)的左边,则向右移动一点点(小到足以使x不会碰到p(1)),减少距离。同样,如果它在p(n)的右边。

选择线上的任意点x,不一定是p(1),...,p(n)中的一个。

设D是从x到其他点的距离之和。

设L是x左边的点数。同样,让R为右边的点数。

有三个子类。

子案例1:x是中位数。所以L = R.如果我们将x向左移动少量e,则距离和变为D-Le + Re + e = D + e&gt; D.同样,为了向右移动。因此,中位数给出了局部最小值。

子例2:x位于中位数的左侧。类似于以下子案例。

子案例3:x位于中位数的右侧。所以L&gt; = R.有两个点,使得x在(p(i),p(i + 1)]中(左端点被排除,但右边包括在内)。设e = x - p( i)中。

通过e向左移动x。我们可以让x成为p(i)。距离和变为D - Le + Re = D - (L - R)e&lt; = D.也就是说,我们可能减少D.我们不会增加它。

我们继续向左移动x,可能减小距离总和,而不是增加它,直到x成为中位数。所以中位数给出全局最小值。

答案 6 :(得分:-2)

嗯,你当然不需要对它们进行排序。只需取其x和y坐标的平均值即可。只要它们是共线的,这将在N维中起作用。

编辑:我意识到我正在计算平均值。您正在计算中位数,如另一个答案中所述,这可能更有可能获得到所有点的最小距离。

EDIT2:中位数是奇数个点的正确答案。对于偶数个点,它是沿着最内侧线段的任意点,由两侧具有相同点数的区域定义。

证明(ish):你找到了一个正确答案,但是对于偶数点而言,有多少。

对于任何两个点,这些点之间的线段上的任何点将具有到两个点的距离的总和是相同的。该线段之外的任何点的距离都大于线段上的距离。

因此,要找到距所有共线点的距离最小的点,您需要将问题分解为包含两个点的集合,即完全包含在其他线段中的线段。然后,只取最小的线段(或奇数点的情况下的点)并在该线段上选取一个点。该线段上的所有点将具有与该特定配置的所有点的最小距离。

如果你想要绘制图形,点图的所有距离都将具有相同的形状:/ 对于线段,距离图将如下所示:_ /

实质上,您想要添加所有距离图并找到最小值。