Algorithm 空间数据结构中的不同搜索方法

Algorithm 空间数据结构中的不同搜索方法,algorithm,data-structures,graph,tree,spatial,Algorithm,Data Structures,Graph,Tree,Spatial,我正在尝试编写一个空间数据结构(例如K-D树或四叉树),给定一个点,它将找到距离它最近的x 我上面提到的数据结构的问题是,它们主要支持径向/区域搜索。因此,他们将获得给定点/节点的y半径范围内的点 为了寻找我想要的东西而改变那些结构将是低效的。我假设我需要从一个短的径向距离开始,重复几次径向搜索,并不断增加,直到在给定点附近获得所需的x点数。当然,这违背了数据结构背后的全部目的 几乎所有的空间数据结构都采用径向搜索。什么是其他有效的搜索方法,我可以应用到四叉树< /代码>,或者我需要考虑的其他空

我正在尝试编写一个空间数据结构(例如
K-D树
四叉树
),给定一个点,它将找到距离它最近的
x

我上面提到的数据结构的问题是,它们主要支持径向/区域搜索。因此,他们将获得给定点/节点的
y
半径范围内的点

为了寻找我想要的东西而改变那些结构将是低效的。我假设我需要从一个短的径向距离开始,重复几次径向搜索,并不断增加,直到在给定点附近获得所需的
x
点数。当然,这违背了数据结构背后的全部目的


几乎所有的空间数据结构都采用径向搜索。什么是其他有效的搜索方法,我可以应用到<代码>四叉树< /代码>,或者我需要考虑的其他空间数据结构来实现我的意思?有什么建议吗?

我不确定你的假设是否正确。指示如何使用该结构来支持查找搜索点的
x
最近邻。是的,它本质上是寻找最近邻
x
次的重复,但我不确定您是否有权利期望算法在
kd树上获得更有效的性能

如果这还不够好,您可能需要将点存储在不同的数据结构中。如果
x
较小且有界,则可以将点存储在加权图中,其中边权重当然是点之间的距离

如果
x
既不小也没有边界,您可以将空间简单细分为
k*m
均匀单元(此处为2D,必要时充气至3+D)。对于每个搜索点,直接转到包含它的单元格,在同一单元格中查找其他点。如果其中的
x
比单元格边界更靠近搜索点,则这些就是您要查找的内容。如果没有,也在靠近边界另一侧的单元格中搜索


如果您发现自己需要同时支持径向/区域搜索和x-近邻搜索,那么如果您必须维护两个数据结构,一个用于支持每种类型的查询,这并不是世界末日。对于许多搜索问题,高效解决方案的第一步是将数据放入正确的结构中进行高效搜索。做出这个决定取决于你没有提供给我们的数字。

如果你在一个四叉树上多次调用搜索方法(这是我已经做了几次的),那么如果你在每次调用中加倍搜索半径,直到你有正确的点数,搜索效率就不会那么低

假设一个2d空间,如果包含X点的正确最小半径为R1,并且继续加倍,直到找到包含X点的半径R2,那么(a)R2必须小于2xR1,(b)每次搜索时搜索的区域变大4倍,这(我认为)给你一个最坏的情况,你搜索过的区域中只有一半实际上是不必要的(或者大约是不必要的)