磁盘链式存储B树与B+树

本文介绍了磁盘存储环境下为解决二叉树层高问题引入的B树,详细阐述了B树的概念、性质、应用、数据结构以及插入、删除等操作。此外,还讨论了B树与B+树的区别,B+树通过将中间节点移到叶子节点以优化查找效率。
摘要由CSDN通过智能技术生成

1 介绍

1.1 多叉树

多叉树是很多种,三叉树,四叉树等等,是相对于二叉树而言的;主要用来解决二叉树的层高问题。二叉树天然的有层高的问题,需要多次遍历。

1.2 B树的由来

内存不足,就要用磁盘存储数据。对于二叉排序树或红黑树层高较高,查到一个结点就是寻址一次。层高很高,寻址就很慢,所以引入了多叉树B树。
多叉树有很多种,三叉,四叉,五叉树等;btree没有区别多少叉树,即btree就指多叉树;应用程序有更多的灵活性。

2 定义与性质

多叉树等于B树,一颗M阶B树T,满足以下条件:
1 每个结点至少拥有M颗子树
2 根结点至少有两颗子树。
3 除根结点外,其余的每个分支结点至少拥有M/2颗子树。
4 所有叶子结点都在同一层==》保证平衡树
5 有k课子树的分支结点,则存在k-1个关键字,关键字按照递增进行排序。
6 关键字数量满足 ceil(M/2) -1 <= n <= M-1
注意:实现设计时候
//度:t
//阶:2t
//结点最大元素: 2t-1

3 B树的应用

B树主要用于索引,主要是用在磁盘存储。
对于磁盘内部结构如下图:
在这里插入图片描述
可以理解为一个扇区就相当于一个结点。

4 B树的数据结构

typedef int KEY_VALUE;

#define DEGREE 3

typedef struct _btree_node {
   

        KEY_VALUE *keys;//结点里面有多少个树,数组

        struct _btree_node **childrens;//多少阶

        int num;//当前结点有多少结点
        int leaf;//是否叶子结点 yes:1 no:0
}btree_node;


//b tree
typedef struct _btree{
   
        btree_node *root;
        int degree;
}btree;

内部函数:

//创建结点
//创建结点 degree:阶数 leaf:是否是叶子结点
btree_node *_btree_create_node(int degree, int leaf){
   

        btree_node *node = (btree_node*)calloc(1,sizeof(btree_node));
        if (node == NULL) {
   
                assert(0);
                return NULL;
        }
        //calloc = malloc +memset

        node->leaf = leaf;
        node->keys = (KEY_VALUE*)calloc(1, (2*degree-1)*sizeof(KEY_VALUE));
        if (node->keys == NULL){
   
                free(node);
                return NULL;
        }

        node->childrens = (btree_node**)calloc(1, (2*degree)*sizeof(btree_node));
        if (node->childrens == NULL){
   
                free(node->keys);
                free(node);
                return NULL;
        }
        node->num = 0;

        return NULL;
}

//删除结点
//销毁结点
void _btree_destroy_node(btree_node *node){
   

        if (node == NULL) return;

        if (node->childrens) free(node->childrens);
        if (node
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丰恒谷

你的鼓励是我最大创作动力!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值