【问题标题】:What is the difference between a KD-tree and a R-tree?KD树和R树有什么区别?
【发布时间】:2023-09-02 19:14:01
【问题描述】:

我查看了 KD-tree 和 R-tree 的定义。在我看来,它们几乎是一样的。

KD-tree 和 R-tree 有什么区别?

【问题讨论】:

    标签: data-structures kdtree r-tree


    【解决方案1】:

    它们实际上是完全不同的。它们的用途相似(对空间数据进行区域查询),而且它们都是树(并且都属于包围体层次索引家族),但这就是它们的共同点。

    • R-Trees 是平衡的,k-d-trees 不是(除非批量加载)。这就是为什么 R-trees 更适合更改数据的原因,因为可能需要重建 k-d-trees 以重新优化。
    • R-Tree 是面向磁盘的。他们实际上在直接映射到磁盘表示的区域中组织数据。这使它们在真实数据库和内存不足操作中更有用。 k-d-trees 面向内存,放入磁盘页面并非易事
    • kd-trees 在批量加载时非常优雅(SingleNegationElimination 指出了这一点),而 R-trees 更适合更改数据(尽管它们确实受益于批量加载,当与静态数据)。
    • R-Tree 不覆盖整个数据空间。可能会发现空白区域。 k-d-trees 总是覆盖整个空间。
    • k-d-trees 二进制分割数据空间,R-trees 将数据分割成矩形。二元分裂显然是不相交的;而 R-tree 的矩形可能会重叠(这实际上有时很好,尽管人们会尽量减少重叠)
    • k-d-trees 更容易在内存中实现,这实际上是它们的主要优势
    • R-trees 可以存储矩形和多边形,k-d-trees 只存储点向量(因为多边形需要重叠)
    • R-tree 具有各种优化策略、不同的拆分、批量加载器、插入和重新插入策略等。
    • k-d-trees 使用到分离超平面的一维距离作为界限; R-trees 使用到边界超矩形的 d 维最小距离进行边界(它们也可以使用最大距离进行一些计数查询,以过滤真正的阳性)。
    • k-d-trees 支持平方欧几里得距离和 Minkowski 范数,而 Rtrees 已被证明还支持大地距离(用于查找地理数据上的近点)。

    【讨论】:

      【解决方案2】:

      R-treeskd-trees 基于相似的思想(基于轴对齐区域的空间划分),但主要区别在于:

      • kd-trees 中的节点表示分离平面,而 R-trees 中的节点表示边界框。
      • kd-trees 将整个空间划分为多个区域,而 R-trees 仅将包含兴趣点的空间子集划分。
      • kd-trees 表示不相交的分区(点仅属于一个区域),而 R-tree 中的区域可能重叠。

      (有很多类似的树结构用于划分空间:四叉树、BSP-trees、R*-trees 等)

      【讨论】:

      • 绝对错误,R-trees 是基于数据分区的,而 kd-trees 是基于空间分区的。
      • @CoolCK:请参阅我回答中的第二个项目符号。
      【解决方案3】:

      this answer 中未提及的两者之间的主要区别是 KD 树仅在批量加载情况下有效。一旦构建,修改或重新平衡 KD-tree 就不是小事了。 R-trees 不会受此影响。

      【讨论】: