B树的生成

flyfish 2015-7-19

从空树開始构建一棵B树 逐个插入keyword

规则:

除根结点之外的全部非终端结点至少有⌈m/2⌉棵子树,所以keyword的个数必须 n为keyword个数

⌈m/2⌉-1⩽n。

依照A0,K1,A1。K2,A2,…,Kn,An

也就是指针个数比keyword个数多一个

由于树中每一个结点至多有m 棵子树。所以该结点的keyword个数不能超过m-1

也就是,keyword个数的阈值 ⌈m/2⌉−1⩽n⩽m−1

每次插入一个keyword不是在树中加入一个叶子结点,由于这样不再是有效的B树而是首先在最低层的某个非终端结点中加入一个keyword,若该结点的keyword个数不超过m-1,则插入完毕,否则要产生结点的“分裂”

绿色:keyword个数

红色:指针

蓝色:keyword

构建Degree为3keyword从1到7的B树

普通情况下,结点可例如以下实现分裂 引用自严蔚敏《数据结构》

如果*p结点中已有m-1个keyword。当插入一个keyword之后。结点中含有信息为:

(m。A0,(K1。A1)。…。(Km,Am)

且当中 Ki<Ki+1 , 1⩽i< m

此时可将*P节点分裂为*P和*P’两个结点,

*p结点中含有信息

⌈m/2⌉-1。A0,(K1,A1),…,(K⌈m/2⌉−1。A⌈m/2⌉−1)

*p’结点中含有信息

m-⌈m/2⌉,A⌈m/2⌉。(K⌈m/2⌉+1,A⌈m/2⌉+1 ),… ,(Km。Am)

而keywordK⌈m/2⌉和指针*p’一起插入到*p的双亲结点中.

简化理解

m为B树的阶,n为节点的个数

若在一个包括n<m−1个keyword的结点中插入一个新的keyword,则把新的keyword直接插入该结点就可以。

但若把一个新的keyword插入到包括m-1个keyword的结点中,则将引起结点的分裂。

生成一新结点,把原结点上的keywordK按升序排序,也就是 Ki<Ki+1 。

满足:左边的小于中间的keyword;右边的大于中间的keyword,从中间位置把keyword(不包括中间位置的keyword)分成两部分。

左部分所含keyword放在旧结点中。右部分所含keyword放在新结点中,中间位置的keyword连同新结点的存储位置(指向新节点的指针)插入到双亲结点中。

如果双亲结点的keyword个数也超过m-1,则要再分裂,再往上插入,此时B树可能朝着根的方向生长。

B树的生成的更多相关文章

  1. WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用

    WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用 摘要 页面类是如何结合后台文件类生成整个页面的HTML的代码和后台输出的代码输出到浏览器中呢?这就牵扯到Asp.net页面生命 ...

  2. JSP编译成Servlet(一)语法树的生成——语法解析

    一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述.同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语 ...

  3. Asp.net页面生命周期详解任我行(2)-WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用

    摘要 页面类是如何结合后台文件类生成整个页面的HTML的代码和后台输出的代码输出到浏览器中呢?这就牵扯到Asp.net页面生命周期中一个很重要的概念控件树.服务器以反射的方式创建了页面类对象 内容 我 ...

  4. C#3.0新增功能10 表达式树 06 生成表达式

    连载目录    [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...

  5. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  6. 用dTree组件生成无限级导航树

     在做管理系统时不可避免要用到导航树,这种东西只要一次做好,就可以随处运行,目前比较好的组件是dTree,原则上可以达到无限级,当然实际运行中4,5级就已经很多了,dTree的速度还是不错的,而且是J ...

  7. vue中组件之间的相互调用,及通用后台管理系统左侧菜单树的迭代生成

    由于本人近期开始学习使用vue搭建一个后端管理系统的前端项目,在左侧生成菜单树的时候遇到了一些问题.在这里记录下 分析:由于本人设定的菜单可以使多级结构,直接使用vue的v-for 遍历并不是很方便. ...

  8. [WebKit内核] JavaScriptCore深度解析--基础篇(一)字节码生成及语法树的构建

    看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>,写的很好,深受启发.想补充一些Horkey没有写到的 ...

  9. [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门

    [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...

随机推荐

  1. Linux Programming之MySQL

    实验环境:Ubuntu13.04 在此之前有过一段使用MySQL数据库的经历,在Windows平台下使用GUI(当时是使用HeidiSQL和Workbench来管理数据库),并且有过使用Python中 ...

  2. 【Luogu】P2764最小路径覆盖(拆点求最大匹配)

    题目链接 这个……学了一条定理 最小路径覆盖=原图总点数-对应二分图最大匹配数 这个对应二分图……是什么呢? 就是这样 这是原图 这是拆点之后对应的二分图. 然后咱们的目标就是从这张图上跑出个最大流来 ...

  3. linux查找文件命令

    (2)find /etc -name httpd.conf #在/etc目录下文件httpd.conf

  4. vue2.0组件入门

    如何定义一个组件 在根目录src/components/文件夹下新建组件的文件夹Footer.vue组件 在Footer.vue中 <template> <div class=&qu ...

  5. unix网络编程第一章demo

    之前一直以为time_wait状态就是主动关闭的那一方产生.然后这个端口一直不可以用.实际我发现服务端监听一个端口.客户端发来连接后.传输数据后.服务端关闭客户端套接字后.用netstat -nat ...

  6. osstatus -9801 workerman websocket 小程序不带端口

    帮事业部的同事,解决问题,坑总结 小程序出现,osstatus -9801 情况好多,说一下配置环境可解决的方法和问题 tls 1.2, php 5.6+, nginx, workerman 做的 w ...

  7. Java中使用new Date()和System.currentTimeMillis()获取当前时间戳的区别(转)(Java进阶-性能提升)

    在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的 ...

  8. systemtap-oracle

    https://savvinov.com/2015/12/21/non-intrusive-tracing/ https://mahmoudhatem.wordpress.com/2016/01/11 ...

  9. cacti监控linux和windows磁盘IO

    cacti监控linux和windows磁盘IO 标签:cacti linux磁盘IO windows磁盘IO 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则 ...

  10. 使用c#訪问Access数据库时,提示找不到可安装的 ISAM

    使用c#訪问Access数据库时,提示找不到可安装的 ISAM.例如以下图: 代码例如以下: connectionString = "Provider=Microsoft.Jet.OLEDB ...