一、欧氏距离(欧几里得度量)
欧氏距离 是最易于理解的一种距离算法。在数学的平面直角坐标系中,设点 A , B A,B A,B 的坐标分别为 A ( x 1 , y 1 ) , B ( x 2 , y 2 ) A(x_1,y_1),B(x_2,y_2) A(x1,y1),B(x2,y2),求点 A , B A,B A,B 之间的距离,我们一般会使用如下公式:
∣ A B ∣ = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 \left | AB \right | = \sqrt{\left ( x_2 - x_1 \right )^2 + \left ( y_2 - y_1 \right )^2} ∣AB∣=(x2−x1)2+(y2−y1)2
实际上这就是平面 (二维空间) 中两点欧氏距离的距离公式,除此之外 P ( x , y ) P ( x , y ) P(x,y)P(x,y) P(x,y)P(x,y) 到原点的欧氏距离可以用公式表示为:
∣ P ∣ = x 2 + y 2 \left | P \right | = \sqrt{x^2+y^2} ∣P∣=x2+y2
举个例子,在下图中 A , B A,B A,B 的坐标分别为 A ( 6 , 5 ) , B ( 2 , 2 ) A(6,5),B(2,2) A(6,5),B(2,2) 。
通过公式,我们很容易得到 A,BA,B 两点间的欧氏距离:
∣
A
B
∣
=
(
2
−
6
)
2
+
(
2
−
5
)
2
=
4
2
+
3
2
=
5
\left | AB \right | = \sqrt{\left ( 2 - 6 \right )^2 + \left ( 2 - 5 \right )^2} = \sqrt{4^2+3^2} = 5
∣AB∣=(2−6)2+(2−5)2=42+32=5
那么,三维空间 中两点的欧氏距离公式呢? 我们来观察下图。
我们很容易发现,在 △ A D C \triangle ADC △ADC中, ∠ A D C = 9 0 ∘ \angle ADC = 90^\circ ∠ADC=90∘ ;在 △ A C B \triangle ACB △ACB中, ∠ A C B = 9 0 ∘ \angle ACB = 90^\circ ∠ACB=90∘。
由此可得,三维空间 中欧氏距离的距离公式为:
∣
A
B
∣
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
+
(
z
2
−
z
1
)
2
\left | AB \right | = \sqrt{\left ( x_2 - x_1 \right )^2 + \left ( y_2 - y_1 \right )^2 + \left ( z_2 - z_1 \right )^2}
∣AB∣=(x2−x1)2+(y2−y1)2+(z2−z1)2
∣
P
∣
=
x
2
+
y
2
+
z
2
\left | P\right | = \sqrt{x^2+y^2+z^2}
∣P∣=x2+y2+z2
以此类推,我们就得到了
n
n
n 维空间 中欧氏距离的距离公式:
欧氏距离 的一般模型:
在一个坐标系上,求从一个点到另一个点的最短距离。
欧氏距离 的缺点:
两个整点计算其欧氏距离时,往往答案是浮点型,会存在精度误差。
二、曼哈顿距离
在 二维空间 内,两个点之间的曼哈顿距离为它们横坐标之差的绝对值与纵坐标之差的绝对值之和。设点 A ( x 1 , y 1 ) , B ( x 2 , y 2 ) A(x_1,y_1),B(x_2,y_2) A(x1,y1),B(x2,y2),则 A , B A,B A,B 之间的曼哈顿距离用公式可以表示为:
d ( A , B ) = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d(A,B) = \left | x_1 - x_2\right | + \left | y_1 - y_2 \right | d(A,B)=∣x1−x2∣+∣y1−y2∣
观察下图:
在 A , B A,B A,B 间, 黄线 \color{yellow}{\text{黄线}} 黄线, 橙线 \color{orange}{\text{橙线}} 橙线 都表示曼哈顿距离,而 红线 \color{red}{\text{红线}} 红线, 蓝线 \color{blue}{\text{蓝线}} 蓝线 表示 等价 的曼哈顿距离, 绿线 \color{green}{\text{绿线}} 绿线 表示欧氏距离。
同样的例子,在下图中 A , B A,B A,B 的坐标分别为 A ( 6 , 5 ) , B ( 2 , 2 ) A(6,5),B(2,2) A(6,5),B(2,2) 。
通过公式,我们很容易得到 A , B A,B A,B 两点间的曼哈顿距离:
d ( A , B ) = ∣ 6 − 2 ∣ + ∣ 5 − 2 ∣ = 4 + 3 = 7 d(A,B) = \left | 6 - 2\right | + \left | 5 - 2\right | = 4 + 3 = 7 d(A,B)=∣6−2∣+∣5−2∣=4+3=7
n n n 维空间 的曼哈顿距离公式:
除了公式之外,曼哈顿距离还具有以下 数学性质:
非负性
曼哈顿距离是一个非负数。
d ( i , j ) ≥ 0 d ( i , j ) ≥ 0 d(i,j)\geq 0d(i,j)≥0 d(i,j)≥0d(i,j)≥0
统一性
点到自身的曼哈顿距离为 0 0 0 。
d ( i , i ) = 0 d(i,i) = 0 d(i,i)=0
对称性
A A A 到 B B B 与 B B B 到 A A A 的曼哈顿距离相等,且是对称函数。
d ( i , j ) = d ( j , i ) d(i,j) = d(j,i) d(i,j)=d(j,i)
三角不等式
从点 i i i 到 j j j 的直接距离不会大于途经的任何其它点 k k k 的距离。
d ( i , j ) ≤ d ( i , k ) + d ( k , j ) d(i,j)\leq d(i,k)+d(k,j) d(i,j)≤d(i,k)+d(k,j)
曼哈顿距离 的一般模型:
在国际象棋棋盘上,车从一个格子走到另一个格子的最短距离就是曼哈顿距离。
若网格图上的一个点只能到上下左右 44 个点,且到这 44 个点的距离都相同,则该网格图上两点的距离也为曼哈顿距离。
例题2.1 P5098 [USACO2004OPEN]Cave Cows 3 洞穴里的牛之三
由于 i i i 和 j j j 是无序的,我们不妨假设 x i ≥ x j x_i\ge x_j xi≥xj,那么我们对 y y y 进行分类讨论:
如果 y i ≥ y j y_i\ge y_j yi≥yj,那么 d ( i , j ) = x i − x j + y i − y j = ( x i + y i ) − ( x j + y j ) d(i,j)=x_i-x_j+y_i-y_j=(x_i+y_i)-(x_j+y_j) d(i,j)=xi−xj+yi−yj=(xi+yi)−(xj+yj)。答案最大为 max x + y − min x + y \max_{x+y}-\min_{x+y} maxx+y−minx+y。
如果 y i < y j y_i<y_j yi<yj ,那么 d ( i , j ) = x i − x j − y i + y j = ( x i − y i ) − ( x j − y j ) d(i,j)=x_i-x_j-y_i+y_j=(x_i-y_i)-(x_j-y_j) d(i,j)=xi−xj−yi+yj=(xi−yi)−(xj−yj)。答案最大为 max x − y − min x − y \max_{x-y}-\min_{x-y} maxx−y−minx−y。
所以我们只需要维护 x + y x+y x+y 和 x − y x-y x−y 的最大值和最小值就行了。
代码如下:
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int X=0;bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
int main()
{
int n=read();
int sum1=-INT_MAX,sum2=INT_MAX;
int dif1=-INT_MAX,dif2=INT_MAX;
for(int i=1;i<=n;++i)
{
int x=read(),y=read();
sum1=max(sum1,x+y);
sum2=min(sum2,x+y);
dif1=max(dif1,x-y);
dif2=min(dif2,x-y);
}
printf("%d",max(sum1-sum2,dif1-dif2));
return 0;
}
三、切比雪夫距离
在 二维空间 内,两个点之间的切比雪夫距离为它们横坐标之差的绝对值与纵坐标之差的绝对值的最大值。设点 A ( x 1 , y 1 ) , B ( x 2 , y 2 ) A(x_1,y_1),B(x_2,y_2) A(x1,y1),B(x2,y2),则 A , B A,B A,B 之间的切比雪夫距离用公式可以表示为:
d
(
A
,
B
)
=
max
(
∣
x
1
−
x
2
∣
,
∣
y
1
−
y
2
∣
)
d(A,B) = \max(\left | x_1 - x_2\right | , \left | y_1 - y_2\right | )
d(A,B)=max(∣x1−x2∣,∣y1−y2∣)
仍然是这个例子,下图中
A
,
B
A,B
A,B 的坐标分别为
A
(
6
,
5
)
,
B
(
2
,
2
)
A(6,5),B(2,2)
A(6,5),B(2,2) 。
d
(
A
,
B
)
=
max
(
∣
6
−
2
∣
,
∣
5
−
2
∣
)
=
max
(
4
,
3
)
=
4
d(A,B) = \max(\left | 6 - 2\right | , \left | 5 - 2\right | )=\max(4,3)=4
d(A,B)=max(∣6−2∣,∣5−2∣)=max(4,3)=4
n n n 维空间 的切比雪夫距离公式:
切比雪夫距离 的一般模型:
在国际象棋棋盘上,国王与王后从一个格子走到另一个格子的最短距离都是切比雪夫距离。
若网格图上的一个点只能到周围 8 8 8 个点,且到这 8 8 8 个点的距离都相同,则该网格图上两点的距离也为切比雪夫距离。
四、二维曼哈顿距离与切比雪夫距离的相互转化
首先,我们考虑画出平面直角坐标系上所有到原点的 曼哈顿距离 为 1 1 1 的点。
通过公式,我们很容易得到方程 ∣ x ∣ + ∣ y ∣ = 1 \left | x\right| +\left | y\right| = 1 ∣x∣+∣y∣=1。
将绝对值展开,得到 4 4 4 个 一次函数 ,分别是:
y
=
x
+
1
(
x
≥
0
,
y
≥
0
)
y = x + 1\ (x \geq 0, y \geq 0)
y=x+1 (x≥0,y≥0)
y
=
−
x
+
1
(
x
≤
0
,
y
≥
0
)
y = -x + 1\ (x \leq 0, y \geq 0)
y=−x+1 (x≤0,y≥0)
y
=
x
−
1
(
x
≥
0
,
y
≤
0
)
y = x - 1\ (x \geq 0, y \leq 0)
y=x−1 (x≥0,y≤0)
y
=
−
x
−
1
(
x
≤
0
,
y
≤
0
)
y = -x - 1\ (x \leq 0, y \leq 0)
y=−x−1 (x≤0,y≤0)
将这 4 4 4 个函数画到平面直角坐标系上,得到一个边长为 2 \sqrt{2} 2的正方形,如下图所示:
正方形边界上所有的点到原点的 曼哈顿距离 都是 1 1 1 。
同理,我们再考虑画出平面直角坐标系上所有到原点的,切比雪夫距离 为 1 1 1 的点。
通过公式,我们知道 max ( ∣ x ∣ , ∣ y ∣ ) = 1 \max(\left |x\right | ,\left | y\right| )=1 max(∣x∣,∣y∣)=1 。
我们将式子展开,也同样可以得到可以得到 4 4 4 条 线段,分别是:
y
=
1
(
−
1
≤
x
≤
1
)
y = 1\ (-1\leq x \leq 1)
y=1 (−1≤x≤1)
y
=
−
1
(
−
1
≤
x
≤
1
)
y = -1\ (-1\leq x \leq 1)
y=−1 (−1≤x≤1)
x
=
1
(
−
1
≤
y
≤
1
)
x = 1\ (-1\leq y \leq 1)
x=1 (−1≤y≤1)
x
=
−
1
(
−
1
≤
y
≤
1
)
x = -1\ (-1\leq y \leq 1)
x=−1 (−1≤y≤1)
画到平面直角坐标系上,可以得到一个边长为
2
2
2 的正方形,如下图所示:
正方形边界上所有的点到原点的 切比雪夫距离 都是 1 1 1 。
将这两幅图对比,我们会神奇地发现:
这 2 2 2 个正方形是 相似图形 。
所以,曼哈顿距离 与 切比雪夫距离 之间会不会有联系呢?
接下来我们简略证明一下:
假设 A ( x 1 , y 1 ) , B ( x 2 , y 2 ) A(x_1,y_1),B(x_2,y_2) A(x1,y1),B(x2,y2), A , B A,B A,B 两点的 曼哈顿距离 为:
我们很容易发现,这就是 ( x 1 + y 1 , x 1 − y 1 ) , ( x 2 + y 2 , x 2 − y 2 ) (x_1 + y_1,x_1 - y_1), (x_2 + y_2,x_2 - y_2) (x1+y1,x1−y1),(x2+y2,x2−y2)两点之间的 切比雪夫距离。
所以将每一个点 ( x , y ) (x,y) (x,y) 转化为 ( x + y , x − y ) (x + y, x - y) (x+y,x−y) ,新坐标系下的 切比雪夫距离 即为原坐标系下的 曼哈顿距离。
同理,
A
,
B
A,B
A,B 两点的 切比雪夫距离 为:
而这就是 ( x 1 + y 1 2 , x 1 − y 1 2 ) , ( x 2 + y 2 2 , x 2 − y 2 2 ) \left(\frac{x_1 + y_1}{2},\frac{x_1 - y_1}{2}\right),\left (\frac{x_2 + y_2}{2},\frac{x_2 - y_2}{2}\right) (2x1+y1,2x1−y1),(2x2+y2,2x2−y2) 两点之间的 曼哈顿距离。
所以将每一个点 ( x , y ) (x,y) (x,y) 转化为 ( x + y 2 , x − y 2 ) \left(\frac{x + y}{2},\frac{x - y}{2}\right) (2x+y,2x−y),新坐标系下的 曼哈顿距离 即为原坐标系下的 切比雪夫距离。
结论:
将切比雪夫坐标系旋转 4 5 ∘ 45^\circ 45∘,再缩小到原来的一半,即可得到曼哈顿坐标系。
将点$ (x,y)$ 的坐标变为 ( x + y , x − y ) (x + y, x - y) (x+y,x−y) ,
原坐标系中的 曼哈顿距离 = = = 新坐标系中的 切比雪夫距离
将点 ( x , y ) (x,y) (x,y) 的坐标变为 ( x + y 2 , x − y 2 ) \left( \frac{x + y}{2},\frac{x - y}{2} \right) (2x+y,2x−y),
原坐标系中的 切比雪夫距离 = = = 新坐标系中的 曼哈顿距离 。
碰到求 切比雪夫距离 或 曼哈顿距离 的题目时,我们往往可以相互转化来求解。两种距离在不同的题目中有不同的优缺点,要学会做出正确的选择。