与所有其他给定点相比曼哈顿距离最小的所有点[优化]

时间:2012-05-02 17:22:13

标签: algorithm optimization

这里的问题是找到所有整数点的集合,它给出了来自给定点集的所有曼哈顿距离的最小总和!

例如:

让我们得到一组给定的点{P1,P2,P3 ...... Pn}

基本问题是找到一个点,说X在点{P1,P2,P3 ... Pn}的所有距离上都有最小总和。

即。 | P1-X | + | P2-X | + .... + | Pn-X | = D,其中D对所有X都是最小的。

更进一步,可以有多个X值满足上述条件。即,可能有多个X可以给出相同的值D.因此,我们需要找到所有这样的X.

任何人都能想到的一个基本方法是找到输入的中位数,然后强调this post中提到的坐标

但是这种方法的问题是:如果中位数给出了两个非常分开的值,那么我们最终会强制所有在给定时间内永远不会运行的点。

那么,是否有任何其他方法可以在结果相距很远时给出结果(中位数给出的范围大约为10 ^ 9)。

4 个答案:

答案 0 :(得分:9)

您可以单独考虑X和Y,因为它们相互独立地增加了距离。这减少了在线上n个点找到与其他点之间的最小距离和的点的问题。这很简单:两个中位数(包括两个)之间的任何点都将满足这一点。


证明:如果我们的积分数相等,则会有两个中位数。两个中位数之间的点将在左侧有n / 2个点,在右侧有n / 2个点,并且到S的那些点的总距离之和。

如果我们将它向左移动一个点,S将向上移动n / 2 (因为我们从最右边的点移开)并向下移动n / 2 (因为我们正朝着最左边的点移动),所以整体S保持不变。在我们达到最左边的中间点之前,这是正确的。当我们向左移动最左边的中间点时,我们现在有(n / 2 + 1)点到右边,而(n / 2 - 1)指向左边,所以S上升了两个。继续向左只会进一步增加S. 按照同样的逻辑,最右边中间点右边的所有点也都有较高的S值。

如果我们有一个奇数点,那么只有一个中位数。使用与上面相同的逻辑,我们可以证明它具有最低的S值。

答案 1 :(得分:3)

如果中位数给出的间隔为10 ^ 9,那么该区间中的每个点都与其他任何点一样好。

因此,根据您稍后要对这些点做什么,您可以返回范围或枚举该范围内的点。没办法..

显然,在二维方面,你会得到一个三维的方形长方形等方法。

结果将始终是为每个维度获取的范围的笛卡尔积,因此您可以返回这些范围的列表。

答案 2 :(得分:1)

由于在曼哈顿距离内每个组件单独提供,您也可以单独考虑它们。最佳答案是(中位数(x),中位数(y))。你需要环顾这一点来寻找整数解。

注意:我在回答时没有正确阅读您的问题。我的回答仍然存在,但可能你已经知道了这个解决方案。

答案 3 :(得分:0)

是的我还认为,对于网格上的奇数N个点,将只有一个单点(即MEDIAN),它将与所有其他点的曼哈顿距离的最小总和。

对于N的偶数值,场景会有所不同。

根据我的说法,如果他们的笛卡尔乘积为X = {1,2} and Y= {3,4},那么它们总是为4。

X × Y = {1,2} × {3,4} = {(1,3), (1,4), (2,3), (2,4)}。这是我到目前为止所理解的。

对于偶数值,我们总是将“MIDDLE TWO”值作为MEDIAN。从X取2,从Y取2,将总是返回4点的笛卡尔乘积。

如果我错了,请纠正我。