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. bzoj 1661: [Usaco2006 Nov]Big Square 巨大正方形【枚举】

    每句两个顶点确定正方形,取max即可 #include<iostream> #include<cstdio> using namespace std; int n,x,y,s, ...

  2. 利用爬虫将Yuan先生的博客文章爬取下来

    由于一次巧遇,我阅读了Yuan先生的一篇博客文章,感觉从Yuan先生得博客学到很多东西,很喜欢他得文章.于是我就关注了他,并且想阅读更多出自他手笔得博客文章,无奈,可能Yuan先生不想公开自己得博客吧 ...

  3. 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减 直至765398并保持此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动 ,当数码管上数减到停止时,实验板上流水灯出停止然后全部开始闪烁,3秒后(用 T0定时)流水灯全部关闭,数码管上显示出“HELLO”,到此保持住

    #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigne ...

  4. ural1076 Trash 垃圾

    Description You were just hired as CEO of the local junkyard.One of your jobs is dealing with the in ...

  5. ACM复习专项

    资料整理 ACM训练营 邝斌的ACM模板 牛客网哈理工ACM教学视频 视频网盘资料(密码:kntr) 1. 训练阶段 第一阶段:练习经典常用算法 (本周任务) 1. 最短路(Floyd.Dijstra ...

  6. windows 迁移数据库

    1) Prerequisites    ---------------- - The copy of the datafiles must be done with the database clos ...

  7. 【LeetCode 33】Search in Rotated Sorted Array

    Search in Rotated Sorted Array 分段有序的数组,二分查找返回下标,没有返回-1 数组有序之后经过 rotated, 比如:6 1 2 3 4 5  or 5 6 7 8 ...

  8. shell脚本中定义路径变量出现的BUG

    =========================================================================== if 语句中的定义路径变量 引发命令的PATH路 ...

  9. XML To Linq 读取Sharepoint列表中的附件列信息

    通过页面查看,列表附件信息列的内容如下: var x = @"<div class='ExternalClass9936DCD1F074427B891D09CFCEFC2AB6'> ...

  10. OAuth 开放授权 Open Authorization

    http://oauth.net/ http://tools.ietf.org/html/rfc6749 http://reg.163.com/help/help_oauth2.html 网易通行证O ...