B树与R树相比-是不是一堆链接在一起的链表?


10

我对B树非常熟悉,主要是必须使数据库充满电力,空调和硬盘空间。我与一个双(doubl [ie,ey]?)链接列表相关联。

今天,午餐时的一位开发人员提到了R树。

我跳上维基百科,开始阅读。这听起来像高大的B树。不幸的是,由于缺乏深厚的数学背景,很难理解我的一些同事在谈论什么。

我希望有人能阐明B树和R树之间的一些区别。无论如何,我可能最终都会问这些家伙,但是不能保证他们会回答我的问题。他们很有可能会开始对上帝God不休,知道什么。。。


BTree绝对不像是双链表。一棵树允许访问log(n)操作,而不是与列表n成正比。
哈维尔

@Javier:b树索引的叶节点通常是一个双向链接列表,以允许快速同级检索索引节点。
约旦

1
作为一个纯粹的技术问题,这属于StackOverflow(请不要在此处重新发布,如果有足够的人投票将其关闭,它将自动迁移)。
彼得Török

1
这是这里的主题:Programmers.SE用于有关编程的概念问题。堆栈溢出用于当您实际有需要帮助的代码时。

2
@Peter Torok:在旧系统下,这将是一个特别的问题。但是现在这个站点已经存在。
surfasb 2011年

Answers:


7

R树可以被认为是b树的一般化。b树在其包含的键的“有界范围”内提供O(log n)访问,而R树在其包含的键的“ K维区域”内提供O(log n)访问。

如果您想将邮政编码映射到县名,则可以使用B树,因为您可能会问:“邮政编码在60000到61000之间的所有县都在哪里?” 但是,B树不适合将GPS坐标映射到县名,以进行诸如“芝加哥100英里内的所有县都在哪个县?”之类的查询,因为它仅在一个维度上订购键。R-Tree根据重叠的边界框将其键分解,因此,当您需要在多个维度上进行查询时,这是一种自然的存储键的方法。


我喜欢这个比喻。
surfasb

1
更多的是一个具体的例子而不是类比,这正是这些索引算法的使用方式。
SingleNegationElimination

6

只要您忽略列表的构造方式(具体而言,如何添加和删除元素以及如何重新平衡节点),就可以将大多数树结构简化为某种形式的链接列表。本质上是将一个数据结构与另一个数据结构区分开的插入/删除/检索算法。

R树中的节点通常包含一个边界框,使您可以有效地索引位置,如果要搜索“靠近”特定位置的记录,可能会需要。B树中的元素具有更简单的排序。您可以直接比较某事物是否大于或等于另一个元素。在R树中,每个条目的目的是确定边界框中包含哪些元素。

B树可让您有效地搜索辅助存储器(如硬盘)中的可订购项,R树可让您有效地搜索“在”特定点或边界框“附近”的元素。在辅助存储器中。


听起来R树随着元素数量的增长开始显示其区别,对吗?还是有点简化了?
surfasb

我认为在给定相似数量的节点的情况下,除了在非叶节点处边界框数据的线性成本之外,您不会看到空间使用方面的特定差异。但是,您根本无法在B树的常规定义中有效地表示边界框,因此,如果您尝试在B树中表示空间信息,则肯定会使用更多的空间。R-Tree用于空间关系,B-Tree仅支持一维排序。
JasonTrue 2011年

2
@JasonTrue:实际上,有一些有效的方法可以线性化B树索引的边界框:en.wikipedia.org/wiki/Geohash。尽管哈希是“有效的”,但并不是特别方便。任意边界框查询可能需要对9维空间进行9个单独的查询,并且如果该框与主轴重叠(例如,国际日期线),查询的数量可能会翻倍或翻两番,并且使用起来非常麻烦。尽管如此,当线性索引是唯一可用的类型时,它仍然是一种选择。
SingleNegationElimination
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.