曼哈顿距离:
Manhattandis(i, j) = |xi − xj| + |yi − yj|;
切比雪夫距离:
Chebyshevdis(i, j) = max(|xi − xj|, |yi − yj|);
曼哈顿距离和切比雪夫距离的互相转化:
Manhattandis((x1, y1), (x2, y2)) = Chebyshevdis((x1 + y1, x1 − y1), (x2 + y2, x2 − y2));
Chebyshevdis((x1, y1), (x2, y2)) = Manhattandis((x1+y12, x1−y12), (x2+y22, x2−y22));
证明详见 OI Wiki:
https://oi-wiki.org/geometry/distance/
再来引入较为简单的点对距离之和问题:
1. 对于 n 个数轴上的点,求两两之间的距离总和(要求 O(n) 做法)
先将这 n 个点排一下序(复杂度不算)。
设 fi 表示第 i 个点到它左边的 i − 1 个点的总距离,dis(i, j) 表示第 i 个点和第 j 个点之间的距离,那么容易发现答案就是 Σ fi 。
那么考虑得出 fi 和 fi − 1 之间的关系。
容易发现第 i 个点到前 i − 1 个点的距离都比第 i − 1 个点到前 i − 1 个点大了 dis(i, i − 1) (其中一个点到自身的距离为 0)。
所以可以较为轻松地得出递推式:
fi = fi − 1 + (i − 1) ∗ dis(i, i − 1);
因此就可以 O(n) 地递推顺便再累加得出答案了。
2. 对于 n 个平面上的点,求两两之间的曼哈顿距离总和(要求 O(n) 做法)
首先容易发现,求曼哈顿距离总和是可以拆成分别求横坐标之差的总和和纵坐标之差的总和的。
因此模仿数轴上的做法,先按横坐标排一下序,同数轴上做法求出横坐标之差的总和;再按纵坐标排一下序,同理求出纵坐标之差的总和。
因此答案就是将这两个值加起来。
3. 对于 n 个平面上的点,求两两之间的切比雪夫距离总和(要求 O(n) 做法)
依照上面曼哈顿距离和切比雪夫距离的转换来将输入的点的坐标转换成对应的求曼哈顿距离的坐标,这样再按照上面的做法求一遍就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话