二叉搜索树、B树、B+树、B*树。二叉搜索树、B树、B+树、B*树。

原文: http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html

原文: http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html

二叉查找树

二叉查找树

       1.装有非叶子结点至多拥有两独儿子(Left和Right);

       1.有非叶子结点至多有所两独儿子(Left和Right);

       2.享有结点存储一个主要字;

       2.具备结点存储一个要害字;

       3.非纸牌结点的左指针指向小于其利害攸关字之子树,右指针指向大于其主要字之子树;

       3.非叶子结点的左指针指向小于其要字之子树,右指针指向大于其根本字的子树;

       如:

       如:

       

       

图片 1

图片 2

       二叉查找树的检索,从根结点开始,如果查询的严重性字与结点的重中之重字相当,那么即便击中;

       二叉查找树的寻,从根结点开始,如果查询的首要字与结点的第一字当,那么就算命中;

要不然,如果查询关键字于结点关键字小,就进左儿子;如果比结点关键字特别,就进来

要不然,如果查询关键字于结点关键字小,就进左儿子;如果比较结点关键字很,就进去

右手儿子;如果左儿子或右儿子的指针也空,则告诉找不顶对应的重点字;

右侧儿子;如果左儿子或右儿子之指针也空,则告诉找不交对应的最主要字;

       如果二叉查找树的装有非叶子结点的左右子树的结点数目均保持多(平衡),那么二叉查找树

       如果二叉查找树的富有非叶子结点的左右子树的结点数目均保持多(平衡),那么二叉查找树

的寻找性能逼近二划分查找;但它比连续内存空间的亚分叉查找的独到之处是,改变二叉查找树结构

的摸性能逼近二分割查找;但它们于连续内存空间的次私分查找的长是,改变二叉查找树结构

(插入与删除结点)不需要活动大段的内存数据,甚至普通是常数开销;

(插入与删除结点)不需要走大段的内存数据,甚至普通是常数开销;

       如:

       如:

      

      

图片 3

图片 4

   但二叉查找树于经一再插与删除后,有或造成差之结构:

   但二叉查找树于经反复栽与删除后,有或造成不同的构造:

图片 5

图片 6

   右边为是一个二叉查找树,但其的探寻性能已经是线性的了;同样的第一字集合有或致不同之

   右边为是一个二叉查找树,但它的查找性能就是线性的了;同样的基本点字集合有或造成差的

养结构索引;所以,使用二叉查找树还要考虑尽可能为二叉查找树保持左图的构造,和幸免右图的布局,也就是

养结构索引;所以,使用二叉查找树还要考虑尽可能为二叉查找树保持左图的结构,和幸免右图的布局,也就

大凡所谓的“平衡”问题;      

凡是所谓的“平衡”问题;      

       实际行使的二叉查找树都是以本来二叉查找树的基础及长平衡算法,即“平衡二叉树”;如何保持二叉查找树

       实际行使的二叉查找树还是以原来二叉查找树的根基及添加平衡算法,即“平衡二叉树”;如何保持二叉查找树

结点分布均匀的抵算法是平衡二叉树的要;平衡算法是同种植于二叉查找树被插和去结点的

结点分布均匀的抵算法是平衡二叉树的严重性;平衡算法是同等种植在二叉查找树被插入和去结点的

策略;

策略;

 

 

 

 

B树

B树

       是千篇一律种多里程搜索树(并无是二叉的):

       是相同栽多总长搜索树(并无是二叉的):

       1.定义任意非叶子结点最多只有M个儿子;且M>2;

       1.概念任意非叶子结点最多只有M个儿子;且M>2;

       2.根结点的崽数也[2,
M];

       2.根结点的小子数也[2,
M];

       3.除了根结点以外的非叶子结点的儿子数为[M/2,
M];

       3.除根结点以外的非叶子结点的小子数也[M/2,
M];

       4.每个结点存放至少M/2-1(取上整)和及多M-1个举足轻重字;(至少2单至关重要字)

       4.每个结点存放至少M/2-1(取上整)和及多M-1单重大字;(至少2只重点字)

       5.非叶子结点的基本点字个数=指向儿子的指针个数-1;

       5.非叶子结点的第一字个数=指向儿子之指针个数-1;

       6.非叶子结点的要字:K[1], K[2], …,
K[M-1];且K[i] <
K[i+1];

       6.非叶子结点的最主要字:K[1], K[2], …,
K[M-1];且K[i] <
K[i+1];

       7.非纸牌结点的指针:P[1], P[2], …,
P[M];其中P[1]对关键字小于K[1]的

       7.非叶子结点的指针:P[1], P[2], …,
P[M];其中P[1]对关键字小于K[1]的

子树,P[M]本着关键字大于K[M-1]的子树,其它P[i]针对关键字属于(K[i-1], K[i])的子树;

子树,P[M]对关键字大于K[M-1]的子树,其它P[i]针对关键字属于(K[i-1], K[i])的子树;

       8.所有叶子结点位于同层;

       8.所有叶子结点位于同层;

       如:(M=3)

       如:(M=3)

图片 7

图片 8

       B树的搜,从根结点开始,对结点内的严重性字(有序)序列进行第二瓜分查找,如果

       B树的追寻,从根结点开始,对结点内之要害字(有序)序列进行次分割查找,如果

猜中则结束,否则进入查询关键字所属范围之儿子结点;重复,直到所对应之男指针也

中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应之男指针也

拖欠,或已是纸牌结点;

拖欠,或都是纸牌结点;

B树之特点:

B树之特色:

       1.第一字集合分布于整颗树被;

       1.要字集合分布于整颗树被;

       2.别样一个生死攸关字出现还只有现出于一个结点中;

       2.任何一个重中之重字出现还只现出于一个结点中;

       3.物色来或于非叶子结点结束;

       3.查找来或于非叶子结点结束;

       4.其搜索性能等价于在主要字全集内做一样浅第二划分查找;

       4.那个寻找性能等价于在事关重大字全集内做一样不行第二分开查找;

       5.自动层次控制;

       5.自动层次控制;

       由于限了除根结点以外的非叶子结点,至少含有M/2独儿子,确保了结点的至少

       由于限了除根结点以外的非叶子结点,至少含有M/2单儿子,确保了结点的足足

利用率,其最底搜索性能也:

利用率,其最底搜索性能也:

图片 9

图片 10

    

    

       其中,M为设定的非叶子结点最多子树个数,N为关键字总数;

       其中,M为设定的非叶子结点最多子树个数,N为关键字总数;

       所以B树的习性总是顶于次分叉查找(与M值无关),也便无B树平衡的问题;

       所以B树的习性总是顶于次瓜分查找(与M值无关),也就没B树平衡的问题;

       由于M/2的限量,在插入结点时,如果结点已满,需要用结点分裂为有限个诸占

       由于M/2的限制,在插入结点时,如果结点已满,需要以结点分裂为有限只诸占

M/2的结点;删除结点时,需用鲜单不足M/2的兄弟结点合并;

M/2的结点;删除结点时,需将简单单不足M/2的哥们儿结点合并;

 

 

 

 

B+树

B+树

       B+树是B树的变体,也是同等种植多路寻找树:

       B+树是B树的变体,也是千篇一律种多路寻找树:

       1.该定义基本与B树同,除了:

       1.那定义基本和B树同,除了:

       2.非纸牌结点的子树指针与根本字个数相同;

       2.非纸牌结点的子树指针与重点字个数相同;

       3.非叶子结点的子树指针P[i],指向关键字值属于[K[i],
K[i+1])的子树

       3.非纸牌结点的子树指针P[i],指向关键字值属于[K[i],
K[i+1])的子树

(B树是开区间);

(B树是始于区间);

       5.也具有叶子结点增加一个链指针;

       5.呢具备叶子结点增加一个链指针;

       6.所有关键字都以叶子结点出现;

       6.所有关键字都于叶子结点出现;

       如:(M=3)

       如:(M=3)

图片 11

图片 12

   B+的追寻以及B树也基本相同,区别是B+树只有达到叶子结点才命中(B树得在

   B+的搜与B树为基本相同,区别是B+树只有达到叶子结点才命中(B树好于

非叶子结点命中),其性质也等价于在显要字全集做相同不良第二分叉查找;

非叶子结点命中),其性也等价于在重点字全集做相同涂鸦第二分开查找;

       B+的特性:

       B+的特性:

       1.具有重要字还出现在叶子结点的链表中(稠密索引),且链表中之主要字正

       1.具主要字还出现在叶子结点的链表中(稠密索引),且链表中的机要字正

大凡一成不变的;

举凡雷打不动的;

       2.勿容许于非叶子结点命中;

       2.免可能以非叶子结点命中;

       3.非纸牌结点相当给是纸牌结点的目(稀疏索引),叶子结点相当于是存储

       3.非纸牌结点相当给是纸牌结点的目录(稀疏索引),叶子结点相当于是存储

(关键字)数据的数据层;

(关键字)数据的数据层;

       4.再度契合文件索引系统;

       4.重复可文件索引系统;

  

  

B*树

B*树

       是B+树的变体,在B+树的非根和非叶子结点再多对兄弟之指针;

       是B+树的变体,在B+树的非根和非叶子结点再充实对兄弟之指针;

图片 13

图片 14

   B*养定义了非叶子结点关键字个数至少也(2/3)*M,即块的低使用率为2/3

   B*铸就定义了非叶子结点关键字个数至少也(2/3)*M,即块的最低使用率也2/3

(代替B+树的1/2);

(代替B+树的1/2);

       B+树的解体:当一个结点满时,分配一个初的结点,并将原本结点中1/2的数

       B+树的分崩离析:当一个结点满时,分配一个初的结点,并将原本结点中1/2底数据

复制到新结点,最后以父结点中益新结点的指针;B+树的分崩离析就影响原本结点和翁

复制到新结点,最后以父结点中长新结点的指针;B+树的解体就影响原本结点和爸爸

结点,而不见面影响兄弟结点,所以她不需负为兄弟的指针;

结点,而休见面潜移默化兄弟结点,所以她不欲靠为兄弟之指针;

       B*培养之解体:当一个结点满时,如果它们的下一个哥们结点未满,那么用一些

       B*树的分崩离析:当一个结点满时,如果它的下一个弟兄结点未满,那么用一部分

数量易到兄弟结点中,再于原本结点插入关键字,最后修改父结点中兄弟结点的首要字

数易到兄弟结点中,再以原本结点插入关键字,最后修改父结点中兄弟结点的要字

(因为兄弟结点的根本字范围转了);如果兄弟也洋溢了,则以原先结点与手足结点之

(因为兄弟结点的重要字范围转了);如果兄弟也充满了,则于原先结点与手足结点之

里面长新结点,并各复制1/3之数到新结点,最后在父结点增加新结点的指针;

个中加新结点,并各复制1/3之数据及新结点,最后以父结点增加新结点的指针;

       所以,B*塑造分配新结点的票房价值比B+树要没有,空间使用率还胜;

       所以,B*扶植分配新结点的概率比B+树要低,空间使用率还强;

  

  

小结

小结

       二叉查找树:二叉树,每个结点只存储一个最主要字,等于则中,小于走左结点,大于

       二叉查找树:二叉树,每个结点只存储一个首要字,等于则中,小于走左结点,大于

活动右结点;

挪动右结点;

       B树:多里程搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指为第一

       B树:多路程搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指于重点

许范围的子结点;

字范围之子结点;

       所有重点字于整颗树被起,且只现出同等不善,非叶子结点可以中;

       所有重要字在整颗树被冒出,且只有出现同样不成,非叶子结点可以中;

       B+树:在B树基础及,为叶子结点增加链表指针,所有重点字还在叶子结点

       B+树:在B树基础及,为叶子结点增加链表指针,所有重要字都于叶子结点

着出现,非叶子结点作为叶子结点的目录;B+树总是顶叶子结点才命中;

丁冒出,非叶子结点作为叶子结点的目录;B+树总是顶叶子结点才命中;

       B*塑造:在B+树基础及,为非叶子结点也长链表指针,将结点的低利用率

       B*培训:在B+树基础及,为不叶子结点也加进链表指针,将结点的低利用率

从1/2提高到2/3;

从1/2提高到2/3;

===============注释==============

===============注释==============

瞩目没有呀给B-树的事物,是翻译问题导致的,B-Tree
于翻成B-树,其实当叫B树

留意没有啊叫B-树的东西,是翻译问题造成的,B-Tree
被翻译成B-树,其实应当叫B树

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注