曼哈顿距离与切比雪夫距离
曼哈顿距离与切比雪夫距离
HeJie曼哈顿距离(Manhattan Distance)
解释:只能横着或竖着走,坐标上两点的距离。
假设存在两点
对于上方求曼哈顿距离的式子,有四种情况:
观察发现,上方四种情况中反复出现了两个值
例题应用 求到所有定点的最大曼哈顿距离最小:
切比雪夫距离(Chebyshev distance)
解释:各坐标数值差绝对值的最大值。
假设存在两点
这时忽然发现,之前曼哈顿距离得出的结论:
与切比雪夫距离的形式非常相似!并且如果将 A,B 两个点的坐标换成
那么可以得到另一个结论:
曼哈顿距离转切比雪夫距离
转化为 新坐标系下的切比雪夫距离,即为原坐标系下曼哈顿距离。
由上边的结论反向推导一下,得到了:
切比雪夫距离转曼哈顿距离
转化为 新坐标系下的曼哈顿距离,即为原坐标系下切比雪夫距离。
上方的例题中,正是利用了这个原理:
将曼哈顿距离转为切比雪夫距离后,
- 求出转化后最小和最大的
坐标和 坐标。 - 对于每个点算一下他们距离最小和最大的
的距离,取个 就是最远的距离。
例题应用 对于将切比雪夫距离转曼哈顿距离的问题(求到所有定点的切比雪夫距离之和最小):
几何图示与代码实现
以上用式子推导了一下两个距离的转化关系,如果转化为图示,会发现:
曼哈顿距离如图是一个以当前点为中心的菱形,切比雪夫距离如上图是一个当前点为中心的正方形。所以它们之间的相互转化相当于将这个图形
旋转
所以:
- 曼哈顿转切比雪夫 = ① 旋转
② 乘以 - 切比雪夫转曼哈顿 = ① 反向旋转
② 除以
对于 Python 之类的语言,直接用 rotate 函数之类的方式改变坐标确实比较方便;而对于 C++ 来说,利用之前推出的式子,就能达成类似的效果。
详细转化步骤图解
第一步:曼哈顿距离转切比雪夫距离
转化为
第二步:切比雪夫距离转曼哈顿距离
转化为
评论
匿名评论隐私政策




