怎么理解B+树?我总是不明白....

sustbeckham 2011-01-14 05:22:25
有没有什么通俗易懂的理解方法...平衡二叉树可以理解,但是B+的思路总是想不明白 浆糊一样....
...全文
6523 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
crb2001 2011-02-03
  • 打赏
  • 举报
回复
兄弟, 给你个建议,先去理解B树(平衡树), 而B+树是在B树之上增加了链表等一些复合算法而已!
了解一个东西,可以循序渐进,不必急于求成!
AAA20090987 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 geili_code 的回复:]

哈哈,这是理论上的东西,实际使用其实和AVL树几乎没有优势,一样的不实用
[/Quote]

也不能这样说吧,
一般而言,B+树是用在数据库中的,它要读写磁盘,而磁盘的IO操作是很慢的
在这方面,B+树与AVL相比,有巨大的优势
geili_code 2011-01-19
  • 打赏
  • 举报
回复
哈哈,这是理论上的东西,实际使用其实和AVL树几乎没有优势,一样的不实用
测试NULL 2011-01-18
  • 打赏
  • 举报
回复
B+树是一种树数据结构,常见于数据库与档案系统之中。B+树能够使资料保持有序,并拥有均匀的对数处理时间的插入和删除动作。B树的元素通常会自底向上插入,有别于多数自顶向下插入的二叉树。

B+ 树在节点访问时间远远超过节点内部访问时间的时候,比可作为替代的实现有着实在的优势。这通常在多数节点在次级存储比如硬盘中的时候出现。通过最大化在每个内部节点内的子节点的数目减少树的高度,平衡操作不经常发生,而且效率增加了。这种价值得以确立通常需要每个节点在次级存储中占据完整的磁盘块或近似的大小。

B+ 背后的想法是内部节点可以有在预定范围内的可变数目的子节点。因此,B+ 树不需要象其他自平衡二叉查找树那样经常的重新平衡。对于特定的实现在子节点数目上的低和高边界是固定的。例如,在 2-3 B 树(常简称为2-3 树)中,每个内部节点只可能有 2 或 3 个子节点。如果节点有无效数目的子节点则被当作处于违规状态。

B+ 树的创造者 Rudolf Bayer 没有解释B代表什么。最常见的观点是B代表平衡(balanced),因为所有在叶子节点在树中都在相同的级别上。B也可能代表Bayer,或者是波音(Boeing),因为他曾经工作于波音科学研究实验室。


节点结构
在 B+ 树中的节点通常被表示为一组有序的元素和子指针。除了根之外的每个节点都包含最少 L 个元素最多 U 个元素,对于任意的 L 和 U 有最多 U+1 个子指针。对于所有内部节点,子指针的数目总是比元素的数目多一个。因为所有叶子都在相同的高度上,节点通常不包含确定它们是叶子还是内部节点的方式。

每个内部节点的元素充当分开它的子树的分离值。例如,如果内部节点有三个子节点(或子树)则它必须有两个分离值或元素 a1 和 a2。在最左子树中所有的值都小于 a1,在中间子树中所有的值都在 a1 和 a2 之间,而在最右子树中所有的值都大于 a2。

算法

查找
查找以典型的方式进行,类似于二叉查找树。起始于根节点,自顶向下遍历树,选择其分离值在要查找值的任意一边的子指针。在节点内部典型的使用二分查找来确定这个位置。


插入
节点要处于违规状态,它必须包含在可接受范围之外数目的元素。

首先,查找要插入其中的节点的位置。接着把值插入这个节点中。
如果没有节点处于违规状态则处理结束。
如果某个节点有过多元素,则把它分裂为两个节点,每个都有最小数目的元素。在树上递归向上继续这个处理直到到达根节点,如果根节点被分裂,则建立一个新根节点。为了使它工作,元素的最小和最大数目典型的必须选择为使最小数不大于最大数的一半。

删除
首先,查找要删除的值。接着从包含它的节点中删除这个值。
如果没有节点处于违规状态则处理结束。
如果节点处于违规状态则有两种可能情况:
它的兄弟节点,就是同一个父节点的子节点,可以把一个或多个它的子节点转移到当前节点,而把它返回为合法状态。如果是这样,在更改父节点和两个兄弟节点的分离值之后处理结束。
它的兄弟节点由于处在低边界上而没有额外的子节点。在这种情况下把两个兄弟节点合并到一个单一的节点中,而且我们递归到父节点上,因为它被删除了一个子节点。持续这个处理直到当前节点是合法状态或者到达根节点,在其上根节点的子节点被合并而且合并后的节点成为新的根节点。

注解
假定 L 是节点允许拥有子节点的最小数目,而 U 是最大数目。则每个节点总是有在 L 和 U 之间(包含它们在内)个子节点,除了一个例外: 根节点有从2到U(包含它们在内)个子节点。换句话说,根节点豁免于低边界限制,而拥有它自己的低边界2。这允许树持有小数目的元素。根有一个子节点没有意义,因为附着在这个子节点上的子树可以简单的附着在根节点上。允许根节点没有子节点也是不需要的,因为没有元素的树典型的表示为没有根节点。
测试NULL 2011-01-18
  • 打赏
  • 举报
回复
理解B树 B+树 收藏
老杨说过树形结构是计算机系统里最重要的数据结构

因为它有这很好的平衡性能,即多余多种操作都有着比较好的操作性能。

因为对树的操作时间复杂度大多与树的高度有关,而树的高度又是N的对数级,因此性能很令人满意。

但是有一种情况,希望树的高度比通常的以2为底的对数还要好一些才能满意,那就是对硬盘的IO。因为对硬盘的IO是一项很费时间的事情,所以在数据量大到单单内存不足以存储而不得不存放在硬盘里的时候,我们常常希望通过尽可能少的磁盘IO次数就能找到我们所要的数据,对其进行访问。这也是各大IT公司面试常常问到的问题——海量数据问题。以前通常回答二级索引,即一级索引常驻内存,通过一级索引找到二级索引,读入内存,再通过二级索引找到最终要找的具体数据,而“索引”,一直设想的都是HASH,现在回头想来,HASH其实是不合适的。因为HASH只能提供映射,而不能提供范围信息。这个问题的正确答案应该是B树或者B+树。

B+树是B树的变种。

所谓B树,是一棵多叉树,每一个节点(除了根)的分叉因子都不小于t,不大于2t。对根的要求较少,只要求不能大于2t,在树不为空的时候分叉因子不为1,根的灵活性是为B树在插入、删除操作时不违背B树的定义而服务的,具体操作参见算法导论第19章。每个节点x含有n[x]个关键字,这些关键字的作用是为该节点的孩子结点中的关键字划定范围,即划分了n[x]+1个范围,这样的话该节点就有n[x]+1个孩子结点。在实际应用中t通常很大,通常设计一个t的大小时应尽量使得一个节点的所有内容的大小和磁盘中的一个页相近,因为一次磁盘IO读取和写入都是以一个页为单位的,这样做就可以最大化地利用一次磁盘IO的操作。如一棵t=1000的B树,哪怕高度只有2,也可以存放1000^3=10亿以上的关键字,也就是说哪怕你有这么海量的数据,要查找、插入、删除其中的一个也只需要至多2次的磁盘IO(根节点是常驻内存的)。

具体的查找关键字k时,从根结点开始,通过线性比对当前节点的n[x]个关键字,决定要下降到该节点的哪一个孩子结点,直到找到要查找或者删除的关键字或者要插入的位置位置。

B+树是B树的变种,它在每个内节点里都只存放关键字信息,而只在叶子节点中存放存储所需的其它附属信息,这样就可以让内节点的分支因子最大化,也让树的高度尽可能的低。

转自http://blog.csdn.net/super_chris/archive/2010/12/23/6093848.aspx

另有:http://blog.csdn.net/wbgeorge/archive/2010/05/06/5563316.aspx

sosidami 2011-01-15
  • 打赏
  • 举报
回复
。。。。不可理解。。。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧