如果你有一个b +树作为索引,那么这似乎与有序链表非常相似。但是有序的链表似乎有一些优点,例如不必导航树结构,也不必在它们满了时重建节点,而不必在不通信的情况下重建树。
任何人都可以回答使用b树而不是有序链表的原因吗?
答案 0 :(得分:3)
经过一些研究和论文阅读后,我找到了答案。
为了处理大量数据,例如数百万条记录,必须将索引组织成群集。群集是磁盘上的一组连续扇区,可以快速读入内存。这些通常大约4096字节。
如果我们组织索引以便每个集群都包含一个指向磁盘(数据集群)上数据的有序索引列表,我们就可以拥有一个有序列表索引。
因此,如果我们要查找特定记录,我们如何知道它所在的群集?我们执行二进制搜索以找到有问题的集群[O(log n)]。
但是,要进行二进制搜索,我们需要知道每个数据集群中的值范围,因此我们需要元数据来说明每个集群的最小值和最大值以及该集群的位置。这很棒。除非每个数据集群包含100个索引,并且我们的元数据集群还包含100个索引,否则我们只能访问100个数据集群。相当于10 000条记录(100 X 100)。
那还不够。让我们添加另一个元数据集群,现在我们可以访问1 000 000条记录。那么我们如何知道我们需要查询三个元数据集群中的哪一个才能找到我们的目标数据集群。我们可以一个接一个地搜索它们,但是它不能扩展,而且它的平均值为O(n / 2)。所以我添加了另一个元元数据集群来指示我应该查询三个元数据集群中的哪一个来查找目标数据集群。现在我有一棵树!
这就是数据库使用树的原因。它不是速度,而是索引的大小以及索引引用其他索引的需要。我上面描述的是B + Tree - 子节点包含对其他子节点或叶节点的引用,叶节点包含对磁盘上数据的引用。
呼!
答案 1 :(得分:2)
特征有很多不同,但我强调搜索时间。
虽然搜索在树中 O(日志N)时间,但在链接列表中 O(n)时间,即使它已排序。
来源:http://en.wikipedia.org/wiki/Linked_list,http://en.wikipedia.org/wiki/B%2B_tree
答案 2 :(得分:0)
在二叉搜索树中,O(log n)搜索时间是平均情况。在最坏的情况下,当树完全不平衡并且类似于链表时,搜索需要O(n)时间。