algorithm - 在网格上找到与给定集合的最大曼哈顿距离的点集
问题描述
给定一个边为 N 的正方形网格。同时给定网格上的一组输入点。需要在网格上找到另一组点(可以是多个),它们与给定输入点的曼哈顿距离最大。
例如N = 4
,输入[p1:{0, 0}, p2:{3, 3}]
和输出的距离应该[{0, 3}, {1, 2}, {2, 1}, {3, 0}]
等于 3。
0 1 2 3
┌───┬───┬───┬───┐
0 │p1 │ │ │ x │
├───┼───┼───┼───┤
1 │ │ │ x │ │
├───┼───┼───┼───┤
2 │ │ x │ │ │
├───┼───┼───┼───┤
3 │ x │ │ │p2 │
└───┴───┴───┴───┘
我的第一次尝试是简单的蛮力迭代——为网格中的每个点计算曼哈顿到每个输入点的距离,取最小值,最后从这些最小值中取最大值。这当然有效,但在大 N 和输入上很慢。
在我的第二次尝试中,我首先构建了一个 kd-tree。接下来迭代几乎与以前相同,不同之处在于现在我不计算到每个输入点的距离,而是到最近的一个(或多个)。这有点帮助,但仍然有人告诉我有更好的算法。
解决方案
您应该使用广度优先搜索,从所有给定点开始,同时找到每个单元格与其最近点的距离。这需要线性时间并且很容易编码。
然后找到最高距离(或者记住它,因为它将是你写的最后一个),并返回具有该距离的所有单元格。
如果你的点不是太稀疏,那会很好用。如果它们相隔很远,那么您将需要一种算法,它会随着点数而不是网格的大小而增长。这将基于计算曼哈顿距离 Voronoi 图,因为您要返回的所有点都在其上。
推荐阅读
- spring - Reactive Spring,CompletableFuture 疑惑
- swift - 我是否需要每次都输入:sudo gem install cocoapods
- javascript - 错误:尝试安装反应应用程序时找不到模块“react-scripts/scripts/init.js”
- laravel - Mailgun:如何从我的本地机器发送电子邮件(Laravel)
- android - 无法使用 FirebasePushNotificationPlugin [Xamarin][Android] 将构建操作设置为 GoogleServicesJson
- android - 为什么最大长度过滤器不起作用?安卓
- javascript - 单击复选框时如何使未选中的复选框标签变灰?
- javascript - jQuery Datatable:标题和搜索在同一行
- django - gitignore 如何排除一个表
- c# - Visual Studio 安装程序项目多语言支持