【问题标题】:Why is the R -tree unordered ? Yet it is said to follow the rules of the B-tree为什么 R 树是无序的?然而据说它遵循 B-tree 的规则
【发布时间】:2016-12-05 02:57:55
【问题描述】:

好的,在下面的截图中是一个 R 树。它的根有 R1 和 R2。 R1 的左边是 r3,r3,r5。这是为什么?我认为根元素左侧的元素应该小于。如果根上的根元素是 R6,那么将 R3、R4、R5 放在左边是有意义的。据我所知,B+ 和 B- 树都遵循这个规则。

同样在叶子节点上,为什么在R12之类的后面有一个空格?我很困惑。

【问题讨论】:

  • 有人可以帮忙吗?

标签: database data-structures b-tree spatial-index r-tree


【解决方案1】:

B-tree 和 R-tree 基于完全不同的概念。它们的共同点很少:相似的名称和高n-arity(因此它们可以存储在随机访问时间很短的磁盘中)。

  1. B-tree 存储一维值,这些值是自然排序的。 R-tree 存储多维值,不能自然排序。 (您将如何订购成对的 x/y 坐标?)。

  2. B-tree 存储元素本身,而 R-tree 存储人工构建的边界框的坐标。上图中的 Ri 只是随机标签——你可以用任何你喜欢的名字替换它们。

  3. B-tree 和 R-tree 中的连接意味着完全不同的关系。

    如果某个 B-tree 节点存储 n 个值,那么它有 n+1 个位于(语义上) 个相邻值之间的指针.例如,如果某个指针位于值 25 和 70 之间,那么它会指向一个允许存储从 26 到 69 元素的子树。因此,可以说 B 树中的连接意味着 in -在关系之间。

    如果某个 R-tree 节点存储 n 个边界框坐标,那么它也有 n 个指向较低级别的指针,每个边界框一个。如果某个指针属于 Ri,那么它会指向包含所有相对于 Ri 的内部边界框的子树。这是一种“包含”关系。

要进一步了解 B 和 R 树之间的区别,您可以构建存储一维数(矩形退化为线段)的 R-tree,并将其与 B-tree 进行比较。

所以,回答你的第一个问题:R1 不小于 R3、R4 或 R5。这些只是各个矩形的标签。相反,R3、R4 和 R5 是 R1 的一部分。

至于为什么会有空白空间——这取决于用于构造树的算法。不同的算法和不同的插入/删除顺序可能最终导致包含相同元素集的不同树。 (对于 B 树也是如此。)

【讨论】:

  • 那么 r3,r4,r5 也可以放在左边吗?不是强制性的?
  • Gudok,R树中的插入和删除是如何工作的?我在网上看到的解释很模糊。他们没有详细解释。
  • 是的。您不能说 Ri 大于 Rj —— 根本没有为矩形定义这样的关系。但是您可以说 Ri 包含在 Rj 中——这就是为什么 R3、R4、R5 位于以 R1 为根的子树中的原因。将每个节点内的值视为 set 而不是排序列表(如在 B-tree 中)。您可以轻松地将 R3、R4、R5 及其子树重新排列为 R5、R3、R4。当然,实际的实现会以某种方式对节点内的矩形进行排序以加快搜索速度(因为典型的节点可能包含数千个矩形——而不仅仅是上图中的 3 个)。
  • 对于插入和删除没有很好的解释,因为 R-tree 不是一个定义明确的结构。每个特定的实现都使用不同的启发式方法。维基百科简要地提到了著名的启发式方法。
【解决方案2】:

只有一维数据是有序的。

R-tree的平衡分裂的思想类似于B-tree; R-tree 同样确保最小页面填充等 - pages 的概念也类似。

但是,虽然 B-tree 使用 线性 节点顺序,但 R-tree 使用包围体层次结构,而不是线性顺序,因为多维数据没有排序。 R-tree 中没有“左”或“右”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2011-12-22
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多