第十五周项目三~~B-树的基本操作

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法) 本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。 阅读详情
/*问题及代码 
 *Copyright(c)2016,烟台大学计算机学院 
 *All right reserved. 
 *文件名称:B-树的基本操作.cpp 
 *作者:李玲 
 *时间:12月07日 
 *版本号;v1.0 
 *问题描述: 
          
  实现B-树的基本操作。基于序列{4, 9, 0, 1, 8, 6, 3, 5, 2, 7}完成测试。  
  (1)创建对应的3阶B-树b,用括号法输出b树。  
  (2)从b中分别删除关键字为8和1的节点,用括号法输出删除节点后的b树。  
 *输入描述:待整理的序列 
 *程序输出:根据题目要求输出。 
*/  

问题代码:

#include <stdio.h>  
#include <malloc.h>  
#define MAXM 10                     //定义B-树的最大的阶数  
typedef int KeyType;                //KeyType为关键字类型  
typedef struct node                 //B-树结点类型定义  
{  
    int keynum;                     //结点当前拥有的关键字的个数  
    KeyType key[MAXM];              //key[1..keynum]存放关键字,key[0]不用  
    struct node *parent;            //双亲结点指针  
    struct node *ptr[MAXM];         //孩子结点指针数组ptr[0..keynum]  
} BTNode;  
typedef struct                      //B-树的查找结果类型  
{  
    BTNode *pt;                     //指向找到的结点  
    int i;                          //1..m,在结点中的关键字序号  
    int tag;                        //1:查找成功,O:查找失败  
}  Result;  
int m;                              //m阶B-树,为全局变量  
int Max;                            //m阶B-树中每个结点的至多关键字个数,Max=m-1  
int Min;                            //m阶B-树中非叶子结点的至少关键字个数,Min=(m-1)/2  
int Search(BTNode *p,KeyType k)  
{  
    //在p->key[1..keynum]中查找i,使得p->key[i]<=k<p->key[i+1]  
    int i=0;  
    for(i=0; i<p->keynum && p->key[i+1]<=k; i++);  
    return i;  
}  
Result SearchBTree(BTNode *t,KeyType k)  
{  
    /*在m阶t树t上查找关键字k,返回结果(pt,i,tag)。若查找成功,则特征值 
     tag=1,指针pt所指结点中第i个关键字等于k;否则特征值tag=0,等于k的 
     关键字应插入在指针Pt所指结点中第i和第i+1个关键字之间*/  
    BTNode *p=t,*q=NULL; //初始化,p指向待查结点,q指向p的双亲  
    int found=0,i=0;  
    Result r;  
    while (p!=NULL && found==0)  
    {  
        i=Search(p,k);              //在p->key[1..keynum]中查找i,使得p->key[i]<=k<p->key[i+1]  
        if (i>0 && p->key[i]==k)    //找到待查关键字  
            found=1;  
        else  
        {  
            q=p;  
            p=p->ptr[i];  
        }  
    }  
    r.i=i;  
    if (found==1)                   //查找成功  
    {  
        r.pt=p;  
        r.tag=1;  
    }  
    else                            //查找不成功,返回K的插入位置信息  
    {  
        r.pt=q;  
        r.tag=0;  
    }  
    return r;                       //返回k的位置(或插入位置)  
}  
void Insert(BTNode *&q,int i,KeyType x,BTNode *ap)  
{  
    //将x和ap分别插入到q->key[i+1]和q->ptr[i+1]中  
    int j;  
    for(j=q->keynum; j>i; j--)  //空出一个位置  
    {  
        q->key[j+1]=q->key[j];  
        q->ptr[j+1]=q->ptr[j];  
    }  
    q->key[i+1]=x;  
    q->ptr[i+1]=ap;  
    if (ap!=NULL) ap->parent=q;  
    q->keynum++;  
}  
void Split(BTNode *&q,BTNode *&ap)  
{  
    //将结点q分裂成两个结点,前一半保留,后一半移入新生结点ap  
    int i,s=(m+1)/2;  
    ap=(BTNode *)malloc(sizeof(BTNode));    //生成新结点*ap  
    ap->ptr[0]=q->ptr[s];                   //后一半移入ap  
    for (i=s+1; i<=m; i++)  
    {  
        ap->key[i-s]=q->key[i];  
        ap->ptr[i-s]=q->ptr[i];  
        if (ap->ptr[i-s]!=NULL)  
            ap->ptr[i-s]->parent=ap;  
    }  
    ap->keynum=q->keynum-s;  
    ap->parent=q->parent;  
    for (i=0; i<=q->keynum-s; i++) //修改指向双亲结点的指针  
        if (ap->ptr[i]!=NULL) ap->ptr[i]->parent = ap;  
    q->keynum=s-1;                      //q的前一半保留,修改keynum  
}  
void NewRoot(BTNode *&t,BTNode *p,KeyType x,BTNode *ap)  
{  
    //生成含信息(T,x,ap)的新的根结点*t,原t和ap为子树指针  
    t=(BTNode *)malloc(sizeof(BTNode));  
    t->keynum=1;  
    t->ptr[0]=p;  
    t->ptr[1]=ap;  
    t->key[1]=x;  
    if (p!=NULL) p->parent=t;  
    if (ap!=NULL) ap->parent=t;  
    t->parent=NULL;  
}  
void InsertBTree(BTNode *&t, KeyType k, BTNode *q, int i)  
{  
    /*在m阶t树t上结点*q的key[i]与key[i+1]之间插入关键字k。若引起 
     结点过大,则沿双亲链进行必要的结点分裂调整,使t仍是m阶t树。*/  
    BTNode *ap;  
    int finished,needNewRoot,s;  
    KeyType x;  
    if (q==NULL)                        //t是空树(参数q初值为NULL)  
        NewRoot(t,NULL,k,NULL);         //生成仅含关键字k的根结点*t  
    else  
    {  
        x=k;  
        ap=NULL;  
        finished=needNewRoot=0;  
        while (needNewRoot==0 && finished==0)  
        {  
            Insert(q,i,x,ap);               //将x和ap分别插入到q->key[i+1]和q->ptr[i+1]  
            if (q->keynum<=Max) finished=1; //插入完成  
            else  
            {  
                //分裂结点*q,将q->key[s+1..m],q->ptr[s..m]和q->recptr[s+1..m]移入新结点*ap  
                s=(m+1)/2;  
                Split(q,ap);  
                x=q->key[s];  
                if (q->parent)              //在双亲结点*q中查找x的插入位置  
                {  
                    q=q->parent;  
                    i=Search(q, x);  
                }  
                else needNewRoot=1;  
            }  
        }  
        if (needNewRoot==1)                 //根结点已分裂为结点*q和*ap  
            NewRoot(t,q,x,ap);              //生成新根结点*t,q和ap为子树指针  
    }  
}  
void DispBTree(BTNode *t)   //以括号表示法输出B-树  
{  
    int i;  
    if (t!=NULL)  
    {  
        printf("[");            //输出当前结点关键字  
        for (i=1; i<t->keynum; i++)  
            printf("%d ",t->key[i]);  
        printf("%d",t->key[i]);  
        printf("]");  
        if (t->keynum>0)  
        {  
            if (t->ptr[0]!=0) printf("(");  //至少有一个子树时输出"("号  
            for (i=0; i<t->keynum; i++)     //对每个子树进行递归调用  
            {  
                DispBTree(t->ptr[i]);  
                if (t->ptr[i+1]!=NULL) printf(",");  
            }  
            DispBTree(t->ptr[t->keynum]);  
            if (t->ptr[0]!=0) printf(")");  //至少有一个子树时输出")"号  
        }  
    }  
}  
void Remove(BTNode *p,int i)  
//从*p结点删除key[i]和它的孩子指针ptr[i]  
{  
    int j;  
    for (j=i+1; j<=p->keynum; j++)      //前移删除key[i]和ptr[i]  
    {  
        p->key[j-1]=p->key[j];  
        p->ptr[j-1]=p->ptr[j];  
    }  
    p->keynum--;  
}  
void Successor(BTNode *p,int i)  
//查找被删关键字p->key[i](在非叶子结点中)的替代叶子结点  
{  
    BTNode *q;  
    for (q=p->ptr[i]; q->ptr[0]!=NULL; q=q->ptr[0]);  
    p->key[i]=q->key[1];    //复制关键字值  
}  
void MoveRight(BTNode *p,int i)  
//把一个关键字移动到右兄弟中  
{  
    int c;  
    BTNode *t=p->ptr[i];  
    for (c=t->keynum; c>0; c--) //将右兄弟中所有关键字移动一位  
    {  
        t->key[c+1]=t->key[c];  
        t->ptr[c+1]=t->ptr[c];  
    }  
    t->ptr[1]=t->ptr[0];        //从双亲结点移动关键字到右兄弟中  
    t->keynum++;  
    t->key[1]=p->key[i];  
    t=p->ptr[i-1];              //将左兄弟中最后一个关键字移动到双亲结点中  
    p->key[i]=t->key[t->keynum];  
    p->ptr[i]->ptr[0]=t->ptr[t->keynum];  
    t->keynum--;  
}  
void MoveLeft(BTNode *p,int i)  
//把一个关键字移动到左兄弟中  
{  
    int c;  
    BTNode *t;  
    t=p->ptr[i-1];              //把双亲结点中的关键字移动到左兄弟中  
    t->keynum++;  
    t->key[t->keynum]=p->key[i];  
    t->ptr[t->keynum]=p->ptr[i]->ptr[0];  
  
    t=p->ptr[i];                //把右兄弟中的关键字移动到双亲兄弟中  
    p->key[i]=t->key[1];  
    p->ptr[0]=t->ptr[1];  
    t->keynum--;  
    for (c=1; c<=t->keynum; c++)    //将右兄弟中所有关键字移动一位  
    {  
        t->key[c]=t->key[c+1];  
        t->ptr[c]=t->ptr[c+1];  
    }  
}  
void Combine(BTNode *p,int i)  
//将三个结点合并到一个结点中  
{  
    int c;  
    BTNode *q=p->ptr[i];            //指向右结点,它将被置空和删除  
    BTNode *l=p->ptr[i-1];  
    l->keynum++;                    //l指向左结点  
    l->key[l->keynum]=p->key[i];  
    l->ptr[l->keynum]=q->ptr[0];  
    for (c=1; c<=q->keynum; c++)        //插入右结点中的所有关键字  
    {  
        l->keynum++;  
        l->key[l->keynum]=q->key[c];  
        l->ptr[l->keynum]=q->ptr[c];  
    }  
    for (c=i; c<p->keynum; c++)     //删除父结点所有的关键字  
    {  
        p->key[c]=p->key[c+1];  
        p->ptr[c]=p->ptr[c+1];  
    }  
    p->keynum--;  
    free(q);                        //释放空右结点的空间  
}  
void Restore(BTNode *p,int i)  
//关键字删除后,调整B-树,找到一个关键字将其插入到p->ptr[i]中  
{  
    if (i==0)                           //为最左边关键字的情况  
        if (p->ptr[1]->keynum>Min)  
            MoveLeft(p,1);  
        else  
            Combine(p,1);  
    else if (i==p->keynum)              //为最右边关键字的情况  
        if (p->ptr[i-1]->keynum>Min)  
            MoveRight(p,i);  
        else  
            Combine(p,i);  
    else if (p->ptr[i-1]->keynum>Min)   //为其他情况  
        MoveRight(p,i);  
    else if (p->ptr[i+1]->keynum>Min)  
        MoveLeft(p,i+1);  
    else  
        Combine(p,i);  
}  
int SearchNode(KeyType k,BTNode *p,int &i)  
//在结点p中找关键字为k的位置i,成功时返回1,否则返回0  
{  
    if (k<p->key[1])    //k小于*p结点的最小关键字时返回0  
    {  
        i=0;  
        return 0;  
    }  
    else                //在*p结点中查找  
    {  
        i=p->keynum;  
        while (k<p->key[i] && i>1)  
            i--;  
        return(k==p->key[i]);  
    }  
}  
int RecDelete(KeyType k,BTNode *p)  
//查找并删除关键字k  
{  
    int i;  
    int found;  
    if (p==NULL)  
        return 0;  
    else  
    {  
        if ((found=SearchNode(k,p,i))==1)       //查找关键字k  
        {  
            if (p->ptr[i-1]!=NULL)              //若为非叶子结点  
            {  
                Successor(p,i);                 //由其后继代替它  
                RecDelete(p->key[i],p->ptr[i]); //p->key[i]在叶子结点中  
            }  
            else  
                Remove(p,i);                    //从*p结点中位置i处删除关键字  
        }  
        else  
            found=RecDelete(k,p->ptr[i]);       //沿孩子结点递归查找并删除关键字k  
        if (p->ptr[i]!=NULL)  
            if (p->ptr[i]->keynum<Min)          //删除后关键字个数小于MIN  
                Restore(p,i);  
        return found;  
    }  
}  
void DeleteBTree(KeyType k,BTNode *&root)  
//从B-树root中删除关键字k,若在一个结点中删除指定的关键字,不再有其他关键字,则删除该结点  
{  
    BTNode *p;              //用于释放一个空的root  
    if (RecDelete(k,root)==0)  
        printf("   关键字%d不在B-树中\n",k);  
    else if (root->keynum==0)  
    {  
        p=root;  
        root=root->ptr[0];  
        free(p);  
    }  
}  
int main()  
{  
    BTNode *t=NULL;  
    Result s;  
    int j,n=10;  
    KeyType a[]= {4,9,0,1,8,6,3,5,2,7},k;  
    m=3;                                //3阶B-树  
    Max=m-1;  
    Min=(m-1)/2;  
    printf("创建一棵%d阶B-树:\n",m);  
    for (j=0; j<n; j++)                 //创建一棵3阶B-树t  
    {  
        s=SearchBTree(t,a[j]);  
        if (s.tag==0)  
            InsertBTree(t,a[j],s.pt,s.i);  
        printf("   第%d步,插入%d: ",j+1,a[j]);  
        DispBTree(t);  
        printf("\n");  
    }  
    printf("  结果B-树: ");  
    DispBTree(t);  
    printf("\n");  
    printf("删除操作:\n");  
    k=8;  
    DeleteBTree(k,t);  
    printf("  删除%d: ",k);  
    printf("B-树: ");  
    DispBTree(t);  
    printf("\n");  
    k=1;  
    DeleteBTree(k,t);  
    printf("  删除%d: ",k);  
    printf("B-树: ");  
    DispBTree(t);  
    printf("\n");  
    return 0;  
}  
运行结果:

知识点总结:

B-树的建立和删除,,最核心的就是数字各种移动的过程

学习心得:

b-树要依靠画图啊,得多画几遍


【PointNet++】使用Open3D对分割后的结果可视化 PointNet++中的局部分割网络预测后是没有可视化文件的,所以需要自己通过编写Open3D或者PCL点云算法去可视化,在本人经过查找翻阅修改后,实现了网络输出点云分割后结果的可视化。已实现推测单个点云,并可视化。 阅读详情

相关推荐

阿里云大模型ACP认证模拟考试(二)

摘要:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 2081

数据结构实践——B-树的基本操作

本文是针对[数据结构基础系列(8):查找]的实践。 【项目 - B-树的基本操作】 实现B-树的基本操作。基于序列{4, 9, 0, 1, 8, 6, 3, 5, 2, 7}完成测试。 (1)创建对应的3阶B-树b,用括号法输出b树。 (2)从b中分别删除关键字为8和1的节点,用括号法输出删除节点后的b树。 [参考解答] #...

weixin_33834628的博客 542

采用超级电容设计的UPS不间断电源,用于掉电数据保存,可续航10-60秒

关键词:树莓派 CM4 UPS 不间断电源 掉电保存 超级电容 SuperCap 充电 升压 续航 10F 法拉电容 Mcuzone 野芯科技 概述:我们经常会遇到系统意外掉电的情况,对于一些可靠性要求很高的工业现场设备或者运行过程中有重要数据需要保存的平台就需要UPS电源了。常规的UPS采用后备锂电池设计,具备无缝切换、续航时间长、稳定可靠等特点,但同时也有价格过高、体积过大的缺点。对于不少仅需在检测到系统掉电后对数据进行保存即可的应用而言,这些标准的UPS电源就不太合适,为此我...

6605

数据结构-B 树(B-树)

B 树的阶在学习 B 树之前,我们先了解一下 B 树是为了解决什么问题的吧,在我们之前学习的数据结构中,处理的数据都是在内存中操作,因此考虑的都是内存的时间复杂度,但是如果我们要操作的数据集非常大,大到内存没办法处理了怎么办?

jiu_yue_ya的博客 1258

故障诊断知识库建设指南

从数据融合到知识图谱构建,从智能推理引擎开发到动态进化机制落地,故障诊断知识库的建设路径已形成 “数据 - 知识 - 智能” 的闭环体系。随着大模型技术的深度融入,知识库将实现从 “规则驱动” 到 “认知推理” 的跨越 —— 通过自然语言理解解析复杂故障描述、多模态分析融合图像与信号数据、预测性算法推演故障发展趋势,持续提升诊断的精准度与前瞻性。

极昆仑智慧 1232

【AFAC2026金融智能-赛题二】2亿像素的面条图,我切了1000刀拼回完美Markdown

摘要: AFAC2026金融智能创新大赛的「复杂金融文档还原挑战」任务是将高分辨率金融文档截图转换为结构化Markdown文本。面对2亿像素的“面条图”和严格的计算限制(禁用主流大模型,仅允许调用FinixDoc-VL API且模型需小于10M),作者提出四层流水线解决方案: 图像预处理:通过文本行投影检测在行间隙处智能切图,避免截断文字; API调度:5路并发轮询请求,结合内容哈希缓存与指数退避重试机制优化调用效率; 后处理:采用最长公共子串匹配去除文本重叠,并设计表格对齐算法修复跨块表格; 结果输出:按

170

数据结构——B树

B树B树2阶B树3阶B树 B树 B树是平衡二叉树的一般化,拥有多于两个子树,m阶B树具有以下特性: 每个节点最多有m个子节点 如果根不是唯一节点,则至少有两个子节点 每个非叶子节点(除了根)具有至少⌈ m/2⌉子节点 具有k个子节点的非叶节点包含k -1个键 所有叶子都出现在同一水平,没有任何信息(高度一致,完美平衡) 2阶B树 3阶B树指最多有2个子节点的树,即二叉树 3阶B树 3阶B树指最多有3个子节点的树(也叫2-3树),根据以上性质可知 1<= 根节点元素个数 <= 3 2<

松仔Log的博客 3133

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

2079

输出3阶B-树的构造过程

有必要存档一下(作业)

m0_65620244的博客 1151

网规第三版:第4章网络资源设备(完结)

第 4 章 网络资源设备 调整内容: 更新主流网络设备(交换机、路由器、防火墙)的技术参数与选型标准 增加国产化网络设备与信创产品的相关内容 精简已淘汰的设备类型与技术指标

鹿鸣天涯 268

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

statistics+insight+vista+power 280

实现B-树的相关运算算法

B-tree即B树,B即Balance,平衡的意思。B-树是一种多路搜索树(并不一定是二叉的)。 当查找的文件较大,且存放在磁盘等直接存取设备中时,为了减少查找过程中对磁盘的读写次数,提高查找效率,基于直接存取设备的读写操作以"页"为单位的特征。 1970年,R.Bayer和E.M.McCreight提出了一种称之为B-树的多路平衡查找树,在文件系统中有所应用,主要用作文件的索引。它是一种平衡...

xiezhi123456的博客 2125

第14.11章 高翔博士最新开源框架Lightning-LM源码解读(十一):离线定位模块全解析,从激光匹配到位姿图优化的极致优化

本文介绍了Lightning-LM离线定位模块的技术架构与实现细节。该模块基于3D激光雷达与IMU融合,采用改进版NDT匹配算法实现高精度定位,具备动态图层更新、多源信息融合等特性。核心流程包括数据预处理、激光里程计处理、IMU预测与点云去畸变、位姿图优化等环节,通过轻量级miao库实现高效增量优化。文章详细解析了模块的代码结构、关键函数功能及数据流,为SLAM系统的开发与优化提供了实践参考。

行知SLAM 376

数据结构-(2-3树,2-3-4树,B-树,B+树)

目录 1,二叉树存在问题分析 2,多叉树B树的介绍 2.1,2-3树和2-3-4树的介绍 2.2,B树的查找 2.3,B树的创建和插入 2.4,B树的删除 3,B+树 3.1,m 阶的B+树与m阶的B树的主要差异 1,二叉树存在问题分析 虽然我们说二叉排序树,平衡二叉树的查找操作效率较高,但是也存在问题, 请看下面的二叉树。 二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题: 问题1:在构建二叉树时,需要多次进行i/

理科男同学 2856

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

一文带你入门B树和B+树

B树和B+树,其实在各大论坛平台上总会看到这两个东西。但是他们说的又有种“高手云集”的感觉 —— 他们都会,就我不会,连插嘴的功夫都没有。这篇文章就来简单的讲解一下B树和B+树,下次再遇见这种话题,也不用再尴尬窘迫了。 在解读这两个树之前呢,先解释一下 B-树 这个东西。 其实很多人不敢去了解 B树 的有关内容,为什么呢,一打听这个东西,就有什么 B-树、B树、B+树 ,3个东西!太多了!实际上不是这样。 现在打开百度百科搜索 B树 ,你就会发现,百度百科会直接跳转到 B-树 里。什么意思呢,没错,没有

qq_24251607的博客 796

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

三 B树与B+树

1、多路查找树       性质:       1、每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素       2、元素之间存在某种特定的排序关系1、2-3树每一个结点都有两个孩子(2结点)或三个孩子(3结点)定义:1)要么为空,要么:2)对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key要小,右节点也是一个2...

jyh的博客 3420

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【B树及B树的基本操作】

文章目录1.B树的定义和特性2.B树的性质3.B树创建的过程。 1.B树的定义和特性 B树是一种平衡的多路查找树。 一棵m阶的B树(B树中所有结点的孩子个数的最大值为m),或为空树,或为满足下列特性的m叉树: (1)树中每个结点至多有m棵子树,至多含有m-1个关键字; (2)若根结点不是叶子结点,则至少有两棵子树; (3)非根非叶节点至少有 ⌈m/2⌉ 棵子树,至少含有 ⌈m/2⌉-1课子树; (4)所有的非终端节点中包含下列信息数据 (5)所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外

m0_53171456的博客 3378

T:B数的表示及其基本操作的实现(C++)

习题内容: 1.掌握B树的存贮结构。 2.实现B树中关键字值的插入及删除操作。   B树的定义: B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母M表示阶数。当M取2时,就是我们常见的二叉搜索树。 一颗M阶的B树定义如下: 1)每个结点最多有M-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根...

Hodge_Z的博客 443

B树

https://www.bilibili.com/video/av36069871?from=search&seid=11071313654867248772我是根据这个视频来的。 为何要用到b树,原因是当数据量特别巨大时(操作系统的文件系统,数据库的索引),普通的搜索二叉树会导致树的深度非常的深,而b树是多路查找树,一个节点中有多个关键字(就是你需要的有效信息),这样可以减少树的深度从...

h1311454244的博客 471

B-树和B+树的应用:数据搜索和数据库索引

B-树 1 .B-树定义:有序数组+平衡多叉树 B-树是一种平衡的多路查找树,它在文件系统中很有用。 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树; ⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树; ⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A...

黄规速博客:学如逆水行舟,不进则退 8万+

图解:什么是B-树、B+树、B*树

文章目录 1.二叉搜索树 在说B树之前,我们需要先了解一下二叉搜索树 二叉搜索树,顾名思义,是用来搜索的有序树 它具有以下特点: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树。 下边这个就是一棵二叉搜索树 1.1 二叉搜索树的查找 二叉搜索树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中 否则,如果查询关键字比结点关键字小,就进入左儿子 如果比结点关键字大,就进

你好戴先生的博客 3116

【数据结构】B树的创建

B树也是一种搜索树,二叉搜索树、红黑树、都是动态查找树,典型的二叉搜索结构,查找的时间复杂度和树的高度相关O(log2N)。这些二叉搜索结构有一个共同的缺陷:数据量大,树的高度太高,增大访问磁盘的次数,从而效率低下。想要加速对数据的访问速度: 1.提高I/O的时间 2.降低树的高度——平衡多叉树B树的定义 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:

lz201788的博客 1万+

高度为5的3阶b树含有的关键字个数_B树及其基本操作(插入和删除)详解

前面介绍了二叉排序树和平衡二叉树,本节开始介绍两种用于查找功能的树数据结构——B-树和B+树。什么是B-树?B-树,有时又写为B_树(其中的“-”或者“_”只是连字符,并不读作“B减树”),一颗 m 阶的 B-树,或者本身是空树,否则必须满足以下特性:树中每个结点至多有 m 棵子树;若根结点不是叶子结点,则至少有两棵子树;除根之外的所有非终端结点至少有 ⌈m/2⌉ 棵子树;所有的非终端结...

weixin_39649478的博客 3927

3阶B-树

数据结构与算法分析——c语言描述 第四章树 B-树 好久没更新博客,这7天断断续续写B树,学汇编,学计算机组成原理。 B树好难啊,还没写完。只写了25%。。。 插入剩下两种情况没写: 1.祖父未满,父亲满,儿子满。 2.祖父满,父亲满,儿子满。 想不到怎么写。这两个情况有两种相同的地方,把父亲拆成两个。 父亲拆成两个可以这样写:像父亲未满,儿子满那样,新建一个

wwj_bupt 8788

浅谈算法和数据结构: 八 平衡查找树之2-3树

前面介绍了二叉查找树(Binary Search Tree),他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。本文及后面文章介绍的平衡查找树的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证树在插入完成之后始终保持平衡状态,这就是平衡查找树(Balanced Search Tree)。在一棵具有N 个节点的树中,我们希望该树的高...

weixin_34357928的博客 522

算法设计与分析课程记录week2

算法设计与分析课程记录week2 PS:此文章仅作为个人课程期间的学习记录 递归算法设计技术 1. 递归的概念 在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。 能够用递归解决问题的三个条件: 需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同。 递归调用的次数必须是有限的。 必须有出口来结束递归的条件来终止递归。 何时使用递归? 定义是递

qqqqqqqin的博客 298
上一篇: 第十五周项目二~~用哈希法组织关键字
下一篇: 第十六周项目二【大数据集上排序算法性能的体验】
安夏啊
博客等级 码龄10年 12粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值