当前位置: 首页 > 知识库问答 >
问题:

3+维度中最接近的点对(分而治之)

裘光启
2023-03-14

我正在纠结于分治算法对于大于2的维度是如何工作的,特别是如何在两个子问题之间找到最接近的点对。

我知道在3D的情况下,我需要将每个点与其他15个点进行比较。

我不明白的是,那15点怎么选?在2D情况下,只需按y值对值进行排序,然后按顺序进行遍历。然而,在3D情况下,每个点都需要与yz轴上离它最近的15个点进行比较。我似乎找不到一种方法来确定这15个点是什么,而且不存在O(n^2)...

我错过了什么?

共有1个答案

裴展
2023-03-14

一个简单的解决方案是创建一个八叉树或一个k-d树,包含所有的点,然后用它为每个点找到最近的点。对于平均情况是O(N*logn)。

一个我认为对于平均情况是O(N)的更快的解决方案可以考虑以下想法来实现:

如果你将空间分割成两半(比如通过某个轴对齐的平面),你会得到两个子集A和B中的点,最近的两个点可以都在A中,也可以都在B中,或者一个在A中,一个在B中。

1)从队列中选择第一对框

2)如果两个方框都是同一个方框A,则将其在两个方框B和C中对半,并将成对(B,B),(C,C)和(B,C)推入队列。

3)如果它们是不同的(A,B),将最大的(例如,B)分成两半获得框C和D,并将成对的(A,C)和(A,D)推入队列。

此外,当一对方框内的点数低于某个阈值时,您可以使用蛮力来找到最近的一对点数。

一旦顶部对中的两个框之间的距离大于到目前为止找到的最小距离,搜索就会停止。

 类似资料:
  • 我刚开始编程,今天我完成了二维空间中最近对问题的简单解法。(2个用于环路) 然而,我放弃了在O(n log n)中找到任何能解决这一问题的方法。即使在研究了它之后,我仍然不明白这怎么能比琐碎的方法更快。 我理解的是:->首先,我们将数组分成两半,只考虑X坐标对所有内容进行排序。这可以在n log n中完成。 接下来是递归调用,它们在每一半中“找到两个距离最小的点”。但是在O(n^2)下是怎么做到的

  • 假设坐标(x1,y1)上的一个点支配另一个点(x2,y2)如果x1≤x2,y1≤y2; 我有一组点(x1,y1),...(xn,yn),我想找到支配对的总数。我可以通过比较所有点来使用蛮力,但这需要时间O(n2)。相反,我想使用分而治之的方法在时间O(n log n)中解决这个问题。 现在,我有以下算法: 所以y坐标的两个半部分是:{1,3,4,5,5}和{5,8,9,10,12} 我画分界线。

  • 我知道如何不用分而治之来解决这个问题,但我不知道用分而治之的方法。 感谢帮助!

  • 问题内容: 我正在编写一个小程序,为了提高效率,我需要能够找到数组中最接近的纬度和经度。 假设您有以下代码: 我得到的结果是: 它应该是(在此示例中,列表中的最后一个对象) 我知道如何获取单个值的最接近单元格,但我想让lambda函数考虑这两个值,但我不确定如何做到。救命? 问题答案: 为了正确计算地球上各点之间的距离,您需要使用Haversine公式。使用此答案中提供的Python实现,您可以像

  • 在分而治之的方法中,手头的问题被分成较小的子问题,然后每个问题都独立解决。 当我们继续将子问题划分为更小的子问题时,我们最终可能会达到无法进行更多划分的阶段。 解决那些“原子”最小可能的子问题(分数)。 最后合并所有子问题的解决方案以获得原始问题的解决方案。 从广义上讲,我们可以通过三个步骤来理解divide-and-conquer方法。 Divide/Break 此步骤涉及将问题分解为更小的子问

  • 问题内容: 我有一个由我从Google Maps Directions服务获得的latlng绘制的多义线。现在,我想在折线上找到最接近给定点的点。 (对我而言)最明显的方法是通过折线上的所有点进行循环并找到它们与给定点之间的距离,但是这种方法效率不高,因为折线上的点可能很大。 我很高兴听到这样做的其他选择。提前致谢。 问题答案: 它正在找到直线上最接近鼠标的点。另请注意,这是一个Google Ma