使用 morton 代码查找最近的邻居

Posted

技术标签:

【中文标题】使用 morton 代码查找最近的邻居【英文标题】:Find nearest neighbor with morton code 【发布时间】:2017-10-14 06:15:09 【问题描述】:

我已经实现了一个decode/encode 方法,用于将二维点转换为它们各自的morton code

我正在寻找的是找到最近的邻居(在min_distance 下) 比如这样的:

points=[(200,300),(500,150),(100,50)]
mortonCodes = 
for p in points:
    mortonCodes[encode(p)] = p

nearest = findNearestNeighbor(mortonCodes, (201,305))
print(nearest) # ---> should return (200,300)

这可能吗?

【问题讨论】:

【参考方案1】:

您可以使用min_distance 执行以下操作,例如 120: 使用您的查询点qp=(201,305) 并通过减去/添加距离来创建最小和最大点:min=(81, 185)max=(321,425)。 现在,为这两个点创建 morton 代码。

距离 (210,305) 的 120 以内的所有点都将有一个 morton 代码 mcWithin120mortonCode(min) <= mcWithin120 <= mortonCode(max)。 如果您有一个按 morton 代码排序的点列表,这应该会大大缩小搜索区域。

请注意,该范围将包含误报!并非所有在 min 和 max 之间具有 morton 代码的点都在给定的距离 120 内,因此您必须检查范围内的所有点是否“实际上”在正确的距离内。

如果您对空间搜索感兴趣,请查看PH-Tree,它是一个空间索引,类似于四叉树,使用 morton 顺序优化树结构和搜索。

【讨论】:

是的,你是对的,我会投票,因为我不知道 PH-Tree,我认为这将是更好的解决方案! 也可以看看这个answer,尤其是那些在kNN搜索上用morton order引用PDF的cmets。

以上是关于使用 morton 代码查找最近的邻居的主要内容,如果未能解决你的问题,请参考以下文章

使用 morton 代码压缩数据 - 如何?

Morton 代码对于更高维度是最有效的吗?

2D morton 代码编码/解码 64 位

用于 3D 网格的 Morton 反向编码

为 32 位、64 位和 128 位生成交错位模式(morton 密钥)

Morton码