我是靠谱客的博主 激昂自行车,最近开发中收集的这篇文章主要介绍切比雪夫距离,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

曼哈顿距离

若有点 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| x1x2+y1y2

若要求 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(x1x2,y1y2)

若要求 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=x1cos45y1sin45=22 (x1y1)

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=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=x1y1,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=x2y2,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(x1x2,y1y2)

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)| xAxB+yAyB=(x1y1)(x2y2)+(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)| =(x1x2)(y1y2)+(x1x2)+(y1y2)

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=x1x2,ty=y1y2

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| txty+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| txty+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| txty+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| txty+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| txty+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)

最后

以上就是激昂自行车为你收集整理的切比雪夫距离的全部内容,希望文章能够帮你解决切比雪夫距离所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部