B-树主要为了在外存上维护大量数据, 减少IO操作. 其中的内存操作与磁盘操作相比可以忽略。 t取值一般较大, 在50-2000之间。
相比于一般的二叉树红黑树等, B-树的深度低很多;
一般磁盘中的一页或者虚拟内存的一页为整个节点的最大大小。
有一点迷惑的是, 如何在B-树中记录磁盘地址呢? 比如某内节点有50个关键字,51个孩子; 孩子地址如何用磁盘地址表述呢?
算法中特别值得注意的一点:
为了防止在满节点上插入,导致分裂; 如果此时父节点也是满的, 需要回溯分裂父节点
为了防止在最低保障的节点上删除, 导致需要合并; 如果此时父节点也是最低保障, 导致父节点也需要回溯的合并
为了避免这些情况:
在插入时, 在向下的递归插入路径上, 只要遇到满节点, 就分裂
在删除时, 在向下的递归删除路径上, 只要遇到最低关键字个数保障节点, 就合并。【或者换到其兄弟节点上进行删除; 当自己与兄弟节点都是最低保障时,就合并】
从算法中可以看出:
节点的插入, 肯定是插入到叶节点中
节点的删除, 也可以认为是在叶节点上删除。 (如果在内节点中找到需要删除的k, 就使用相邻孩子节点的值k' 替换k, 然后递归的在孩子节点中删除k' )