Java 多维分段树

Java 多维分段树,java,algorithm,data-structures,computational-geometry,multidimensional-array,Java,Algorithm,Data Structures,Computational Geometry,Multidimensional Array,我要解决的问题是1D问题的4D版本:找出一个数字属于哪个区间。我正在寻找一个实现的。理想情况下,它将是Java的,并将使用 kd树(k-NN搜索)和范围树(给定一个边界框,查找其中的所有点)存在多维实现,但对于分段树,我只找到了1D实现 我很乐意考虑其他具有相似空间/时间复杂度的数据结构来解决同样的问题。 < P>。在我的评论中,我想的是二进制空间划分算法。 选择坐标x和阈值t(随机坐标、中间坐标等) 分配一个新节点,并将与半平面x=t相交的所有间隔分配给该节点 递归地为(a)完全包含在下半空间

我要解决的问题是1D问题的4D版本:找出一个数字属于哪个区间。我正在寻找一个实现的。理想情况下,它将是Java的,并将使用

kd树(k-NN搜索)和范围树(给定一个边界框,查找其中的所有点)存在多维实现,但对于分段树,我只找到了1D实现


<>我很乐意考虑其他具有相似空间/时间复杂度的数据结构来解决同样的问题。

< P>。在我的评论中,我想的是二进制空间划分算法。
  • 选择坐标x和阈值t(随机坐标、中间坐标等)
  • 分配一个新节点,并将与半平面x=t相交的所有间隔分配给该节点
  • 递归地为(a)完全包含在下半空间xt中的间隔构造子节点
  • 插入查询从根节点开始,检查分配给当前节点的所有间隔,下降到相应的子节点,然后重复。对于小的子树,切换到暴力可能是值得的


    如果有太多的间隔被半平面x=t刺穿,可以尝试在(a)与下半空间相交的间隔和(b)与上半空间相交的间隔上递归。这会复制间隔,因此空间要求不再是线性的,您可能必须在细分证明无效的间隔集合上切换到暴力。

    有多少间隔?如果我们讨论范围查询和k-d树与4维范围树的对比,那么函数log2(n)**4(范围树)和n**(1-1/4)(k-d树)的盈亏平衡点惊人地大,大约2700万。此外,k-d树具有更快的最佳情况,并且可能具有更好的常数。建议使用一种变量来存储间隔而不是点(体积对象),但不提供时间限制。此外,k-d树的线性大小(而不是n log^4 n或n log^3 n)将具有更好的缓存行为。