【数据结构】详解曼哈顿距离的计算与应用:从理论到代码实现的全方位指南

曼哈顿距离(Manhattan Distance),又称为L1距离或城市街区距离,是一种常用的几何度量方法,尤其在路径规划、图像处理和机器学习中广泛应用。本文将深入探讨曼哈顿距离的定义、特点、与欧几里得距离的比较,并通过Python代码示例展示其计算方法。希望通过这篇文章,你能全面了解曼哈顿距离的概念及其在实际中的应用。

一、曼哈顿距离的定义与特点

1. 什么是曼哈顿距离?

曼哈顿距离是在一个直角坐标系中,从一个点到另一个点的绝对轴距之和。其得名来源于美国曼哈顿区的街道布局,因为在那里街道成网格状,人们行走时通常只能沿着水平或垂直方向行走。

2. 公式表达

对于在二维平面上的两个点 P ( x 1 , y 1 ) \mathbf{P}(x_1, y_1) P(x1,y1) Q ( x 2 , y 2 ) \mathbf{Q}(x_2, y_2) Q(x2,y2),曼哈顿距离的计算公式为:
D Manhattan = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ D_{\text{Manhattan}} = \left| x_1 - x_2 \right| + \left| y_1 - y_2 \right| DManhattan=x1x2+y1y2
在三维空间中,如果点 P \mathbf{P} P Q \mathbf{Q} Q 的坐标分别为 ( x 1 , y 1 , z 1 ) \mathbf{(x_1, y_1, z_1)} (x1,y1,z1) ( x 2 , y 2 , z 2 ) \mathbf{(x_2, y_2, z_2)} (x2,y2,z2),则曼哈顿距离的公式扩展为:
D Manhattan = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ + ∣ z 1 − z 2 ∣ D_{\text{Manhattan}} = \left| x_1 - x_2 \right| + \left| y_1 - y_2 \right| + \left| z_1 - z_2 \right| DManhattan=x1x2+y1y2+z1z2

3. 曼哈顿距离的特点

  • 易计算:由于只需计算坐标差的绝对值之和,因此计算简单快速。
  • 适用于网格环境:在城市交通规划、机器人路径规划等场景中表现出色,因为这些场景中通常只能沿着水平或垂直方向移动。
  • 不同于欧几里得距离:曼哈顿距离与欧几里得距离(直线距离)不同,后者是两点之间的最短直线距离。

二、曼哈顿距离与欧几里得距离的比较

1. 欧几里得距离的定义与公式

欧几里得距离(Euclidean Distance)是最常用的距离度量之一,表示两个点之间的直线距离。其公式为:
D Euclidean = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 D_{\text{Euclidean}} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} DEuclidean=(x1x2)2+(y1y2)2
在三维空间中,公式为:
D Euclidean = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) 2 D_{\text{Euclidean}} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2 + (z_1 - z_2)^2} DEuclidean=(x1x2)2+(y1y2)2+(z1z2)2

2. 比较

  • 计算复杂度:欧几里得距离涉及平方和开方运算,计算复杂度略高于曼哈顿距离。
  • 适用场景:曼哈顿距离更适合网格环境,而欧几里得距离适用于连续空间。
  • 距离值:对于相同的两个点,曼哈顿距离一般大于或等于欧几里得距离,且在坐标轴对齐时二者相等。

三、曼哈顿距离的实际应用

  1. 路径规划

在城市交通规划和机器人路径规划中,曼哈顿距离可以用来估计从起点到终点的最短路径长度,特别是在只能沿着水平或垂直方向移动的情况下。

  1. 图像处理

在图像处理中,曼哈顿距离用于测量像素之间的差异,例如在图像分割和模式识别中。

  1. 机器学习

在机器学习中,曼哈顿距离常用于最近邻算法(k-NN)和聚类算法(如k-means)中,用以衡量样本之间的相似性。

四、Python代码实现

下面是使用Python计算曼哈顿距离的代码示例。我们将分别实现二维和三维空间中的曼哈顿距离计算。

1. 二维空间中的曼哈顿距离

def manhattan_distance_2d(point1, point2):
    """
    计算二维空间中两个点的曼哈顿距离
    
    参数:
    point1, point2 -- 分别是两个点的坐标,格式为 (x, y)
    
    返回值:
    曼哈顿距离
    """
    x1, y1 = point1
    x2, y2 = point2
    return abs(x1 - x2) + abs(y1 - y2)

# 示例
point1 = (1, 2)
point2 = (4, 6)
distance = manhattan_distance_2d(point1, point2)
print(f"二维空间中点 {point1} 和点 {point2} 的曼哈顿距离是 {distance}")

2. 三维空间中的曼哈顿距离

def manhattan_distance_3d(point1, point2):
    """
    计算三维空间中两个点的曼哈顿距离
    
    参数:
    point1, point2 -- 分别是两个点的坐标,格式为 (x, y, z)
    
    返回值:
    曼哈顿距离
    """
    x1, y1, z1 = point1
    x2, y2, z2 = point2
    return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2)

# 示例
point1 = (1, 2, 3)
point2 = (4, 6, 8)
distance = manhattan_distance_3d(point1, point2)
print(f"三维空间中点 {point1} 和点 {point2} 的曼哈顿距离是 {distance}")

五、总结

曼哈顿距离作为一种简单且有效的距离度量方法,广泛应用于路径规划、图像处理和机器学习等领域。通过本文的详细介绍,你应该对曼哈顿距离的定义、特点及其与欧几里得距离的比较有了深入的理解。同时,通过Python代码示例,你可以轻松实现曼哈顿距离的计算,进一步应用到实际项目中。希望本文能为你提供有价值的参考,助你在相关领域取得更大的进步。

推荐我的相关专栏:


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter-Lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值