编程语言
首页 > 编程语言> > 距离算法学习记录

距离算法学习记录

作者:互联网

距离算法学习记录

https://www.luogu.org/blog/xuxing/Distance-Algorithm

一篇非常好的luogu日报。我从这里学来的。

欧几里得距离

定义上是两点之间不论地形的最短距离。

二维: \(|AB| = \sqrt{(x_1 - x_2) ^ 2 + (y_1 - y_2) ^ 2}\)

三维:\(|AB| = \sqrt{(x_1 - x_2) ^ 2 + (y_1 - y_2) ^ 2 + (z_1-z_2) ^ 2}\)

直接求就是了。

如果要找一个点,使得到\(n\)个点的欧几里得距离和最小的话,应该要用到模拟退火。

一般这种距离都是浮点数,没有什么特别的算法。

曼哈顿距离

定义上只能走直路,不能走斜路。

\(|AB| = |x_1 - x_2| + |y_1 - y_2|\)

不容易求最短曼哈顿距离,因为\(x\)最大的\(y\)不一定最大,\(x\)最小的\(y\)不一定最小。(但也能求,下面有)

虽然这样很麻烦,但在另一方面就有特别优秀的性质:可以对\(x\)和\(y\)分别计算贡献。(下面也有)

用这个性质,我们可以以\(O(n \log n)\)的复杂度找到一个点,使得到\(n\)个点的曼哈顿距离和最小。

切比雪夫距离

定义上是允许用与走直路同样的代价走斜路。

\(|AB|=\max(|x_1-x_2|, |y_1-y_2|)\) 证明很简单。

容易求最短切比雪夫距离,直接维护最大最小的\(x\)和\(y\)就可以了。

但是很难找到一个点,使得到\(n\)个点的切比雪夫距离和最小。特别复杂。

后两种距离的互换

我们可以通过重新建系定义点来实现距离的互换。证明就不写了

原坐标系\((x,y)\)的曼哈顿距离会等于新坐标系\((x+y,x-y)\)的切比雪夫距离。

原坐标系\((x,y)\)的切比雪夫距离会等于新坐标系\((\frac{x+y}{2}, \frac{x-y}{2})\)的曼哈顿距离。

例题

P5098 [USACO2004OPEN]Cave Cows 3 洞穴里的牛之三

一句话题意:求\(n\)个点中最大的曼哈顿距离。

法一:曼哈顿距离

对任意的两个点\((x_1,y_1)\)和\((x_2,y_2)\),按照绝对值讨论四种情况:

  1. \(x_1 \geq x_2,y_1 \geq y_2\),此时他们的曼哈顿距离为\(x_1- x_2 + y_1 - y_2\),即\((x_1+y_1)-(x_2+y_2)\)。
  2. \(x_1 \geq x_2,y_1 < y_2\),此时他们的曼哈顿距离为\(x_1-x_2+y_2-y_1\),即\((x_1-y_1)-(x_2-y_2)\)。
  3. \(x_1 < x_2,y_1 \geq y_2\),此时他们的曼哈顿距离为\(x_2-x_1+y_1-y_2\),即\((x_2-y_2)-(x_1-y_1)\)。
  4. \(x_1 < x_2,y_1 < y_2\),此时他们的曼哈顿距离为\(x_2-x_1+y_2-y_1\),即\((x_2+y_2)-(x_1+y_1)\)。

可以看出,这个最大值只与这些点的\(x+y\)与\(x-y\)有关。

所以所有点中的最大曼哈顿距离就等于\(\max((x+y)_{max} - (x+y)_{min}, (x-y)_{max} - (x - y)_{min})\)。

法二:转切比雪夫距离

每个点转换为新的点\((x+y,x-y)\),然后就变成了求这些新点中最大的切比雪夫距离。

由定义可知:答案就等于\(\max(x_{max} - x_{min},y_{max} - y_{min})\)。一次遍历找出\(x\)和\(y\)的最大最小值即可。

P3964 [TJOI2013]松鼠聚会

一句话题意:在\(n\)个点中找到一个点,使得到\(n\)个点的切比雪夫距离最小。

上边说了不好求,我们转换成曼哈顿距离,坐标变成\((\frac{x+y}{2}, \frac{x-y}{2})\)。

确定一个聚会地点,怎么快速算出路程之和?只要\(x\)跟\(y\)分开考虑贡献即可。

以\(x\)坐标为例,假如我们选中第\(i\)个点为聚会地点,那么其他点(设为点\(j\))的横坐标的贡献就有两种:

  1. \(x_j < x_i\),此时会有\(x_i - x_j\)的贡献。
  2. \(x_j > x_i\),此时会有\(x_j - x_i\)的贡献。

只要我们将新坐标中的\(x\)坐标从小到大排序,就可以在里面二分得到有多少个点是第一种贡献,多少个点是第二种贡献。

两种贡献都对应两个区间内的\(x\)值之和,我们用前缀和处理一下即可。

\(y\)坐标同理。

复杂度\(O(n \log n)\)。

标签:个点,记录,曼哈顿,max,比雪夫,最小,距离,算法
来源: https://www.cnblogs.com/Garen-Wang/p/11244159.html