我正在学习关于数据库的类中的B +树,我想知道B +树对二元搜索树有什么具体优势?
对于大多数笔记操作来说,它们似乎都具有O(logN)平均复杂度,但B +树在每个子节点上还有一个额外的(可忽略的?)搜索时间,其中BST显然只花费O(1)时间来计算要前进到哪个子节点。
现实世界的优势使B +树在数据库中比BST更受欢迎?
答案 0 :(得分:30)
B +树(以及一般的B树)相对于二叉搜索树的主要优点是它们可以很好地与缓存配合使用。如果你有一个二进制搜索树,其节点以或多或少的随机顺序存储在内存中,那么每次你按照一个指针,机器都必须将一个新的内存块拉入处理器缓存中,这比访问缓存中的内存。
B + -tree和B-tree的工作原理是让每个节点存储大量的键或值,并拥有大量的子节点。它们通常以一种方式打包在一起,使单个节点可以很好地适应缓存(或者,如果存储在磁盘上,则可以在单个读取操作中从磁盘中提取)。然后,您必须做更多的工作来查找节点中的密钥或确定下一个要读取的子项,但由于可以在不返回磁盘的情况下完成在单个节点上完成的所有内存访问,因此访问时间非常短。这意味着即使原则上BST在内存访问的 number 方面可能更好,但B + -tree和B-tree在运行时方面表现更好>那些内存访问。
B +树或B树的典型用例是在数据库中,其中存在大量信息,并且数据太多以至于它们不能全部适合主存储器。因此,数据然后可以存储在某处硬盘上的B +树或B树中。这最大限度地减少了在查找期间引入数据所需的磁盘读取次数。一些文件系统(比如ext4,我相信)也出于同样的原因使用B树 - 它们最小化了必要的磁盘查找次数,这是真正的瓶颈。
希望这有帮助!
答案 1 :(得分:0)
数据的实际存储(例如,在DB中)需要存储大量数据。由于数据检索是关注的基本操作,因此从磁盘读取数据比使用RAM要耗费时间。
现在,这就是问题......
与B + Trees相比,BST在节点中存储较少的数据。这导致BST的高度增加而不是B +树。所以它们存储在磁盘上而不是RAM中。
每次必须从树中检索数据时,必须将来自磁盘的数据加载到主存储器中(当然,这是一个耗时的过程),而对于B +树,则需要将数据加载到主存储器中已经存在于RAM中并且直接获取所需节点并从该节点检索数据,该节点可能包含许多子节点(但是在B +树的情况下,数据检索的总时间较少,因为不需要从磁盘加载数据到RAM)。