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