曼哈顿距离

我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里德空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。

例如在平面上,坐标(x1, y1)的i点与坐标(x2, y2)的j点的曼哈顿距离为:

d(i,j)=|X1-X2|+|Y1-Y2|.

要注意的是,曼哈顿距离依赖坐标系统的转度,而非系统在坐标轴上的平移或映射。

曼哈顿距离的命名原因是从规划为方型建筑区块的城市(如曼哈顿)间,最短的行车路径而来(忽略曼哈顿的单向车道以及只存在于3、14大道的斜向车道)。任何往东三区块、往北六区块的的路径一定最少要走九区块,没有其他捷径。

出租车几何学满足除了SAS全等定理之外的希伯特定理,SAS全等指任两个三角型两个边与它们的夹角均分别对应相等,则这两个三角型全等。

在出租车几何学中,一个圆是由从圆心向各个固定曼哈顿距离标示出来的点围成的区域。因此这种圆其实就是旋转了45度的正方形。如果有一群圆,任两圆皆相交,则整群圆必在某点相交;因此曼哈顿距离会形成一个超凸度量空间Injective metric space)。对一个半径为r 的圆来说,这个正方形的圆每边长√2r。此'"圆"的半径r对切比雪夫距离 (L∞ 空间)的二维平面来说,也是一个对座标轴来说边长为2r的正方形,因此二维切比雪夫距离可视为等同于旋转且放大过的二维曼哈顿距离。然而这种介于L1与L∞的相等关系并不能延伸到更高的维度

数学性质

非负性:d(i,j)≥0 距离是一个非负的数值

同一性:d(i,i)= 0 对象到自身的距离为0

对称性:d(i,j)= d(j,i)距离是一个对称函数

三角不等式:d(i,j)≤d(i,k)+d(k,j)从对象i到对象j的直接距离不会大于途经的任何其他对象k的距离

 

曼哈顿距离算法

首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走AC和 CB才能到达,由于街道很规则,ACB就像一个直角3角形,AB是斜边,AC和CB是直角边,根据毕达格拉斯(勾股)定理,或者向量理论,都可以知道用AC和CB 可以表达AB的长度。
在早期的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂贵,很慢而且有误差,如果直接使用AB的距离,则必须要进 行浮点运算,如果使用AC和CB,则只要计算加减法即可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。因此,计算机图形学就借用曼哈 顿来命名这一表示方法。
在我们常用的平面CAD中,都会有格点,他是基本单位,定义了格点大小后,就可以使用整数来表示和运算,不会引入计算误差,又快又精确。

 

 

曼哈顿与欧几里得距离: 红、蓝与黄线分别表示所有曼哈顿距离都拥有一样长度(12),而绿线表示欧几里得距离有6×√2 ≈ 8.48的长度。

 

 

HDU4311 Meeting point-1(曼哈顿距离)

题意:

给定n个点,选其中的一个点作为起点,然后使其他点到这个点的曼哈顿距离最小,求这个最小的距离

 

分析:

我们设P作为这个点作为起点

然后 ans = sum(abs|pi.x-p.x|+|pi.y-p.y| )(1<=i<=n)

我们可以对其分别按x,y进行排序,就可以去掉绝对值符号

然后化简后的公式就可以变成

设这个点在按x排完序后的位置为i;

tot[i],表示到序号i为止的点的横坐标的和。

ansx = (i-1)*p.x+(tot[n]-tot[i])-(n-i)*p.x

同理可以求出

设这个点在按t排完序后的位置为i;

ansy= (i-1)*p.y+(tot[n]-tot[i])-(n-i)*p.y

ans = ansx + ansy

然后取最小的ans 即可

时间复杂度为O(nlog(n));


### 实现曼哈顿距离计算 在MATLAB中,可以利用内置函数`pdist2`来方便地计算不同类型的距离度量,包括曼哈顿距离。对于较旧版本的MATLAB,在2011年之前可能不支持此功能或者仅提供有限的距离选项[^3]。 为了确保兼容性和更多的距离测量选择,推荐使用最新版MATLAB执行如下操作: #### 使用 `pdist2` 函数直接调用 如果只需要简单地获取两组数据间的所有成对曼哈顿距离,则可以直接应用`pdist2`函数并指定 `'cityblock'` 参数作为距离类型: ```matlab % 定义样本点集A和B A = rand(5, 3); % A是一个包含5个三维点的数据集 B = rand(7, 3); % B是另一个含有7个三维点的数据集 % 计算A与B之间所有组合的曼哈顿距离 D_cityblock = pdist2(A, B, 'cityblock'); ``` 这段代码会返回一个矩阵`D_cityblock`,其中每一项代表来自集合A的一个点到集合B中对应位置处另一点之间的曼哈顿距离。 #### 手动编写曼哈顿距离公式 当无法访问新版本软件或是希望更深入理解算法原理时,也可以手动定义曼哈顿距离公式来进行计算。下面给出了一种基于绝对差之和的方式实现该方法的例子: ```matlab function D = manhattan_distance(X,Y) % X 和 Y 是 n×m 的数值型数组,分别表示两个具有相同维度特征空间内的多个实例 [~, colsX] = size(X); [~, colsY] = size(Y); if colsX ~= colsY error('输入矩阵应有相同的列数.'); end % 初始化输出矩阵 rowsX = size(X, 1); rowsY = size(Y, 1); D = zeros(rowsX,rowsY); for i=1:rowsX for j=1:rowsY diffVec = abs(X(i,:) - Y(j,:)); D(i,j) = sum(diffVec); end end end ``` 上述自定义函数接受两个同维数的向量或矩阵作为参数,并逐元素相减取绝对值得到差异向量后再求和得到最终的结果。这相当于按照每个属性上的差距累加起来形成总的距离得分[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值