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. 在使用react时的异步问题解决

    在时用react时, 常常会出现在创建一个对象后, 对象还没有创建完成就被使用的异步问题, 介于这种问题, 一种解决方法就是使用Promise, 将需要被等待的那一步放到Promise中, Promi ...

  2. Vijos P1782 借教室 ( 前缀和&&差分序列)

    题目链接:借教室 题意:给出n天得教室数目,m个借教室得单子,按顺序借教室,问哪个单子不满足并输出 分析:可以用线段树做,会T,常数比较大,选择用差分序列维护前缀和,二分答案即可 #include&l ...

  3. Marching squares 算法 获取轮廓(contour tracing)

    https://en.wikipedia.org/wiki/Marching_squares  http://blog.csdn.net/coolingcoding/article/details/1 ...

  4. bat批处理文件夹内文件名的提取

    有时候会在做某些东西的时候 我们要提取某个文件夹的所有文件名,一个一个打出来那不是 现实的 所以这个时候就用到了一个比较简便而又快捷的方法 在所在的文件夹内新建一个a.txt 在a.txt编辑DIR ...

  5. 洛谷 P3356 火星探险问题 【最大费用最大流】

    输出方案好麻烦啊 拆点,石头的连(i,i',1,1)(i,i',inf,0)表示可以取一次价值1,空地直接连(i,i',inf,0),对于能走到的两个格子(不包括障碍),连接(i',j,inf,0), ...

  6. 例题3-4 master-mind hints

    下面先附上我的水货代码,,,,一会附上,,,刘大婶给的代码///////3ms #include<stdio.h> #include<string.h> int main() ...

  7. ntp多台主机时间同步

    通俗的讲,多台主机ntp时间同步,就是自定义集群中一台机器(我们这里叫它server)与网络时间同步,然后其它主机与server主机时间同步 另外,ntp时间同步机制不是我们想象的那样直接同步,而是“ ...

  8. BZOJ2553 [BJWC2011]禁忌

    传送门 Description ​ 给你前alphabet个小写字母组成的字符集, 以及n个单词, 定义一个串s的禁忌值为 \(\sum_{i } [s[i] == Taboo[i]]\) , Tab ...

  9. _bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 见一周目记录:http://www.cnblogs.com/ciao-sora/p/6 ...

  10. [ZPG TEST 116] 最小边权和【生成树相关】

    先将输入的边从小到大排序,对于一条边,它一定连接着两个联通块u与v,那么这条变对于答案的贡献是siz[u] * siz[v] * (边权 + 1) - 1,别问为什么这太显然了,一想就懂... #in ...