【问题标题】:Algorithm to find k neighbors in a certain range?在一定范围内找到k个邻居的算法?
【发布时间】:2015-08-29 03:49:23
【问题描述】:

假设在 x-y-z 3D 空间中有一个具有 50 000 个点的点云。对于这个云中的每个点,应该实施哪些算法或数据结构来找到给定点的 k 个在 [R,r] 距离内的邻居?幼稚的方法是对 50 000 个点中的每个点进行 49 999 个点中的每个点并进行度量测试。但是这种方法需要很长时间。就像有 kd 树可以在短时间内找到最近的邻居,那么是否有一些实时 DS/algo 实现来预处理点云以在最短的时间内实现目标?

【问题讨论】:

  • 预处理?只需浏览一次并为每个接近的点存储一个索引列表。 O(n^2) 但如果你只做一次,50k 点并不是一个巨大的数字。
  • @twentylem 我误解了我的问题。参考编辑并假设 n=200 000。

标签: algorithm data-structures graph-algorithm nearest-neighbor point-clouds


【解决方案1】:

您的问题属于Nearest Neighbor Search 的主题,或者更准确地说是k-Nearest Neighbor Search。您的问题的答案取决于您用于存储点的数据结构。如果您使用R-treesR*-trees 之类的变体,并且您正在对数据库进行多次搜索,那么与简单的线性搜索相比,您可能会发现二维或三维空间的性能有显着提高。在更高维度上,空间划分方案往往不如线性搜索。

【讨论】:

    【解决方案2】:

    正如一些答案已经为 NN 搜索建议的那样,您可以使用一些树算法,例如 k-d-tree。有适用于所有编程语言的实现。

    如果您的描述 [R,r] 建议使用空心球体,您应该比较一次性测试(在区间内)与两个阶段(测试外部并移除通过内部测试的样本)。

    您也没有提及性能要求(时序或帧速率?)和您的预期应用(可行的方法?)。

    【讨论】:

    • 我的预期应用是通过 2 指平行下颚夹持器在给定点云上找到所有可能的接触点。 O(n^2) 似乎时间太多了。我可以有一些 O(n logn) 类型的效率吗?
    • 树应该有 O(n log n)。看看point cloud library。对于 3 个维度,八叉树可能适合。
    【解决方案3】:

    有一些高效的算法(平均而言,对于随机数据),请参阅Nearest neighbor search

    你的方法效率不高,但很简单。

    请通读,检查您的要求并返回,以便我们提供帮助。

    【讨论】:

    • 感谢您的参考。我感兴趣的是:邻近的固定半径。但是,如果固定半径可以是可变半径,那么 ii 会更好。
    • 是的,我想使用可变半径。
    • 如果您选择合适的数据结构,您可能会成功。您需要确保它不会增加相当大的复杂性。
    • 你能推荐这样的数据结构吗?
    【解决方案4】:

    如果您使用的是普通的欧几里得度量,您可以遍历列表 3 次并提取每个维度中 R 内的那些点,本质上是提取封闭的立方体。搜索结果列表仍然是 O(n^2),但 n 小得多。

    【讨论】:

    • 提取 2R 立方体是 O(n^2)。
    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2014-06-20
    • 2020-06-21
    相关资源
    最近更新 更多