C 非均匀尺寸超球体间最近邻搜索的快速空间数据结构

C 非均匀尺寸超球体间最近邻搜索的快速空间数据结构,c,data-structures,spatial,multidimensional-array,C,Data Structures,Spatial,Multidimensional Array,给定一个k维连续(欧几里德)空间,其中充满了不可预测的移动/增长/收缩超球体,我需要反复寻找其曲面最接近给定坐标的超球体。如果某些超球体与我的坐标的距离相同,则最大的超球体获胜。(超球体的总数保证随时间保持不变。) 我的第一个想法是使用KDTree,但它不会考虑超球体的非均匀体积。 因此,我进一步查看,发现BVH(边界体积层次结构)和BIH(边界间隔层次结构),它们似乎起到了作用。至少在2-/3维空间中。然而,虽然在BVHs上找到了相当多的信息和可视化效果,但在BIHs上我几乎找不到任何东西 我

给定一个k维连续(欧几里德)空间,其中充满了不可预测的移动/增长/收缩超球体,我需要反复寻找其曲面最接近给定坐标的超球体。如果某些超球体与我的坐标的距离相同,则最大的超球体获胜。(超球体的总数保证随时间保持不变。)

我的第一个想法是使用KDTree,但它不会考虑超球体的非均匀体积。 因此,我进一步查看,发现BVH(边界体积层次结构)和BIH(边界间隔层次结构),它们似乎起到了作用。至少在2-/3维空间中。然而,虽然在BVHs上找到了相当多的信息和可视化效果,但在BIHs上我几乎找不到任何东西

我的基本要求是一个k维空间数据结构,考虑体积,或者是超快速构建(离线)或者是动态的,几乎没有任何不平衡

鉴于我上面的要求,您会选择哪种数据结构?还有其他我没提到的吗


编辑1:忘了提一下:超高速列车是允许重叠的(事实上是高度期望的)


编辑2:看起来我所描述的度量比“距离”(特别是“负距离”)匹配得更好。

我希望四叉树/八叉树/广义到2^K-树,因为你的维度K会起作用;这些函数递归地划分空间,当K-子立方体(或K-矩形块,如果拆分不均匀)不包含超球体,或者包含一个或多个超球体,从而分区不分离任何超球体,或者仅包含单个超球体的中心(可能更容易)时,可以停止

在这样的树中插入和删除实体很快,因此hypersphere更改大小只会导致一对删除/插入操作。(如果球体变小,则通过局部附加递归分区更改球体大小,或者如果球体变大,则通过局部K块合并更改球体大小,我怀疑您可以对此进行优化)

我没有和他们合作过,但你也可以考虑一下。这些允许您使用二叉树而不是k-树来划分空间。我知道KDTrees是这种情况的特例

但在任何情况下,我认为2^K树和/或BSP/KDTrees的插入/删除算法都很容易理解,而且速度很快。因此,超球体大小更改会导致删除/插入操作,但这些操作很快。所以我不理解你对KD树的反对


我认为所有这些的性能都是渐近相同的。

我将使用SQLite的R*树扩展。一个表通常有1维或2维数据。SQL查询可以组合多个表以在更高维度中搜索

负距离的公式有点奇怪。几何中的距离是正的,因此可能没有太多有用的理论可供使用


仅使用正距离的不同公式可能会有所帮助。了解双曲空间。这可能有助于为其他描述距离的方法提供思路。

由于计算点到超球面的距离非常简单(即使是O(k),但这种方法就是k空间中的所有东西),所以通常有多少个超球面?当然,与超球体的简单线性列表相比,数据结构应该值得。好问题,超球体的数目可能是8(在这种情况下,我可能只使用蛮力,或者数千,甚至十万,这取决于数据集的大小,这一点我无法预见。我目前正在使用蛮力,速度非常慢。超球体的数量会随着程序的执行而变化吗?为了澄清,当您编写“给定”时n坐标‘我想你的意思是,你想要一个函数,对于任何给定的坐标,它返回最近的超球体。也就是说,给定的坐标在程序的持续时间内是不固定的?保证‘干草堆’超球体的数量保持不变。‘针’坐标是(不可预测的)每次搜索都不一样。每次搜索都会导致某些超球体的位置和大小发生(不可预测)变化。是的,太糟糕了。@HighPerformanceMark:但是我应该注意,我确实知道在每次搜索后发生移动/缩放的边界超矩形,它往往非常大(就像几乎所有受影响的超球体一样)在程序开始时运行,并且随着程序的进行,往往会减少到只受影响的单个超球体。空间分区和/或2^k树如何处理超球体重叠的事实(这是经常发生的)?如果这不清楚,很抱歉。编辑我的问题以更好地反映这一点。为什么它们的重叠很重要?您所要做的就是对空间进行分区,以便在任何特定块中都有一小组球体,以便您可以决定哪个球体最适合该块中的坐标。如果重叠困扰您,则进行分区,直到出现K块重叠只插入一个球体的中心点。然后找到包含感兴趣点的分区,并枚举包含球体/球体中心点的所有子块。这是涡轮增压还是仅200加仑?