B树

B树在查找、访问、插入、删除操作上时间复杂度为O(log2(n))
在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取/写入数据时,通过IO操作要花费大量的时间,因此需减少树的深度,来减少IO操作,以此来提升效率。
B树通常在数据库和文件系统中被使用

特性(m阶)

①树中每个结点至多有m个孩子
②有n个孩子的非终端结点恰好包含n-1个关键字
③除根和叶子结点外,其它每个结点至少有m/2(向上取整)个孩子
④若根结点不是叶子结点,则至少有两个孩子
⑤所有叶子结点都出现在同一层,叶子结点不包含关键字

B树的分裂

当树中某个结点的数据量大于最大值时,以该结点中央数据为界限,分为三部分数据。将中央数据上升到其父结点中,新建一个结点和原结点分别存储分离后两端的数据,并将其作为上升数据的左右两个子树。
当根结点中的数据量也大于最大值时,向上分裂,会产生一个新的根,致使整个数的高度加一。

B树的建立

由两个结构体对B树进行存储

①存储树的结点信息

class BNode{//关键字个数public int num;//数据,需存储一个溢出结点public int[] data;//子节点,需存储一个溢出结点的右子结点public BNode[] childNodes;//父结点(分裂时需用到)public BNode dadNode;}

②存储B树的基本信息和根

class Btree{//每个结点最大存储数据数public int max;//最小存储数据数public int min;//树根结点、public BNode rootNode;}
具体建立过程(以文件为数据来源)

①提取文件信息,初始化树

/*** 从文件中读取数据,构建一棵B树* @param file 文件名* @param m  阶数(m>=2)*/public void creBTree(String file, int m) {BufferedReader bReader;try {bReader = new BufferedReader(new FileReader(file));String data = bReader.readLine();if(btree == null) {btree = new Btree(m, Integer.parseInt(data));}while((data = bReader.readLine()) != null) {BNode addNode = seekLocate(this.btree.rootNode, Integer.parseInt(data));   //判断结点是否溢出,若溢出,则进行分裂if(addNode.num > this.btree.max) {System.out.println("加入"+Integer.parseInt(data)+"时,结点溢出"+"\t");spiltNode(this.btree, addNode);System.out.println();}}bReader.close();} catch (Exception e) {e.printStackTrace();}}

②加入新的数据,从树根开始进行查找定位

/*** 定位数据位置* @param node 查找结点* @param data 数据* @return  添加结点*/private BNode seekLocate(BNode node,int data) {int locate = 0;while(data > node.data[locate] && locate < node.num) {locate++;}if(node.childNodes[locate] != null) {return seekLocate(node.childNodes[locate], data);}else {//后移数据for(int i=node.num-1; i>=locate; i--) {node.data[i+1] = node.data[i];}node.data[locate] = data;node.num++;}return node;}

③对溢出结点进行分裂

/*** 对结点进行分裂,更新树结构* @param node 溢出的结点*/private void spiltNode(Btree bTree, BNode node) {int mid = node.num/2;   //需要上升到父结点的结点int midData = node.data[mid];BNode faNode = node.dadNode;       //取出父结点//若为空,即根结点溢出,新建根结点if(faNode == null) {System.out.print("层数加一"+"\t");faNode = new BNode(bTree, null);this.btree.rootNode = faNode;}//构建一个分裂所得的新结点,更新之前结点(数据、子结点、子节点的父结点)BNode spiNode = new BNode(bTree,faNode);spiNode.num = node.num - 1 - mid;int locate = 0;for(int i = mid+1; i<= node.num - 1; i++) {spiNode.data[locate] = node.data[i];node.data[i] = 0;spiNode.childNodes[locate] = node.childNodes[i];//防止访问内存越界if(spiNode.childNodes[locate] != null) {spiNode.childNodes[locate].dadNode = spiNode;}node.childNodes[i] = null;locate++;}//最后一个孩子spiNode.childNodes[locate] = node.childNodes[node.num];if(spiNode.childNodes[locate] != null) {spiNode.childNodes[locate].dadNode = spiNode;node.childNodes[node.num] = null;}node.num = mid;node.data[mid] = 0;//更新父结点System.out.print("并入父结点"+"\t");int i = faNode.num;//后移数据和孩子指针while(i > 0 && faNode.data[i-1] > midData) {faNode.data[i] = faNode.data[i-1];faNode.childNodes[i+1] = faNode.childNodes[i];i--;}faNode.data[i] = midData;faNode.childNodes[i] = node;faNode.childNodes[i+1] = spiNode;spiNode.dadNode = node.dadNode = faNode;faNode.num++;//若父结点溢出,则继续分裂if(faNode.num > bTree.max) {System.out.print("父结点溢出"+"\t");spiltNode(bTree, faNode);}}
将三个函数合并进行测试
public static void main(String[] args) {B_Tree myTree = new B_Tree();myTree.creBTree("Test/B_Tree.txt", 3);}
结果


过程:

B-Tree及其建立过程相关推荐

  1. 图解HTTPS建立过程

    阅读目录 准备工作(对应图中prepare1234) 发起链接 最后 关于网络安全加密的介绍可以看之前文章: 1. 网络安全--数据的加密与签名,RSA介绍 2. Base64编码.MD5.SHA1- ...

  2. TLS就是SSL的升级版+网络安全——一图看懂HTTPS建立过程——本质上就是引入第三方监管,web服务器需要先生成公钥和私钥,去CA申请,https通信时候浏览器会去CA校验CA证书的有效性...

    起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL是基于 ...

  3. eigrp ospf 邻居建立过程比较

    EIGRP邻居建立过程 1.路由器A启动,然后在链路上发送hello包 2.路由器B接收到A发来的hello包,然后做出应答,发回update包给A,告诉A它自己的路由表的信息.但是这个时候 邻居关系 ...

  4. tcp/ip 建立过程

    1. tcp /ip : 在osi网络参考模型中,它提供着可靠的传输服务/        定义:传输控制协议 a:  tcp/ip 的建立过程,通过三次握手,和四次挥手来完成.  2. 何为三次握手? ...

  5. DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现

    DL之GRU:GRU算法相关论文.建立过程(基于TF).相关思路配图集合.TF代码实现 目录 GRU算法相关论文 GRU算法建立过程(基于TF) GRU算法的TF代码实现 GRU算法相关论文 GRU是 ...

  6. srs代码学习(1)--listen建立过程

    srs的服务侦听的建立过程. 以rtmp服务为例 srs服务侦听的建立依靠从上到下的三个类.分别是 SrsServer SrsStreamListener SrsTcpListener 端口侦听过程为 ...

  7. 深度学习模型建立过程_所有深度学习都是统计模型的建立

    深度学习模型建立过程 Deep learning is often used to make predictions for data driven analysis. But what are th ...

  8. sendmail邮件服务器的基本建立过程

    邮件服务器的基本建立过程(sendmail) 第一章  邮件传送的基本理论 一.专用名词解释: 1.MUA:邮件用户代理,主要是收存在邮件服务器的电子邮件,和编写浏览电子邮件.如:outlook , ...

  9. PCM data flow - 6 - 声卡和PCM设备的建立过程

    前面几章分析了Codec.Platform.Machine驱动的组成部分及其注册过程,这三者都是物理设备相关的,大家应该对音频物理链路有了一定的认知.接着分析音频驱动的中间层,由于这些并不是真正的物理 ...

最新文章

  1. 全球99家AI芯片公司,中国占15家!
  2. hdu1.3.2 Rank
  3. sql case 语句
  4. Ubuntu下的重要配置文件修改前要先备份
  5. 关于C++14:你需要知道的新特性
  6. 【Python】Jupyter Notebook的十大隐藏技巧--如何大大加速算法的迭代
  7. spring异常 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderServlet
  8. shell变一些小技巧
  9. Linux里Web应用上的截图软件——Shutter
  10. qdu-凑数题(01背包)
  11. power bi 参数_参数化Power BI报表入门
  12. #上传文件的post请求
  13. [渝粤教育] 广东-国家-开放大学 21秋期末考试大学英语210262k2
  14. miracast和乐播投屏_【当贝市场】Windows 10 Mircast投屏到电视教程
  15. RHEL 7 使用 CentOS 源安装 docker ce
  16. EXCEL,去掉1列中的重复数据的 公式方法
  17. SpringBoot集成flyway、mybatis-plus(超详细)
  18. RT-Thread实战笔记|MPU6050使用详解及DMP姿态解算
  19. oppor9桌面布局设置_oppor9添加桌面图标
  20. win7设置计算机临时用户,为什么Win7用域账号登录以后总显示为临时配置账户? 穿墙书店...

热门文章

  1. Mysql-环境配置及问题解决
  2. Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测
  3. [watchtower] 自动更新 Docker 镜像与容器
  4. 【安卓开发】Webview简单使用
  5. es6 箭头函数使用_如何使用ES6箭头功能使JavaScript易于阅读
  6. node.js ejs_如何在Node.js应用程序中使用EJS模板
  7. java final char_java基本数据类型总结 类型转换 final关键字的用法
  8. 多元线性回归matlab代码例题_多元线性回归matlab程序
  9. 利用Python多进程执行,加快MySQL批量添加数据的执行速度
  10. 同步的概念(python 版)