曼哈顿距离(Manhattan Distance)也称为城市街区距离,是一种在几何空间中测量两点之间距离的度量方式。它表示两个点在标准坐标系上的绝对轴距总和。
曼哈顿距离是标量空间中两点间各维度差的绝对值之和。在二维空间中,曼哈顿距离可以理解为从一个点到另一个点只能沿着水平或垂直方向行走的最小距离。
曼哈顿距离在计算机科学、图像处理、数据挖掘等领域有着广泛的应用。例如,在推荐系统中,曼哈顿距离可以用于计算用户之间或物品之间的相似度;在图像处理中,可以用于衡量图像之间的相似性。
曼哈顿距离(Manhattan Distance),也称为城市街区距离(City Block Distance),是在多维空间中两点之间测量路径长度的一种方法。它定义为在各坐标轴方向上距离的总和。对于在n维空间中的两个点

、

曼哈顿距离

简化为向量形式则是:

假设我们有两个二维空间中的点 (A(1, 2)) 和 (B(4, 6)),我们要计算它们之间的曼哈顿距离。
因此,点 (A(1, 2)) 和点 (B(4, 6)) 之间的曼哈顿距离为 7。
public class ManhattanDistance {
/**
* 计算两个二维点之间的曼哈顿距离
*
* @param x1 第一个点的x坐标
* @param y1 第一个点的y坐标
* @param x2 第二个点的x坐标
* @param y2 第二个点的y坐标
* @return 两个点之间的曼哈顿距离
*/
public static double calculateManhattanDistance(int x1, int y1, int x2, int y2) {
return Math.abs(x1 - x2) + Math.abs(y1 - y2);
}
/**
* 计算两个多维点之间的曼哈顿距离
*
* @param point1 第一个点的坐标数组
* @param point2 第二个点的坐标数组
* @return 两个点之间的曼哈顿距离
* @throws IllegalArgumentException 如果两个点的维度不同
*/
public static double calculateManhattanDistance(int[] point1, int[] point2) {
if (point1.length != point2.length) {
throw new IllegalArgumentException("两个点的维度必须相同");
}
double distance = 0;
for (int i = 0; i < point1.length; i++) {
distance += Math.abs(point1[i] - point2[i]);
}
return distance;
}
public static void main(String[] args) {
// 示例:计算二维空间中两个点的曼哈顿距离
int x1 = 1, y1 = 2;
int x2 = 4, y2 = 6;
double distance2D = calculateManhattanDistance(x1, y1, x2, y2);
System.out.println("二维空间中的曼哈顿距离: " + distance2D);
// 示例:计算多维空间中两个点的曼哈顿距离
int[] pointA = {1, 2, 3};
int[] pointB = {4, 6, 5};
double distanceND = calculateManhattanDistance(pointA, pointB);
System.out.println("多维空间中的曼哈顿距离: " + distanceND);
}
}在这个代码中,calculateManhattanDistance(int x1, int y1, int x2, int y2) 方法用于计算二维空间中两个点的曼哈顿距离。而 calculateManhattanDistance(int[] point1, int[] point2) 方法则用于计算多维空间中两个点的曼哈顿距离。这两个方法都返回两个点之间的曼哈顿距离,作为 double 类型的值。
在 main 方法中,我们给出了两个示例,分别演示了如何计算二维空间和多维空间中两个点的曼哈顿距离。
曼哈顿距离得名于纽约曼哈顿区的网格布局,想象在这样的街道上从一个十字路口走到另一个十字路口,只能沿着横向或纵向的街道移动,不能直接对角线穿越,所走的总街区数即为两路口间的曼哈顿距离。
曼哈顿距离在路径规划、图像处理、数据分析等领域有广泛应用,尤其是在需要考虑沿坐标轴的独立移动成本时。