我是靠谱客的博主 激昂自行车,这篇文章主要介绍切比雪夫距离,现在分享给大家,希望可以做个参考。

曼哈顿距离

若有点 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(nlog 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_1cos 45^{circ}-y_1sin 45^{circ}=dfrac{sqrt 2}{2}(x_1-y_1) xA​=x1​cos45∘−y1​sin45∘=22 ​​(x1​−y1​)

y A = x 1 sin ⁡ 4 5 ∘ + y 1 cos ⁡ 4 5 ∘ = 2 2 ( x 1 + y 1 ) y_A=x_1sin 45^{circ}+y_1cos 45^{circ}=dfrac{sqrt 2}{2}(x_1+y_1) yA​=x1​sin45∘+y1​cos45∘=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 ) ∣ qquadqquadqquadqquadqquadqquadqquadqquadqquad =|(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(nlog n) O(nlogn)。

最后

以上就是激昂自行车最近收集整理的关于切比雪夫距离的全部内容,更多相关切比雪夫距离内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(318)

评论列表共有 0 条评论

立即
投稿
返回
顶部