【问题标题】:Effecient way to check if N number of (x,y)coordinates in K number of rectangles检查K个矩形中是否有N个(x,y)坐标的有效方法
【发布时间】:2011-06-11 01:13:26
【问题描述】:

有没有一种有效的方法来查看 N 个 (x,y) 点是否在 K 个矩形内?现在我正在做一个蛮力方法并遍历所有点和矩形,但它需要大约 2 分 30 秒,有 200,000 个点和 44 个矩形。

我正在使用 Google 地图并创建一个程序来检查点是否靠近地图上的路线。我沿路径计算多个矩形和圆形,并测试现有点是否位于这些矩形和圆形内。

1.根据路线的性质,矩形可以重叠。
2.点必须在一个的矩形
3.如果该点位于矩形的边缘,我想让它算在矩形内(但如果它更容易不计算,那么我不会计算它)
4.矩形取决于我想在路线外搜索的区域。通常,它们高 2 英里(从点的每个方向 1 英里)和从点 1 到点 2 的距离宽。

【问题讨论】:

  • 两个问题:您通常处理的矩形区域有多大(只是想知道为什么要处理这么多点),以及您已经尝试过哪些方法(如果有的话)?
  • 好问题!但是,请澄清您如何定义矩形?它们可以重叠吗?你会测试每个点是否在所有矩形中,还是一个矩形就足够了?
  • 1) 矩形是否重叠? 2)我可以假设矩形与点在同一个笛卡尔平面上? 3) 位于矩形边缘的点算作矩形内吗?
  • @FinalForm @mkilmanas @normalocity 嘿伙计们,我编辑了帖子来回答你的问题
  • 删除了 PHP 标记,因为这并不是 PHP 所特有的。

标签: performance coordinates routes coordinate-systems


【解决方案1】:

理论上,在最好的情况下,您必须遍历所有 200,000 个点 - 在最坏的情况下,您必须针对所有 44 个矩形检查所有这些点(这就是您现在正在做的事情)。

既然您知道必须遍历所有 200,000 个点,那么您能做的最好的事情就是尝试不必检查所有 44 个矩形。

为了做到这一点,您必须对矩形进行一些计算,找到最接近的两个矩形并形成一个更大的矩形,将它们都包围起来(如果您愿意的话,一个簇)。然后你找到下一个最接近你刚刚形成的矩形的矩形,形成另一个簇矩形。你一直这样做,直到你包围所有的矩形(你最终会得到 43 个簇矩形)。

现在循环遍历这些点并检查最大的矩形,如果该点落在那个矩形内,那么你检查下一个最大的矩形,如果它不在那个矩形内,那么你只需要检查看看是否它落在用于形成该矩形的矩形内。如果它不在该矩形内,那么您可以移动到下一个点,因为该点不在任何矩形内(您仅通过 3 次检查就发现了这一点)。

【讨论】:

  • 这太好了,你的答案与@normalocity 相结合将使这变得更好,我只知道它。但就像你说的那样,我仍然有可能发生最坏的情况,但它的使用方式永远不会真正发生。
【解决方案2】:

以下是一些可能的想法:

  • 模糊匹配 - 如果您的点不必 100% 准确地标记为在特定矩形内,您可以编写一个算法来做出更有效的“最佳猜测”,但牺牲 100% 准确
  • 先模糊,后准确 - 快速给出近似答案,可能只需计算给定点与矩形左上角或圆心之间的距离。这将给出一个可能不是 100% 准确的近似答案,但随后允许您异步继续计算、优化它,并在一段时间后使用 100% 准确的数据更新显示
  • 对点进行分组 - 当它创建点时,让它在一个矩形中“注册”自身,如果可以的话,基本上预先计算一个点是否在给定的矩形中。
  • 预计算+缓存 - 然后将特定点适合的矩形列表缓存在点本身中。然后它就变成了一个简单的查找,而不必每次都重新计算
  • 异步加载 - 您可以在计算答案时开始显示答案吗?如果整个批次需要 2.5 分钟,您能否在计算时以 1,000 点块的形式显示结果?通过这种方式,用户在计算完成工作时快速开始获得一些反馈。 2.5 分钟,即 150 秒。如果您可以以 1,000 点块的形式提供结果(一次大约是数据的 1/200),那么您可以在结果可用时每秒更新一次点图。

【讨论】:

  • 通过预先计算对点进行分组是一个好主意。我正计划进行模糊匹配,然后获得更准确的结果,而不是一次搜索所有点,但事先做很多这样的工作对我的应用程序来说是有意义的。
猜你喜欢
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多