公司网站自己创建凡科快速建站

web/2025/9/27 0:52:26/文章来源:
公司网站自己创建,凡科快速建站,汝南专业网站建设,淮北市建市这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前#xff0c;我们回顾一下我们学的树。 首先是二叉树#xff0c;这个不用多说#xff…这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前我们回顾一下我们学的树。 首先是二叉树这个不用多说然后为了查找的效率我们提出了搜索二叉树或者称为二叉搜索树就是节点类加个key值然后左边小右边大的那个。然后为了避免极端情况的出现就是二叉搜索树节点集中在一侧的情况我们提出了平衡二叉树就是带自旋的可以左旋或者右旋的高度差小于1的那种平衡二叉树里面有AVL树和红黑树两种实现方式注意平衡二叉树是在二叉搜索树的基础上提出的所以平衡二叉树也叫平衡二叉搜索树。 下面介绍一下B树。 B-树是一种自平衡的多路查找树注意 B树就是B-树-是个连字符号不是减号 。 在大多数的平衡查找树Self-balancing search trees)比如 AVL树 和红黑树都假设所有的数据放在主存当中。那为什么要使用 B-树呢或者说为啥要有 B-树呢要解释清楚这一点我们假设我们的数据量达到了亿级别主存当中根本存储不下我们只能以块的形式从磁盘读取数据与主存的访问时间相比磁盘的 I/O 操作相当耗时而提出 B-树的主要目的就是减少磁盘的 I/O 操作。 大多数平衡树的操作查找、插入、删除最大值、最小值等等需要 O(ℎ)次磁盘访问操作其中 ℎ 是树的高度。但是对于 B-树 而言树的高度将不再是log(n)n为数中节点的个数而是一个我们可控的高度 ℎ 通过调整 B-树中结点所包含的键【你也可以叫做数据库中的索引本质上就是在磁盘上的一个位置信息】的数目使得 B-树的高度保持一个较小的值。一般而言B-树的结点所包含的键的数目和磁盘块大小一样从数个到数千个不等。由于B-树的高度 h 可控一般远小于log(n)所以与 AVL 树和红黑树相比B-树的磁盘访问时间将极大地降低。 我们之前谈过红黑树与AVL树相比较红黑树更好一些这里我们将红黑树与B-树进行比较并以一个例子对上面一段的内容进行解释。 假设我们现在有 838,8608 条记录对于红黑树而言树的高度 ℎlog⁡(838,8608)23 也就是说树的高度为23也就是说如果要查找到叶子结点需要 23 次磁盘 I/O 操作但是 B-树情况就不同了假设每一个结点可以包含 8 个键当然真实情况下没有这么平均有的结点包含的键可能比8多一些有些比 8 少一些那么整颗树的高度将最多 8 log8⁡(838,8608)7.8 ) 层也就意味着磁盘查找一个叶子结点上的键的磁盘访问时间只有 8 次这就是 B-树提出来的原因所在。 1.2、B树的特点 下面讲一下B树的特点 在讲B树的特点之前我们先来了解几个概念 度degree 指树中节点的孩子数 阶order 指所有节点中孩子数最大值 B树的特点 每个节点最多有m个孩子其中m称为B-树的阶孩子数目的上限除根节点和叶子节点外其他节点至少有 ceil(m/2) 阶数除以2向上取整个孩子就是说B树中节点最大有m个孩子即阶个孩子至少有 m/2向上取整 个孩子孩子数目的下限若根节点不是叶子节点则至少有两个孩子根节点孩子数的下限所有叶子节点都在同一层B树是否平衡的前提条件每个非叶子节点由 n 个关键字就是n个关键值参考二叉搜索树中的关键值和 n1 个指针就是n1个孩子组成其中 ceil(m/2)-1 n m-1关键字按非降序排列就是升序排列和二叉树搜索相同即节点中的第 i 个关键字大于等于第 i-1 个关键字指针P[ i ] 指向关键字值位于第 i 个关键字和第 i1 个关键字之间的子树 这些特性都要理解。看一下一个B树的实例 2.B树的节点类 下面我们来看一下B树的具体实现吧 package Tree;import java.util.Arrays;public class L5_BTree {//B数的节点类static class Node{int[] keys; //关键字即关键值排序用的Node[] children; //孩子存孩子用的节点类数组int keyNumber; //有效关键字数目就是真正存了几个关键字boolean leaf true; //是否是叶子节点int t; //最小度数最小孩子数//构造函数public Node(int t) { // t 2this.t t;//手动设置最小孩子数this.children new Node[2 * t];//最大孩子数是最小孩子数的二倍this.keys new int[2 * t -1];//关键字的最大数量 是 最大孩子数-1}Overridepublic String toString() {return Arrays.toString(Arrays.copyOfRange(keys,0,keyNumber));}//多路查找就是我给你一个关键值你返回这个关键值对应的节点Node get(int key){int i 0; //设置个变量i方便用来循环遍历while (i keyNumber){ //节点中有关键字if (keys[i] key){ //如果节点中的关键字 等于 我给出的关键字那就返回这个关键字对应的节点return this;}if (keys[i] key){ //如果关键字中的最小值都比给出的大那就直接退出这个节点的循环了break;}i; //变量i自增}//执行到这里就是说当前节点的关键字一定比给出的大或者说超出索引了即keys[i]key 或 i keyNumberif (leaf){ //如果是叶子节点那就肯定没有孩子了return null;}//这种情况就是 i keyNumber 了就找这个节点所对应的孩子了孩子数比节点关键值数多1return children[i].get(key);}//写一个方法向 keys 指定索引 index 处插入 keyvoid insertKey(int key, int index){for (int i keyNumber-1; i index ; i--) {keys[i1] keys[i];}keys[index] key;keyNumber;}//写一个方法向 children 指定索引 index 处插入 childvoid insertChild(Node child, int index){System.arraycopy(children,index,children,index1,keyNumber);children[index] child;}//移除指定index处的keyint removeKey(int index){int t keys[index];System.arraycopy(keys,index1,keys,index,--keyNumber-index);return t;}//移除最左边的keyint removeLeftmostKey(){return removeKey(0);}//移除最右边的keyint removeRightmostKey(){return removeKey(keyNumber-1);}//移除指定index处的childNode removeChild(int index){Node node children[index];children[index] null;return children[index];}//移除最左边的childNode removeLeftmostChild(){return removeChild(0);}//移除最右边的childNode removeRightmostChild(){return removeChild(keyNumber);}//返回index孩子处左边的兄弟Node childLeftSibling(int index){return index 0 ? children[index-1]:null;}//返回index孩子处右边的兄弟Node childRightSibling(int index){return index keyNumber ? null : children[index1];}//复制当前节点的所有key和child到targetvoid moveToTarget(Node target){int start target.keyNumber;if (!leaf){for (int i 0; i keyNumber; i) {target.children[starti] children[i];}}for (int i 0; i keyNumber; i) {target.keys[target.keyNumber] keys[i];}}}Node root; //定义一个根节点int t; //树中节点的最小度数就是一个节点的最小孩子数根节点叶子节点除外final int MIN_KEY_NUMBER;//最小关键字的数量final int MAX_KEY_NUMBER;//最大关键字的数量//无参构造最小度数默认值为2public L5_BTree() {this(2);}//有参构造public L5_BTree(int t) {this.t t;root new Node(t);//new出根节点并给出根节点最小度数MIN_KEY_NUMBER t-1;MAX_KEY_NUMBER 2*t-1;}//判断关键字中是否存在指定关键字对应的节点public boolean contains(int key){return root.get(key) ! null;}//新增一个关键字/**描述一下流程吧* 你构造一颗B树给定了最小度数那么最小关键字数、最大关键字数、阶数也就都定了* 你开始往节点中插入关键值一开始没满你继续插入* 当插入的关键字数等于最大关键字数时这个节点就要分裂了即将自身的关键字分出去变为孩子节点* 然后你再插入它就会按照关键字的顺序去选位置* 如果找到位置了是叶子节点那么就直接插入当然超过MAX_KEY_NUMBER就分裂一下* 如果恰好发现一个非叶子节点里面也有位置那么应该先搜索一下这个节点的孩子然后再进行判断插在哪里* 当某个节点的关键字数再满那这个树就再分裂一次* */public void put(int key){doPut(root,key,null,0);}//递归的函数private void doPut(Node node,int key,Node parent,int index){int i 0;while (i node.keyNumber){if (node.keys[i] key){return; //更新逻辑}if (node.keys[i] key){break; //找到插入位置记为i}i;}if (node.leaf){node.insertKey(key,i);//可能到达上限}else {doPut(node.children[i],key,node,i);//可能到达上限}if (node.keyNumber MAX_KEY_NUMBER){split(node,parent,index);}}//分裂函数/*** left要分裂的节点* parent分裂节点的父节点* index分裂节点是第几个孩子* */private void split(Node left, Node parent, int index){if (parent null){//分裂的是根节点Node newRoot new Node(t);newRoot.leaf false;newRoot.insertChild(left,0);this.root newRoot;parent newRoot;}//1.创建right节点把left中t之后的key和child移动过去Node right new Node(t);right.leaf left.leaf;System.arraycopy(left.keys,t,right.keys,0,t-1);//分裂节点是非叶子节点的情况if (!left.leaf){System.arraycopy(left.children,t,right.children,0,t);}right.keyNumber t-1;left.keyNumber t-1;//2.中间的keyt-1处插入到父节点中int mid left.keys[t-1];parent.insertKey(mid,index);//3.right节点作为父节点的孩子parent.insertChild(right,index1);}//删除一个关键字public void remove(int key){doRemove(null,root,0,key);}private void doRemove(Node parent,Node node,int index,int key){int i 0;while (i node.keyNumber){if (node.keys[i] key){break;}i;}//找到了代表待删除key的索引//没找到表示到第 i 个孩子里面继续查找if (node.leaf){if(!found(node, key, i)){//case1return;}else {//case2node.removeKey(i);}}else {if(!found(node, key, i)){//case3doRemove(node,node.children[i],i,key);}else {//case4Node s node.children[i1];while (!s.leaf){s s.children[0];}int skey s.keys[0];node.keys[i] skey;doRemove(node,node.children[i1],i1,skey);}}if (node.keyNumber MIN_KEY_NUMBER){//调整平衡 case5 and case6balance(parent,node,index);}}private void balance(Node parent, Node x, int i){//case6 根节点if (x root){if (root.keyNumber 0 root.children[0] ! null){root root.children[0];}return;}Node left parent.childLeftSibling(i);Node right parent.childRightSibling(i);if (left ! null left.keyNumber MAX_KEY_NUMBER){//case5-1 左边富裕 右旋//把父节点中前驱key旋转下来x.insertKey(parent.keys[i-1],0);if (!left.leaf){//left中最大的孩子换爹x.insertChild(left.removeRightmostChild(),0);}//left中最大的key旋转上去parent.keys[i-1] left.removeRightmostKey();return;}if (right ! null right.keyNumber MAX_KEY_NUMBER){//case5-2 右边富裕 左旋//把父节点中后继key旋转下来x.insertKey(parent.keys[i],x.keyNumber);//right中最小的孩子换爹if (!right.leaf){x.insertChild(right.removeLeftmostChild(),x.keyNumber1);}//right中最小的key旋转上去parent.keys[i] right.removeLeftmostKey();return;}//case5-3 两边都不富裕 向左合并if(left ! null){//向左兄弟合并parent.removeChild(i);left.insertKey( parent.removeKey(i-1), left.keyNumber);x.moveToTarget(left);}else {//自己合并parent.removeChild(i1);x.insertKey(parent.removeKey(i),x.keyNumber );right.moveToTarget(x);}}private boolean found(Node node, int key, int i) {return i node.keyNumber node.keys[i] key;}}为了对应代码中插入和删除的逻辑思路下面给出两张图来看一下。 节点中插入key值后的节点分裂展示图 在节点中删除key的6种情况展示图删除的是某个节点的key 3.小结 说实话我感觉这东西挺难的写完之后脑瓜子都嗡嗡的。没有在纸上画图单靠脑子想我是肯定写不出来的所以我的建议是一定一定一定要画图一定一定一定要看着图对着代码来一步一步的走一定一定一定要看图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站付费推广有哪些wordpress space

!!!注意!!! 看本篇之前,一定要先看笔者上一篇的LPA*讲解,笔者统一了符号看起来过渡会更加好理解! 到目前为止,我们学习了广度优先搜索Dijkstra算法、能够计…

网站后台传不了图片中山精品网站建设案例

这个专题学习了两种算法 1.稳定婚姻匹配问题 2.最大团问题 稳定婚姻匹配问题: 1.Stable Match 关于信号站匹配 多了一个容量的权值 如果距离相同看容量大小 数据处理较麻烦! 2.marriage 稳定婚姻匹配问题入门题 3.The Stable Marriage problem 和入门题…

静态购物网站模版图片高清处理在线

1、定义 多元有序逻辑回归用于分析有序分类因变量与一个或多个自变量之间的关系。有序逻辑回归适用于因变量具有自然排序但没有固定间距的类别,例如疾病严重程度(轻度、中度、重度)或调查问卷中的满意度评分(非常不满意、不满意、…

网站建设成立领导小组创意网店店铺名字大全

我们经常会遇到表被锁的情况,这可能会严重影响数据库的性能和可用性。我将与大家分享如何识别、分析和解决这些问题,以及如何使用特定的 SQL 查询来执行解锁操作。 了解表锁的原因 首先,让我们来了解一下导致表被锁的常见原因。长时间运行的…

优化网站排名软件织梦网站wap

文章目录 Rosenblatt感知器基础收敛算法算法概述算法步骤关键点说明总结 C实现要点代码 参考文献 Rosenblatt感知器 基础 感知器,也可翻译为感知机,是一种人工神经网络。它可以被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类…

wordpress企业站被黑网站活动专题页面设计

在Python项目中,通常会有一个名为 requirements.txt 的文件,其中列出了项目所需的所有依赖包及其版本。 1. 使用freeze 如果你的项目中没有 requirements.txt 文件,你可以通过下面的命令创建一个当前项目所在环境下已安装的包及其版本的 re…

小学网站aspwordpress 2.9.1漏洞

文章目录 Selenium Java环境搭建配置系统环境变量PATH验证环境是否搭建成功常见问题&解决办法 Selenium Java环境搭建 Java版本最低要求为8,这里默认大家都下载好了Java。😆 下载chrome浏览器(点我下载) 观察chrome版本。…

金融网站设计欣赏关键词推广优化

1.什么是gcc \qquadgcc是linux中的一款编译源代码的文本编译器 2.编译过程 \qquad比如对hello.c文件进行编译, \qquad首先,预处理器cpp对hello.c进行处理,cpp会把头文件展开,宏替换,注释去掉,经过cpp处理后…

现在还可以做夺宝网站wordpress 悬浮网易云

日志作为快速定位程序问题的主要手段,日志几乎是所有程序都必须拥有的一部分,下面我们就看下怎么使用log4net.dll文件: 1.下载log4net.dll文件 2.创建自己的项目 3.在自己项目下的引用log4net.dll文件 4.在app.config配置文件里添加配置信息&…

医疗网站女性专题网页设计模板加强网站内容建设

《超越C标准库Boost库导论》不仅介绍了Boost库的功能、使用方法及注意事项,而且还深入讨论了Boost库的设计理念、解决问题的思想和技巧以及待处理的问题。因此,本书是一本了解Boost库并探索其机理的实用手册。 百度云及其他网盘下载地址:点我…

深圳网络工程公司搜索引擎优化的目的是对用户友好

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 版权声明:本文为博主原创文章,未经博主允许不得转载。 https:blog.csdn.netu0121626…

衡阳做淘宝网站建设河南做网站公司哪家专业

来源:EETOP本文是当代物理学大师杨振宁教授1997年1月17日在香港中华科学与社会协进会与香港中文大学主办的演讲会上的演讲词,讲题原为“科学工作有没有风格”。转载于香港《二十一世纪》杂志1997 年 4 月号,总第40期;也收入杨振宁…

网站标题的选择大专毕业设计模板范文

因为WeBASE是基于Java开发的,故依赖于Java运行环境,支持版本JDK 8至JDK 14。 我们安装JDK 8。在Linux终端中,使用如下命令安装开源版本JDK 8 apt update apt install -y openjdk-8-jdk 安装JDK8后,需要设置JAVA_HOME环境变量&am…

怎么看网站被惩罚软件开发工具链

问题描述 对Android操作系统进行一些修改后,例如: service相关 servicerc文件xml文件 lib相关 so动态库 等等,有可能导致一直卡在开机界面 问题原因 未知的原因 问题解决 有几种可以观察到现象的方案: 1. 音量上电源键 …

永嘉哪里有做网站如何免费建设网站com

<!--事件的基本使用&#xff1a;1. 使用 v-on:xxx 或 xxx 绑定事件&#xff0c;其中 xxx 是事件名2. 事件的回调需要配置在 methods 对象中&#xff0c;最终会在 vm 上3. methods 中配置的函数&#xff0c;不要用箭头函数&#xff01;否则 this 就不是 vm 了4. methods 中配…

seo网站推广培训wordpress自定义分类分页

&#xfeff;&#xfeff;显卡Video card&#xff0c;Graphics card&#xff0c;又叫显示接口卡&#xff0c;是一个硬件概念&#xff08;相似的还有网卡&#xff09;&#xff0c;执行计算机到显示设备的数模信号转换任务&#xff0c;安装在计算机的主板上&#xff0c;将计算机的…

无锡微信网站建设价格北京建设工程网

ESP8266具有内置的10位ADC&#xff0c;只有一个ADC通道(A0引脚)&#xff0c;即只有一个ADC输入引脚可读取来自外部器件的模拟电压 ESP8266上的ADC通道和芯片供电电压复用&#xff0c;也就是说我们可以将其设置为测量系统电压或者外部电压 测量外部电压&#xff1a; analogRead(…

自贡网站建设flask网站开发视频

思维导图&#xff1a; 一&#xff0c;缺省参数 如何理解缺省参数呢&#xff1f;简单来说&#xff0c;缺省参数就是一个会找备胎的参数&#xff01;为什么这样子说呢&#xff1f;来看一个缺省参数就知道了&#xff01;代码如下&#xff1a; #include<iostream> using std…

品牌营销型网站建设公司网站建设和程序开发哪个好

论文笔记整理&#xff1a;柏超宇&#xff0c;东南大学硕士。文章链接&#xff1a;https://arxiv.org/pdf/2011.01565.pdf来源&#xff1a;EMNLP 2020动机社交媒体每天都会产生大量的内容。为了帮助用户快速捕捉所需内容&#xff0c;关键词预测受到越来越多的关注。尽管如此&…

网站建设找客户渠道咋制作网站

风过无痕 原文 arcengine,深入理解游标Cursors&#xff0c;实现数据的快速查找&#xff0c;插入&#xff0c;删除&#xff0c;更新 深入理解游标Cursors&#xff0c;实现数据的快速查找&#xff0c;插入&#xff0c;删除&#xff0c;更新 1、查找数据Search Cursors //by yl …