一,B-树的定义及介绍

为什么会有B-树?

熟悉的树的结构有二叉树查找树或者平衡二叉树……平衡二叉树保证最坏情况下各个操作的时间复杂度为O(logN),但是为了保持平衡,在插入或删除元素时,需要进行旋转啊...一系列操作,因此实现起来比较复杂。而对于二叉查找树,基本操作在最坏情况下会出现O(N)的时间复杂度。总之,这些树都是针对于内存中的数据操作,它们每个结点最多只有两个孩子,当数据量大时(结点数目很多),就会导致树很高。但由于基本操作(查找元素、插入元素)都是在内存中实现,因此,树高点也就没有太大的关系。

试想,如果树中的结点数据 是存储在磁盘上的,每访问一个结点需要进行一次磁盘的读取操作,那么树的高度就很重要了。因为,磁盘访问的代价(速度)远远大于内存访问的代价。对于7200转的硬盘而言,访问一次磁盘大约需要8.3ms,而对于4GHz的CPU而言,8.3ms不知可以执行多少次指令了。

因此,B树一个很重要的特征就是:高度小。

那如何让高度变小呢?让每个结点可以拥有多个(远远大于2)孩子就可以了。但是,为了在插入、删除中仍然保持B树的性质(比如高度要低),还需要对B树做一些其他方面的规定:(实际实现过程中可能不同)。

其中最重要的规定是:每个结点最多包含多少个关键字(项),最少需要包含多少个关键字。

这里,给出一个具体的M阶 B树定义(《数据结构与算法分析》MAW著)

①数据项 只存储在树叶上。(数据项就是实实在在的数据,而不是索引)

②非叶子结点最多可以 存储 M-1个关键字以指示搜索的方向(这里的关键字是指索引)。

这里的M-1个关键字是按从小到大的顺序排序的。M-1个关键字,就有M个指针,指向进一步查找的路径。

③树的根或者是一片树叶,或者其儿子数在 2 到 M之间

④除根外,所有非树叶节点的儿子数在 【M/2】 和 M 之间   【M/2】表示,M/2并向上取整

非叶子结点的儿子数最少为【M/2】,这就是为了保证每个结点足够多的孩子,从而使树的高度不至于太大。

⑤所有的树叶都在相同的深度上并有【L/2】 和 L 个数据项

这里表明,真正的数据只存储在叶子结点上。非叶子结点只存储索引。

在上面的具体规定中,M 和 L 是如何确定的呢?

M 和 L的确定与磁盘块的大小相关。对于B树而言,每个结点都尽量占据一个磁盘块。

比如,假设有 1千万数据项,每个关键字(索引)是32B,而每个数据项是256B,磁盘块的大小是8192B,如何确定M 和 L 呢?

由于M阶B树中,每个结点最多有 M-1 个关键字,故关键字总大小为 32M-32,M-1个关键字最多有M个分支指针,假设每个分支指针是4B(字节),故分支指针的大小是4*M个字节。那么对于一个非叶子结点,它的大小是36*M-32 字节,由于磁盘块大小是8192,故M = 8192/(36*M-32) = 228

(注意:这里的“关键字”其实类似于数据项,待插入的数据项 就是 通过比较关键字 来确定走哪条分支指针)

由上面的第5点可知,叶子结点只存储数据项,每个数据项大小为256B,故 L=8192/256=32,这说明每个叶子结点可以存储32个数据项。

M 与关键字以及指针的大小有关,而L与数据项的大小有关。总之,目标是:不管是叶结点还是非叶结点,都尽量保证一个结点占据一个磁盘块。

二,B树的基本操作

1)查找操作

查找操作的伪代码如下:《算法导论》这里的B树中数据项可存储在非叶子结点上。

 B-TREE-SEARCH(x,k)
i =
while i<= M' and k > key(i)
i++
if i<=M' and k=key(i)
return (x,i)
if leaf(x)
return NIL
else
DISK-READ(child(x(i)))
return B-TREE-SEARCH(child(x(i)),k)

x实际上代表根结点。第3行,扫描结点上所有的数据项看是否与k匹配,若不匹配且结点不是叶子结点,则需要在第10行进行一次磁盘读取操作,将该结点中某数据项指向的孩子结点读入内存,再进行比较。

2)插入操作

插入操作可能会导致结点分裂。插入操作的具体实现细节可能与这里描述的不一样。

比如,向一个已经满了的叶结点插入一个数据项时,该叶结点分裂成两个结点,并将中间数据项上移到该结点的双亲结点。

3)删除操作

删除操作可能会导致结点合并。具体描述参考算法导论。

比如,还可以这样来处理:当某个节点不包含的数据项已经达到最小时,可以从邻节点 “领养” 一个数据项。当邻节点也不足时,则将这两个节点合并成一个节点。

三,B树与B+树的主要区别

最主要的区别就是:B树中非叶子结点可以存储数据,而B+树非叶子结点只存储索引,所有的数据都放在叶子结点上存储,且所有的叶子结点到根的距离是一样的(叶子结点都在同一层)。

参考:B树学习总结

https://www.tutorialcup.com/dbms/b-tree.htm

B-树(B+树) 学习总结的更多相关文章

  1. 字典树 trie树 学习

    一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种   二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...

  2. AlphaGo原理-蒙特卡罗树搜索+深度学习

    蒙特卡罗树搜索+深度学习 -- AlphaGo原版论文阅读笔记     目录(?)[+]   原版论文是<Mastering the game of Go with deep neural ne ...

  3. 珂朵莉树(Chtholly Tree)学习笔记

    珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...

  4. 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))

    函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...

  5. 树链剖分学习&BZOJ1036

    题目传送门 树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组.SBT.SPLAY.线段树等)来维护每一条链. ...

  6. 外排序 & 败者树 & 多路归并-学习

    来来来,根据这篇文章,学一下败者树吧: http://blog.csdn.net/whz_zb/article/details/7425152 一.胜者树 胜者树的一个优点是,如果一个选手的值改变了, ...

  7. 浅谈树套树(线段树套平衡树)&学习笔记

    0XFF 前言 *如果本文有不好的地方,请在下方评论区提出,Qiuly感激不尽! 0X1F 这个东西有啥用? 树套树------线段树套平衡树,可以用于解决待修改区间\(K\)大的问题,当然也可以用 ...

  8. 数据结构和算法学习笔记十五:多路查找树(B树)

    一.概念 1.多路查找树(multi-way search tree):所谓多路,即是指每个节点中存储的数据可以是多个,每个节点的子节点数也可以多于两个.使用多路查找树的意义在于有效降低树的深度,从而 ...

  9. *衡树 Treap(树堆) 学习笔记

    调了好几个月的 Treap 今天终于调通了,特意写篇博客来纪念一下. 0. Treap 的含义及用途 在算法竞赛中很多题目要使用二叉搜索树维护信息.然而毒瘤数据可能让二叉搜索树退化成链,这时就需要让二 ...

  10. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

随机推荐

  1. WEB返回顶部效果

    1. PC端页面返回顶部效果 1 $( window ).scroll(function(){ 2 if( $( window ).scrollTop() > 500 ){ // 当顶部的滚动距 ...

  2. java数据结构之hashMap

    初学JAVA的时候,就记得有句话两个对象的hashCode相同,不一定equal,但是两个对象equal,hashCode一定相同,当时一直不理解是什么意思,最近在极客时间上学习了课程<数据结构 ...

  3. Google C++ 编码规范

    刚刚看到一位博主的文章分享Google C++ 编码规范 本人做一下记录,方便以后学习.. 中文在线版本地址: http://zh-google-styleguide.readthedocs.io/e ...

  4. 《Linux内核分析》第一周笔记 计算机是如何工作的

    一.计算机是如何工作的? 1.存储程序计算机工作模型 1)冯诺依曼体系结构 学习研究计算机的基本概念.就是指存储程序计算机.所有的有计算功能的电子设备小到计算器,大到超级计算机核心部分都可以用这种体系 ...

  5. 《Linux内核分析》第三周:Linux系统启动过程

    杨舒雯 原创作品转载请注明出处 Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验--使用gdb跟踪调试内 ...

  6. ejabberd在windows10上安装记录

    安装完ejabberd:ejabberd-17.11-windows-installer.exe 启动报错:bash ejabberdctl register "admin" &q ...

  7. php四排序-选择排序

    原理: 在一列数字中,选出最小数与第一个位置的数交换.然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止.(以下都是升序排列,即从小到大排列) 举例说明: $ ...

  8. idea 导入项目后不能执行main方法

    点击右键,出来不能run/debug 项目分为多个mouel模块,很多模块进来后在idea中丢失了(暂时不知道原因) 我们需要做的就是把丢失的模块加进来 ctrl+alt+shift+s 快捷键  或 ...

  9. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):0. 项目简介 & 成果展示

    本教程咪博士将带领大家学习创建自己的窗口部件 (widget).最终,我们完成的作品是一个简易的画板程序. 当用 kivy 创建应用时,我们需要仔细思考以下 3 个问题: 我们创建的应用需要处理什么数 ...

  10. Spring之c3p0连接池xml配置和使用举例

    1.导入jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.11.jar 2.源码: beans.xml <beans xmlns="http ...