切比雪夫距离
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
曼哈顿距离
若有点 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)和 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2)则 A , B A,B A,B两点的曼哈顿距离为 ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| ∣x1−x2∣+∣y1−y2∣。
若要求 n n n个点两两之间的曼哈顿距离之和因为 x x x的贡献和 y y y的贡献是分开的所以我们可以分别处理。
将 n n n个点的 x x x和 y y y分别排序用前缀和来求解。时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)。
切比雪夫距离
曼哈顿距离可以理解为每次可以向上、下、左、右四个方向中的一个方向走一步从一点走到另一点的的最小步数。
则切比雪夫距离就是可以向八个方向中的一个方向走一步从一点走到另一点的的最小步数。
若有点 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)和 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2)则 A , B A,B A,B两点的切比雪夫距离为 max ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) \max(|x_1-x_2|,|y_1-y_2|) max(∣x1−x2∣,∣y1−y2∣)。
若要求 n n n个点两两之间的切比雪夫距离之和因为 x x x的贡献和 y y y的贡献不是独立的所以好像只能一个个枚举用 O ( n 2 ) O(n^2) O(n2)的时间复杂度来求解。
难道真的没有更快的做法吗
优化
我们可以将原坐标系上的点逆时针旋转 4 5 ∘ 45^{\circ} 45∘则 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)在旋转后的坐标为 ( x A , y A ) (x_A,y_A) (xA,yA)
x A = x 1 cos 4 5 ∘ − y 1 sin 4 5 ∘ = 2 2 ( x 1 − y 1 ) x_A=x_1\cos 45^{\circ}-y_1\sin 45^{\circ}=\dfrac{\sqrt 2}{2}(x_1-y_1) xA=x1cos45∘−y1sin45∘=22(x1−y1)
y A = x 1 sin 4 5 ∘ + y 1 cos 4 5 ∘ = 2 2 ( x 1 + y 1 ) y_A=x_1\sin 45^{\circ}+y_1\cos 45^{\circ}=\dfrac{\sqrt 2}{2}(x_1+y_1) yA=x1sin45∘+y1cos45∘=22(x1+y1)
再将点到原点的距离放大到原来的 2 \sqrt 2 2倍得 x A = x 1 − y 1 , y A = x 1 + y 1 x_A=x_1-y_1,y_A=x_1+y_1 xA=x1−y1,yA=x1+y1
同理 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2)通过上述转换后的坐标为 B ′ ( x B , y B ) B'(x_B,y_B) B′(xB,yB) x B = x 2 − y 2 , y B = x 2 + y 2 x_B=x_2-y_2,y_B=x_2+y_2 xB=x2−y2,yB=x2+y2
A , B A,B A,B的切比雪夫距离为 max ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) \max(|x_1-x_2|,|y_1-y_2|) max(∣x1−x2∣,∣y1−y2∣)
A
′
,
B
′
A',B'
A′,B′的曼哈顿距离为
∣
x
A
−
x
B
∣
+
∣
y
A
−
y
B
∣
=
∣
(
x
1
−
y
1
)
−
(
x
2
−
y
2
)
∣
+
∣
(
x
1
+
y
1
)
−
(
x
2
+
y
2
)
∣
|x_A-x_B|+|y_A-y_B|=|(x_1-y_1)-(x_2-y_2)|+|(x_1+y_1)-(x_2+y_2)|
∣xA−xB∣+∣yA−yB∣=∣(x1−y1)−(x2−y2)∣+∣(x1+y1)−(x2+y2)∣
=
∣
(
x
1
−
x
2
)
−
(
y
1
−
y
2
)
∣
+
∣
(
x
1
−
x
2
)
+
(
y
1
−
y
2
)
∣
\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad =|(x_1-x_2)-(y_1-y_2)|+|(x_1-x_2)+(y_1-y_2)|
=∣(x1−x2)−(y1−y2)∣+∣(x1−x2)+(y1−y2)∣
令 t x = x 1 − x 2 , t y = y 1 − y 2 t_x=x_1-x_2,t_y=y_1-y_2 tx=x1−x2,ty=y1−y2
A , B A,B A,B的切比雪夫距离为 max ( ∣ t x ∣ , ∣ t y ∣ ) \max(|t_x|,|t_y|) max(∣tx∣,∣ty∣) A ′ , B ′ A',B' A′,B′的曼哈顿距离为 ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣
- 若 t x > 0 , t y > 0 t_x>0,t_y>0 tx>0,ty>0 ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 t x > t y t_x>t_y tx>ty时为 2 t x 2t_x 2tx在 t x < t y t_x<t_y tx<ty时为 2 t y 2t_y 2ty
- 若 t x > 0 , t y < 0 t_x>0,t_y<0 tx>0,ty<0 ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 t x > − t y t_x>-t_y tx>−ty时为 2 t x 2t_x 2tx在 t x < − t y t_x<-t_y tx<−ty时为 − 2 t y -2t_y −2ty
- 若 t x < 0 , t y > 0 t_x<0,t_y>0 tx<0,ty>0 ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 − t x > t y -t_x>t_y −tx>ty时为 − 2 t x -2t_x −2tx在 − t x < t y -t_x<t_y −tx<ty时为 2 t y 2t_y 2ty
- 若 t x < 0 , t y < 0 t_x<0,t_y<0 tx<0,ty<0 ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 − t x > − t y -t_x>-t_y −tx>−ty时为 − 2 t x -2t_x −2tx在 − t x < − t y -t_x<-t_y −tx<−ty时为 − 2 t y -2t_y −2ty
经过分类讨论我们发现 A ′ , B ′ A',B' A′,B′的曼哈顿距离为 A , B A,B A,B的切比雪夫距离的两倍。由此可得在求 n n n个点两两之间的切比雪夫距离之和时将每个点逆时针旋转 4 5 ∘ 45^{\circ} 45∘在放大到原来的 2 \sqrt 2 2倍求新的点的曼哈顿距离在除以2即为原来 n n n个点的切比雪夫距离。
这样求 n n n个点两两之间的切比雪夫距离时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)。