*【学习笔记】(23) 常用距离算法详解
本文主要讲述这三种常见距离算法 :欧氏距离,曼哈顿距离,切比雪夫距离 。
1.欧氏距离
欧氏距离 是最易于理解的一种距离算法。在数学的平面直角坐标系中,设点
实际上这就是平面(二维空间)中两点欧氏距离的距离公式,除此之外,
三维空间 中欧氏距离的距离公式为:
以此类推,我们就得到了
欧氏距离 的一般模型:
在一个坐标系上,求从一个点到另一个点的最短距离。
欧氏距离 的缺点:
两个整点计算其欧氏距离时,往往答案是浮点型,会存在精度误差。
2.曼哈顿距离
在 二维空间 内,两个点之间的曼哈顿距离为它们横坐标之差的绝对值与纵坐标之差的绝对值之和。设点
三角不等式
从点
3.切比雪夫距离
在 二维空间 内,两个点之间的切比雪夫距离为它们横坐标之差的绝对值与纵坐标之差的绝对值的最大值。设点
4.二维曼哈顿距离与切比雪夫距离的相互转化
假设
我们很容易发现,这就是
所以将每一个点
同理,
而这就是
所以将每一个点
结论:
将切比雪夫坐标系旋转
将点
原坐标系中的 曼哈顿距离
将点
原坐标系中的 切比雪夫距离
碰到求 切比雪夫距离 或 曼哈顿距离 的题目时,我们往往可以相互转化来求解。两种距离在不同的题目中有不同的优缺点,要学会做出正确的选择。
例题
Ⅰ. P3964 [TJOI2013] 松鼠聚会
很容易看出这道题属于 切比雪夫距离 的一般模型。即对于两个点
直接求 切比雪夫距离 似乎很困难?考虑把 切比雪夫距离 转化为 曼哈顿距离,即把每个点的坐标
枚举所选的点
如果某个点
这样就可以分两种情况讨论了。
设前
对于
怎么求
纵坐标
切比雪夫距离 转成 曼哈顿距离 时要除以
#include<bits/stdc++.h> #define N 100005 #define int long long #define INF 0x3f3f3f3f3f3f3f3f using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } int n,ans=INF; int p[N],q[N],x[N],y[N],sumx[N],sumy[N]; signed main(){ n=read(); for(int i=1;i<=n;++i){ int a=read(),b=read(); x[i]=p[i]=a+b,y[i]=q[i]=a-b; } sort(p+1,p+1+n),sort(q+1,q+1+n); for(int i=1;i<=n;++i) sumx[i]=sumx[i-1]+p[i],sumy[i]=sumy[i-1]+q[i]; for(int i=1;i<=n;++i){ int posx=lower_bound(p+1,p+1+n,x[i])-p; int posy=lower_bound(q+1,q+1+n,y[i])-q; int sx=posx*x[i]-sumx[posx]+sumx[n]-sumx[posx]-(n-posx)*x[i]; int sy=posy*y[i]-sumy[posy]+sumy[n]-sumy[posy]-(n-posy)*y[i]; ans=min(ans,sx+sy); } printf("%lld\n",ans/2); return 0; }
Ⅱ.AT_code_festival_2017_quala_dFour Coloring
Ⅲ. P3439 [POI2006] MAG-Warehouse
Ⅳ. P2906 [USACO08OPEN] Cow Neighborhoods G
Ⅴ. P4648 [IOI2007] pairs 动物对数
本文作者:南风未起
本文链接:https://www.cnblogs.com/jiangchen4122/p/17641783.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步