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,所以拥有极高的磁盘利用效率;

笔试算法题(47):简介 - B树 & B+树 & B*树的更多相关文章

  1. 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)

    议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...

  2. 笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法

    广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能 ...

  3. 笔试算法题(39):Trie树(Trie Tree or Prefix Tree)

    议题:TRIE树 (Trie Tree or Prefix Tree): 分析: 又称字典树或者前缀树,一种用于快速检索的多叉树结构:英文字母的Trie树为26叉树,数字的Trie树为10叉树:All ...

  4. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  5. 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆

    二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...

  6. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  7. 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)

    议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...

  8. 笔试算法题(52):简介 - KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)

    议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T ...

  9. 笔试算法题(51):简介 - 红黑树(RedBlack Tree)

    红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的 ...

随机推荐

  1. ubuntu/linuxmint搜狗输入法无法输入中文或崩溃

    执行下列命令: cd ~/.config rm -rf SogouPY SogouPY.users sogou-qimpanel 然后重启电脑.

  2. Android SDK更新以及ADT更新出现问题的解决办法(转载)

    转自:http://zyueqi.iteye.com/blog/1474323 问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl. ...

  3. 洛谷P4315 月下“毛景树”(树剖+线段树)

    传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 ...

  4. 矩阵快速幂/矩阵加速线性数列 By cellur925

    讲快速幂的时候就提到矩阵快速幂了啊,知道是个好东西,但是因为当时太蒟(现在依然)没听懂.现在把它补上. 一.矩阵快速幂 首先我们来说说矩阵.在计算机中,矩阵通常都是用二维数组来存的.矩阵加减法比较简单 ...

  5. UART、I2C、SPI三种协议对比

    学嵌入式需要打好基础 下面我们来学习下计算机原理里的3种常见总线协议及原理 协议:对等实体之间交换数据或通信所必须遵守规则或标准的集合 1.UART(Universal Asynchronous Re ...

  6. git 文件回滚

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file.场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第 ...

  7. 51nod 1133 不重叠的线段(贪心)

    1133 不重叠的线段  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠 ...

  8. BZOJ 1396||2865 识别子串

    这个不是题解,看不懂的,别看了 明明应该是会的,怎么还是写了6个小时呢... 把后缀数组.height数组.排名数组求出来,那么对于原串s的任意子串[x,y](表示第x个到第y个字符组成的子串,字符从 ...

  9. dotnetty源码解读一些要点

    DefaultAttributeMap 它绑定在Channel或者ChannelHandlerContext上的一个附件. ChannelHandlerContext都是ChannelHandler和 ...

  10. 434 Number of Segments in a String 字符串中的单词数

    统计字符串中的单词个数,这里的单词指的是连续的非空字符.请注意,你可以假定字符串里不包括任何不可打印的字符.示例:输入: "Hello, my name is John"输出: 5 ...