B-树

B-树的性质

1 空树

2 根节点至少有一个关键字

3 非根的节点的关键字个数是[t-1, 2t-1];

4 由插入过程保证了根和叶节点最多2t-1个关键字;

5 内部节点的孩子个数为 nx + 1, 取值区间就是[t, 2t]

 

 

B-树节点包含如下域:

n[x]  关键字个数

具体n[x]个关键字,非降次序排序

leaf[x], 该节点是否为叶子节点

 

查询时,从根节点一直向下即可 

插入过程中因为可能在满孩子的节点上插入, 需要对节点进行分裂;

删除过程中因为可能在极限小孩子节点上删除, 所以可能需要对节点进行合并。

 

B-树的查找操作:在B-树x中,查找k 

 

B-树节点分裂

 

B-树的插入操作

NOTE:插入时,只会在也节点上进行插入操作

 

B-树的删除k:

1 如果在叶节点中找到, 直接删除

2 如果在内节点x中找到,假设为第i个关键字, 则看x.c[i]的关键字个数是否>=t;

2.1 是, 则使用x.c[i]中的k' 代替x中的第i个关键词k; 然后在x.c[i]中递归的调用删除k'操作; 

2.2 否, 则判断x.c[i+1].nx>=t, 是则在x.c[i+1]中进行同样操作;

2.3 否则x.c[i], x.c[i+1]的关键字个数都小于t, 则把x中的x.c[i], x.c[i+1], k合并为一个节点z, 然后回到步骤2递归的再z中删除k。

3 如果内节点x中无k, 则必定要到x的某个孩子节点x.c[i]中继续查找;

3.1 如果x.c[i]只有t-1个关键字,若x.c[i]的兄弟节点有>t-1个关键字, 则把x.key[i]移到x.c[i]中,把x.c[i]的兄弟节点中移出一个关键字到x中; 然后回到步骤2继续查找

3.2 若x.c[i]>t-1个关键字, 则回到2继续再x.c[i]中查找

3.3 若x.c[i]只有t-1个关键字,x.c[i]的兄弟也只有t-1个关键字, 则合并x.c[i]与其兄弟, 然后递归的再合并后的节点中到步骤2查找

 

当要删除时, 必须保证该节点的孩子个数>=t, 比B-树的性质[t-1,2t-1]个孩子的最低个数要大, 就是为了避免再删除一个值后导致内节点不满足该性质而再次向上回溯

 

 

 

 

疑惑:

按照步骤2.3, 当再内节点中找到时,x的关键字可能会减少1。

步骤2.3中,如何保证x合并了之后变成的节点z,满足[t-1,2t-1]个关键字的性质呢 【书上解释说, 这是由算法的结构保证的:保证x中至少有t个关键字】

步骤3中,保证x.c[i]的关键字个数>=t, 从逻辑的正确性上看是多余的吗?
很有迷惑性, 并不是多余的; 这个保证了【至少有t个关键字】中的性质。

但是初始时, 如何保证【至少有t个关键字】的性质呢? (最后的答案就是初始状态步骤2.3不需保证这个性质, 因为初始就能到达2.3则必定在根节点中找到, 而根节点无需满足什么性质)

 

 

 

--------------------------------------------------------

如下理解:
程序起始时, 若从步骤1退出, 则根本无需合并节点致使可能不满足[t-1,2t-1]的性质
若先走了步骤3,自然就满足了“至少为t个关键字”的性质
若先走了步骤2:则必定是在根节点中找到了k; 但是根节点无需满足[t-1,2t-1]的性质。 根节点最少只需要一个关键字。 当恰好根节点只有一个关键字且走到2.3,算法结束后,根节点包含的关键字个数可能为0, 因此在算法末尾判断根节点包含的关键字个数是否为0且为叶子节点, 是则为空树, 否则调整一下根节点位置即可
[e04]

 同理, 当从步骤1删除退出时, 也必定满足【至少有t个关键字】不会导致破坏性质[t-1,2t-1]

 

理解应该是对的, 但书上没有相关说明和解释 :(

 

B-树的性质很拗口

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值