我在3D空间中使用静态KD-Tree进行最近邻搜索。但是,客户端的规范现在已经更改,因此我需要进行加权最近邻搜索。例如,在1D空间中,我有一个点A,权重5为0,点B为权重2为4;如果查询点为-5到5,则搜索应返回A,如果查询点为5到6,则应返回B.换句话说,较高权重的点优先于其半径。
Google没有任何帮助 - 我得到的是有关K-nearest neighbors algorithm的信息。
我可以简单地删除完全由较高加权点包含的点,但通常情况并非如此(通常较低加权点仅部分包含,如上面的1D示例中所示)。我可以使用range tree查询以查询点为中心的NxNxN多维数据集中的所有点,并确定权重最大的那个点,但是这种天真的实现是浪费的 - 我需要将N设置为点在整个树中具有最大重量,即使在立方体内可能没有具有该重量的点,例如假设树中最大重量的点是25,那么我需要将N设置为25,即使任何给定立方体具有最高权重的点可能具有低得多的重量;在1D的情况下,如果我的点位于100处且权重为25,那么即使我在点的半径之外,我的朴素算法也需要将N设置为25。
总而言之,我正在寻找一种可以查询KD树(或某种替代/变体)的方法,以便我可以快速确定半径覆盖查询点的最高加权点。
FWIW,我是用Java编写的。
如果我可以动态改变一个点的重量而不会产生太高的成本,那也是很好的 - 目前这不是一个要求,但我预计它可能是一个需求。
编辑:我在priority range tree上发现了一篇论文,但这并没有完全解决同一个问题,因为它没有考虑具有更大半径的更高优先级的点。
答案 0 :(得分:3)
为重量使用额外的尺寸。权重(x,y,z)
的{{1}}点位于w
,其中(N-w,x,y,z)
是最大权重。
4D中的距离由......
定义N
......第二个d就是你的3D距离。
要查找d((a, b, c, d), (e, f, g, h)) = |a - e| + d((b, c, d), (f, g, h))
的所有可能结果,请查询关于(x,y,z)
的半径为N
的球。
答案 1 :(得分:0)
我想我找到了一个解决方案:nested interval tree,它是3D间隔树的一个实现。而不是存储具有我需要查询的相关半径的点,而是直接存储和查询半径。这具有额外的好处,即每个维度不需要具有相同的权重(使得半径是矩形框而不是立方体框),这目前不是项目要求但可能在将来成为一个(仅客户端)最近添加了“加权点”要求,谁知道他还能提出什么呢。