【问题标题】:Closest Pair of Points in 3+ Dimensions (Divide and Conquer)3+ 维中最接近的点对(分而治之)
【发布时间】:2016-06-07 14:55:53
【问题描述】:

我正在努力思考分治算法如何适用于大于 2 的维度,特别是如何找到两个子问题之间最接近的点对。

我知道我只需要考虑在x 轴上两者之间的分割距离d 内的点。

我知道在 3d 案例中,我只需要将每个点与其他 15 个点进行比较。

我不明白的是如何选择这 15 个点。在 2d 情况下,只需按y 值对值进行排序,然后按顺序遍历它们。然而,在 3d 情况下,每个点都需要与y 和 z 轴上最接近它的 15 个点进行比较。我似乎无法找到一种方法来确定这 15 个点是什么,而不是最坏的情况 O(n^2)...

我在这里错过了什么?

【问题讨论】:

    标签: algorithm divide-and-conquer closest-points


    【解决方案1】:

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

    考虑到以下想法,可以实施我认为对于平均情况为 O(N) 的更快解决方案:

    如果您将空间分成两半(例如通过某个轴对齐的平面),您会将点分为两个子集,A 和 B,并且两个最近的点可以都在 A 中,都在 B 中,也可以在 A 中一个在 B 中。

    因此,您必须创建一个由成对的 3d 盒子组成的队列,按它们之间的最小距离排序,然后:

    1) 从队列中挑选第一对盒子

    2) 如果两个盒子都是同一个盒子 A,把它分成两半,分成两个盒子 B 和 C,然后将 (B, B), (C, C) 和 (B, C) 对推入队列。

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

    4) 重复。

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

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

    【讨论】:

    • 你描述的o(n)算法叫什么名字?算法有参考链接吗?
    • 该算法的名称是“它不存在”。可以证明,在最坏情况下,针对最近对问题的最佳基于比较的算法不会比 O(n*log(n)) 快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2016-12-25
    • 2015-02-11
    • 2013-11-09
    • 2022-01-25
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多