笔试算法题(47):简介 - B树 & B+树 & B*树

B树(B-Tree)

  • 1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量少 的操作次数内完成CPU分配的任务,B树就按照此原则设计,B树与红黑树的主要区别在于B树节点可以有超过2个子女,从而大大降低树的高度以减少查询时 间;

  • 一棵M阶B树(Balanced Tree of Order M)是一棵平衡的M路搜索树,满足性质:

    根节点至少有两个子女;

    除根节点和叶子节点外的节点至少有M/2 + 1个子女,至多有M-1个子女;

    所有叶子节点都位于同一层(平衡树),并且不包含任何关键字信息;

    除叶子节点外的节点中包含k个有序关键字,除了表示其自身查找信息外,这k个关键字还将此有序范围划分成k+1个子空间,并使用k+1个指针索引指向子节点,子节点拥有的关键字的范围在划分关键字之间;

    如果B树包含N个关键字,则叶子节点个数为N+1;

    设B树第一层为根节点,仅1个节点;第二层有2个节点;第三层有2*(M/2+1)个节点;第四层有2*(M/2+1)2个节点;递推下去第H层有2* (M/2+1)H-2个节点;由于叶子节点至多有N+1个,所以有N+1>=2*(M/2+1)H-2,然后两边取log后化解出H的表达式 为:H<=log(M/2+1)((N+1)/2) +2;所以B树的查找效率较高;

  • B树中一个节点包含的关键字信息和分支指针信息大小由磁盘块的大小决定,这样充分利用一次磁盘块读写的时间,使用最少的磁盘访问次数最终找到目标关键字; 同样,在节点大小确定的情况下,如果减小每个键的长度则可以存储更多的键,从而进一步减小B树的高度,最终加快查询时效性;
     
  • 插入操作:对于高度为H的M阶B树,新节点一般都是插入到H层,也就是最底层;插入步骤如下

    由于B树为多叉有序树,所以使用O(logN)的时间查找新节点是否已经存在,如果已经存在,则结束插入操作;

    如果新节点不存在于B树,则对于最终找到的节点而言,如果关键字数量少于M-1个,直接插入到对应的位置(保证关键字有序);

    如果关键字数量大于M-1个,则继续将新节点插入到数据链表中,但将数据链表以中间关键字Y作为分界点,分成两个节点,并将Y插入到父节点的关键字链表中;

    判断父节点的关键字链表是否满足最大关键字限制(大于M-1),如果不满足则继续分裂节点,并向上插入中间关键字,最终分裂根节点使得B树高度增加1;

  • 删除操作:与插入操作相反,删除操作则可能需要合并不满足B树定义的子节点,或者将父节点被删除的子节点合并到父节点兄弟节点的子节点中,但此时仍旧需要 考虑节点的分裂;R-Tree是B树的扩展,用于解决高维度数据的查询问题(地图查询),R-trees: a dynamic index structure for spatial

 

B+树(B+ Tree)

  • B+树是B树的一种扩展树,他们的差异如下:

    如果一个节点有k个关键字,则其同样拥有k个指向子女节点的指针;

    叶子节点有序包含所有区间内的关键字信息;非叶子节点仅其索引划分的功能;

    如果限制一个B+树的非叶子节点至多包含k个关键字,则其至少需要包含k/2个关键字(所以磁盘利用效率最低为1/2),否则需要进行向上合并操作;

  • 由于B+树内部节点并没有包含关键字的具体信息,所以同样一个磁盘块就可以存储更多的节点,从而进一步降低磁盘读取次数;由于所有的存储信息都位于深度相同的叶子节点,所以每一次查询都的路径长度相同,最终查询更加稳定;

     

     
  • 插入操作:新数据最终只能插入到叶子节点,但是如果一个叶子节点关键字的个数达到上限(MAX_KEY)则需要将此叶子节点拆分成两个叶子节点,由 k1,k2,k3划分,其中k1和k3是父亲节点中原有的节点,k2是两个叶子节点的划分节点;如果父亲节点因为添加了k2而使其关键字个数超过了上限 (MAX_KEY),则使用相同的处理方式;所以插入操作的时间复杂度为O(logTN),其中T为每个节点最多可以存储的关键字数,N为关键字总数;

 

B*树(B star Tree)

  • B*树是B+树的进一步扩展,他们的差异在于:

    除根节点和叶子节点外的节点增加一个指向同一个父节点下兄弟节点的指针;

    如果限制一个B+树的非叶子节点至多包含k个关键字,则其至少需要包含2k/3个关键字(所以磁盘利用效率最低为2/3),否则需要进行向上合并操作;
     

  • 插入操作:新数据最终只能插入到叶子节点,但是如果一个叶子节点关键字的个数达到上限(MAX_KEY),则需要修改父节点;由于B+树的兄弟节点之间有 指针连接,所以可以可以通过指针在节点之间转移数据,但前提是兄弟节点没有满;如果兄弟节点的关键字也达到上限,则只能在中间新创建一个节点;由于B+树 的最低限制为2/3,所以拥有极高的磁盘利用效率;

posted @ 2014-05-28 09:50  Leo C.  阅读(441)  评论(0编辑  收藏  举报