zoukankan      html  css  js  c++  java
  • B类树

    B-树

    B-树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢?

    因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。

    定义

    M阶B树定义

    1. 根节点至少有两个子女
    2. 每个中间节点都包含k-1个元素和k个孩子,其中m/2<=k<=m
    3. 每个叶子节点都包含k-1元素,其中m/2<=k<=m
    4. 所有的叶子节点都位于同一层
    5. 每个节点的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划

    B-树示例

    特性

    1. 关键字集合分布在整棵树中
    2. 任何一个关键字出现且只出现在一个结点中
    3. 搜索有可能在非叶子结点结束
    4. 其搜索性能等价于在关键字全集内做一次二分查找
    5. 自动层次控制

    B+树

    B+树是B-树的变体,也是一种多路搜索树

    定义

    定义基本与B-树同,不同点如下:

    1. 非叶子结点的子树指针与关键字个数相同
    2. 非叶子结点的子树指针P[i],指向关键字值属于([K[i], K[i+1])的子树(B-树是开区间)
    3. 所有叶子结点增加一个链指针
    4. 所有关键字都在叶子结点出现

    特性

    1. 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的
    2. 不可能在非叶子结点命中
    3. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层
    4. 更适合文件索引系统

    B-树和B+树对比

    这都是由于B+树和B具有这不同的存储结构所造成的区别,以一个m阶树为例。

    1. 关键字的数量不同;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的作用,但是B树虽然也有m个子结点,但是其只拥有m-1个关键字
    2. 存储的位置不同;B+树中的数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,但是B树的数据存储在每一个结点中,并不仅仅存储在叶子结点上
    3. 分支结点的构造不同;B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息
    4. 查询不同;B树在找到具体的数值以后,则结束.而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径

    B*树

    B*树是B+树的变体,也是一种多路搜索树

    定义

    定义基本与B+树同,不同点如下:

    1. 非根和非叶子节点再增加指向向兄弟节点的指针

    B*树示例

    总结

    1. B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点.所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中
    2. B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中
    3. B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3

    参考

    1. B树B-树和B+树的总结
    2. B树相关
  • 相关阅读:
    数据库mysql中`的作用
    省,市,区三级下拉框联动以及localStorage当做缓存优化
    仿头条新闻app,实现下拉刷新,上拉加载分页
    js获取checkbox多选表单
    这两天的工作:webApp接口对接开发
    我做的一个考试资料app的控制器和后台
    我做的cms后台管理1,商业网站
    thinkphp简单后台cms的操作逻辑
    thinkphp后台登陆自动监测方法_initialize
    topthink有时间看看
  • 原文地址:https://www.cnblogs.com/weiweng/p/12486413.html
Copyright © 2011-2022 走看看