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下安装Mysql出现的常见问题以及解决办法

     1.安装时候出现 warning: mysql-community-server-5.7.13-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ...

  2. kb-07专题线段树-02--单点修改,区间最值

    /* 区间单点该值,区间查询最大值: hdu-1754 */ #include<iostream> #include<cstdio> #include<cstring&g ...

  3. Codeforces Round #345 (Div. 2)——B. Beautiful Paintings(贪心求上升序列个数)

    B. Beautiful Paintings time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. 关于python数据类型的一些举例

    if True: name2=1 print(name2) 输出:1 if False: name1=1 print(name1) 报错: NameError: name 'name1' is not ...

  5. 【bzoj4596】[Shoi2016]黑暗前的幻想乡 (矩阵树定理+容斥)

    Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日高谈所有妖怪平等 ...

  6. postgresql-9.0.18-1-linux.run启动

    下载地址:http://www.enterprisedb.com/products-services-training/pgdownload选择合适版本 基本都是下一步就可以到设置密码时记住密码以后要 ...

  7. sync fsync fdatasync

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速 缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队 ...

  8. 浅谈JS的arguments对象

    在JavaScript中,arguments属于当前对象的一个内置属性,arguments非常类似于Array对象,但是又不是实例的Array.比如: Array.prototype.testArg ...

  9. html-禁用右键、键盘F12、网页上选取内容、复制、粘贴

    摘要 为了保护我们的代码,我们需要想些办法禁止复制. css: body{     -webkit-touch-callout: none;    -webkit-user-select: none; ...

  10. css-通过css让块显示或隐藏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...