1.内存与磁盘
内存快,磁盘慢(寻址慢)
内存断电后数据消失,磁盘持久存久
正因为磁盘的寻址慢,那么红黑树由于寻址的次数过多,所以不适合
B/B+树降低层高,加快寻址
一个块4K(linux默认),Btree有1024叉,4G的内存空间两次寻址就能找到
2.B-树的性质
一颗M阶B树T,满足以下条件
1. 每个结点至多拥有M棵子树
2. 根结点至少拥有两颗子树
3. 除了根结点以外,其余每个分支结点至少拥有M/2课子树
4. 所有的叶结点都在同一层上
5. 有k棵子树的分支结点则存在k-1个关键字,关键字按照递增顺序进行排序
6. 关键字数量满足ceil(M/2)-1 <= n <= M-1
3.B-树数据结构定义
typedef int KEY_VALUE;
struct btree_node{
KEY_VALUE *keys;
//指针的数组而不是二维数组
struct btree_node **childrens;//malloc 好处在于sizeof不会特别大
int num;
bool isleaf;//是否叶子节点
//事实上int和bool是一样的,因为边界对齐
};
struct btree{
struct btree_node *root;
};
4.B-树的分裂
添加超过上限的节点时,两种情况
a.只有根节点时,一分三
b.其他情况一分二(小技巧是选偶数的M便于分裂,将中间的直接提上去就好了)
5.B树添加
两个步骤,1.找到对应的节点2.对节点的key进行对比,找到合适的位置
插入的位置是叶子节点
6.B树删除
1.idx子树数量== ceil(m-2)-1,[idx - 1],[idx + 1]
A.借位
a.从idx-1借位
b.从idx+1借位(哪个大于ceil(m/2) -1借哪个)
B.合并
2.大于最小限度直接删除即可
步骤:第一步:找到对应的子树,第二步:按照上述方法调整