切比雪夫距离

文章介绍了曼哈顿距离和切比雪夫距离的概念,并指出计算多个点的切比雪夫距离通常需要O(n^2)的时间复杂度。通过坐标系旋转45度并放大坐标,可以将切比雪夫距离转化为曼哈顿距离的两倍,从而降低计算时间复杂度至O(nlogn)。这种方法提供了一种优化计算大量点之间切比雪夫距离的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

曼哈顿距离

若有点A(x1,y1)A(x_1,y_1)A(x1,y1)B(x2,y2)B(x_2,y_2)B(x2,y2),则A,BA,BA,B两点的曼哈顿距离为∣x1−x2∣+∣y1−y2∣|x_1-x_2|+|y_1-y_2|x1x2+y1y2

若要求nnn个点两两之间的曼哈顿距离之和,因为xxx的贡献和yyy的贡献是分开的,所以我们可以分别处理。

nnn个点的xxxyyy分别排序,用前缀和来求解。时间复杂度为O(nlog⁡n)O(n\log n)O(nlogn)


切比雪夫距离

曼哈顿距离可以理解为每次可以向上、下、左、右四个方向中的一个方向走一步,从一点走到另一点的的最小步数。

则切比雪夫距离就是可以向八个方向中的一个方向走一步,从一点走到另一点的的最小步数。

若有点A(x1,y1)A(x_1,y_1)A(x1,y1)B(x2,y2)B(x_2,y_2)B(x2,y2),则A,BA,BA,B两点的切比雪夫距离为max⁡(∣x1−x2∣,∣y1−y2∣)\max(|x_1-x_2|,|y_1-y_2|)max(x1x2,y1y2)

若要求nnn个点两两之间的切比雪夫距离之和,因为xxx的贡献和yyy的贡献不是独立的,所以好像只能一个个枚举,用O(n2)O(n^2)O(n2)的时间复杂度来求解。

难道真的没有更快的做法吗?


优化

我们可以将原坐标系上的点逆时针旋转45∘45^{\circ}45,则A(x1,y1)A(x_1,y_1)A(x1,y1)在旋转后的坐标为(xA,yA)(x_A,y_A)(xA,yA)

xA=x1cos⁡45∘−y1sin⁡45∘=22(x1−y1)x_A=x_1\cos 45^{\circ}-y_1\sin 45^{\circ}=\dfrac{\sqrt 2}{2}(x_1-y_1)xA=x1cos45y1sin45=22(x1y1)

yA=x1sin⁡45∘+y1cos⁡45∘=22(x1+y1)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 22倍,得xA=x1−y1,yA=x1+y1x_A=x_1-y_1,y_A=x_1+y_1xA=x1y1,yA=x1+y1

同理,B(x2,y2)B(x_2,y_2)B(x2,y2)通过上述转换后的坐标为B′(xB,yB)B'(x_B,y_B)B(xB,yB)xB=x2−y2,yB=x2+y2x_B=x_2-y_2,y_B=x_2+y_2xB=x2y2,yB=x2+y2

A,BA,BA,B的切比雪夫距离为max⁡(∣x1−x2∣,∣y1−y2∣)\max(|x_1-x_2|,|y_1-y_2|)max(x1x2,y1y2)

A′,B′A',B'A,B的曼哈顿距离为∣xA−xB∣+∣yA−yB∣=∣(x1−y1)−(x2−y2)∣+∣(x1+y1)−(x2+y2)∣|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)
=∣(x1−x2)−(y1−y2)∣+∣(x1−x2)+(y1−y2)∣\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)|=(x1x2)(y1y2)+(x1x2)+(y1y2)

tx=x1−x2,ty=y1−y2t_x=x_1-x_2,t_y=y_1-y_2tx=x1x2,ty=y1y2

A,BA,BA,B的切比雪夫距离为max⁡(∣tx∣,∣ty∣)\max(|t_x|,|t_y|)max(tx,ty)A′,B′A',B'A,B的曼哈顿距离为∣tx−ty∣+∣tx+ty∣|t_x-t_y|+|t_x+t_y|txty+tx+ty

  • tx>0,ty>0t_x>0,t_y>0tx>0,ty>0∣tx−ty∣+∣tx+ty∣|t_x-t_y|+|t_x+t_y|txty+tx+tytx>tyt_x>t_ytx>ty时为2tx2t_x2tx,在tx<tyt_x<t_ytx<ty时为2ty2t_y2ty
  • tx>0,ty<0t_x>0,t_y<0tx>0,ty<0∣tx−ty∣+∣tx+ty∣|t_x-t_y|+|t_x+t_y|txty+tx+tytx>−tyt_x>-t_ytx>ty时为2tx2t_x2tx,在tx<−tyt_x<-t_ytx<ty时为−2ty-2t_y2ty
  • tx<0,ty>0t_x<0,t_y>0tx<0,ty>0∣tx−ty∣+∣tx+ty∣|t_x-t_y|+|t_x+t_y|txty+tx+ty−tx>ty-t_x>t_ytx>ty时为−2tx-2t_x2tx,在−tx<ty-t_x<t_ytx<ty时为2ty2t_y2ty
  • tx<0,ty<0t_x<0,t_y<0tx<0,ty<0∣tx−ty∣+∣tx+ty∣|t_x-t_y|+|t_x+t_y|txty+tx+ty−tx>−ty-t_x>-t_ytx>ty时为−2tx-2t_x2tx,在−tx<−ty-t_x<-t_ytx<ty时为−2ty-2t_y2ty

经过分类讨论,我们发现A′,B′A',B'A,B的曼哈顿距离为A,BA,BA,B的切比雪夫距离的两倍。由此可得,在求nnn个点两两之间的切比雪夫距离之和时,将每个点逆时针旋转45∘45^{\circ}45在放大到原来的2\sqrt 22倍,求新的点的曼哈顿距离,在除以2即为原来nnn个点的切比雪夫距离。

这样求nnn个点两两之间的切比雪夫距离,时间复杂度为O(nlog⁡n)O(n\log n)O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值