笔试算法题(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,所以拥有极高的磁盘利用效率;
笔试算法题(47):简介 - B树 & B+树 & B*树的更多相关文章
- 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)
议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...
- 笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法
广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能 ...
- 笔试算法题(39):Trie树(Trie Tree or Prefix Tree)
议题:TRIE树 (Trie Tree or Prefix Tree): 分析: 又称字典树或者前缀树,一种用于快速检索的多叉树结构:英文字母的Trie树为26叉树,数字的Trie树为10叉树:All ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆
二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)
议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...
- 笔试算法题(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 ...
- 笔试算法题(51):简介 - 红黑树(RedBlack Tree)
红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的 ...
随机推荐
- 01_传智播客iOS视频教程_课程介绍与知识点回顾
OC语法中static关键字不能修饰属性,也不能修饰方法,只能修饰方法中的局部变量.static修饰局部变量之后把局部变量变成静态变量.当方法执行完之后这个变量不会被回收.下次再执行这个方法的时候这个 ...
- linuxmint17.3提示flash不是最新版本解决方法(copy)
[资料来自于:http://blog.csdn.net/kh896424665/article/details/54879608] 问题:播放视频提示:Adobe Flash Player 不是最新版 ...
- (8)css表格
用css设置表格样式 *<table></table> 标签定义 HTML 表格. * tr 元素定义表格的行:th 元素定义表格的表头:td 元素定义表格中的单元格:capt ...
- USACO Training3.3 A Game【区间Dp】 By cellur925
题目传送门 一股浓浓的博弈论香气...然而本蒟并不会博弈论. 开始用双端队列+假的dp水过了24pts水数据. 其实是布星的,两人都绝顶聪明会深谋远虑不像我只看眼前,所以上述算法错误. 正解:区间dp ...
- BOA服务器搭建步骤
1.下载Boa Webserver的源码 http://www.boa.org/ 2.解压并编译Boa Webserver $ tar xvf boa-0.94.13.tar.gz 由于Boa Web ...
- Poj 2516 Minimum Cost (最小花费最大流)
题目链接: Poj 2516 Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求 ...
- _bzoj1070 [SCOI2007]修车【最小费用最大流】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1070 以后做网络流题目就是不能省内存... #include <cstdio> ...
- 备份字段(CATALOGUE_CODE)
update am_e4_entry set CATALOGUE_CODE_back=CATALOGUE_CODE; 还原字段 update am_e4_entry a set CATALOGUE_C ...
- laravel 学习
解决办法:没有开启PHP.ini的fileinfo扩展
- 技术杂记之:vi使用入门
对于Linux的初次使用者来说,进入Linux非图形界面后,不知道怎么创建文本(甚至于在图形界面,也找不到创建文本的菜单).其实,每一个Linux的发行版本,都包含了一个最简单.也是最基础的文本编辑器 ...