数据结构之B数

目录

1.概述

2.特点

3.诞生

4.优缺点

4.1.优点

4.2.缺点

5.应用场景

6.C语言中的B树实现例子

7.总结


1.概述

B树(B-tree)是一种自平衡的树数据结构,广泛应用于数据库和文件系统中,以便高效地进行顺序读取、写入以及查找操作。主要思想是保持数据在一种排序状态,且每个节点可以拥有多个子节点,使得系统在磁盘I/O上更加高效。

2.特点

1. 自平衡:自动调整自身结构以保持平衡。
2. 所有叶子节点在同一层:这确保了查找操作的深度相同。
3. 节点的键数量:每个节点包含一个范围内的键值数量(通常由一个给定的最小度数t确定)。
4. 子树数量:如果一个节点包含n个键,必然包含n+1个子节点。
5. 有序性:每个节点中的键值是按非递减顺序储存的。

3.诞生

B树由Rudolf Bayer和Edward M. McCreight在1972年发明。设计的目的是为了解决因大规模数据存储而产生的慢速磁盘访问问题。

4.优缺点

4.1.优点

1. 高效的查询和读写操作:通过减少I/O操作来提高性能。
2. 平衡性:自我平衡机制保证了高效的树结构。
3. 适合大规模数据:尤其适用于外存储设备(如硬盘)的数据存取,提高了搜索、插入、删除等操作的速度。

4.2.缺点

1. 实现复杂:相比其他基础数据结构,B树的实现逻辑相对复杂。
2. 占用更多存储空间:为了保持平衡性,需要额外的内部节点和子节点指针。
3. 维护成本高:在插入和删除操作中需要较多的旋转和分裂操作。

5.应用场景

1. 数据库索引
2. 文件系统(如NTFS)
3. 数据库管理系统(DBMS)
4. 内存缓冲区替换算法
5. 搜索引擎索引
6. 电子书阅读器(如Kindle)的索引
7. 存储系统的元数据管理
8. 版本控制系统
9. 多级缓存
10. 科学计算数据库

6.C语言中的B树实现例子

以下是一个简单的B树实现示例代码:

#include <stdio.h>
#include <stdlib.h>

// 定义B树的最小度数 (最低范围)
#define T 3

typedef struct BTreeNode 
{
    int keys[2 * T - 1]; // minimum degree
    struct BTreeNode *C[2 * T]; // child pointers
    int n; // current number of keys
    int leaf; // is true if leaf node
} BTreeNode;

//创建新B-树节点
BTreeNode* createNode(int t, int leaf) 
{
    BTreeNode* newNode = (BTreeNode*) malloc(sizeof(BTreeNode));
    newNode->leaf = leaf;
    newNode->n = 0;
    return newNode;
}

//遍历B-树
void traverse(BTreeNode* root) 
{
    if (root == NULL) 
        return;

    int i;
    for (i = 0; i < root->n; i++) 
    {
        if (root->leaf == 0) traverse(root->C[i]);
        printf(" %d", root->keys[i]);
    }

    if (root->leaf == 0) 
        traverse(root->C[i]);
}

//在B-树中搜索关键字
BTreeNode* search(BTreeNode* root, int k) 
{
    int i = 0;
    while (i < root->n && k > root->keys[i]) 
        i++;

    if (root->keys[i] == k) 
        return root;

    if (root->leaf == 1) 
        return NULL;

    return search(root->C[i], k);
}

//拆分完整节点的子节点
void splitChild(BTreeNode* x, int i, BTreeNode* y) 
{
    BTreeNode* z = createNode(y->leaf, T);
    z->n = T - 1;

    for (int j = 0; j < T - 1; j++) 
        z->keys[j] = y->keys[j + T];

    if (!y->leaf)
    {
        for (int j = 0; j < T; j++) 
            z->C[j] = y->C[j + T];
    }

    y->n = T - 1;

    for (int j = x->n; j >= i + 1; j--) 
        x->C[j + 1] = x->C[j];
    x->C[i + 1] = z;

    for (int j = x->n - 1; j >= i; j--) 
        x->keys[j + 1] = x->keys[j];
    x->keys[i] = y->keys[T - 1];

    x->n = x->n + 1;
}

//在非完整节点中插入新密钥
void insertNonFull(BTreeNode* x, int k) 
{
    int i = x->n - 1;

    if (x->leaf == 1) 
    {
        while (i >= 0 && x->keys[i] > k) 
        {
            x->keys[i + 1] = x->keys[i];
            i--;
        }

        x->keys[i + 1] = k;
        x->n = x->n + 1;
    } 
    else 
    {
        while (i >= 0 && x->keys[i] > k) 
            i--;

        if (x->C[i + 1]->n == 2 * T - 1) 
        {
            splitChild(x, i + 1, x->C[i + 1]);
            if (x->keys[i + 1] < k) 
                i++;
        }
        insertNonFull(x->C[i + 1], k);
    }
}

//在B-树中插入新键值
void insert(BTreeNode** root, int k) 
{
    if (*root == NULL) 
    {
        *root = createNode(1, T);
        (*root)->keys[0] = k;
        (*root)->n = 1;
    } 
    else 
    {
        if ((*root)->n == 2 * T - 1) 
        {
            BTreeNode* s = createNode(0, T);
            s->C[0] = *root;
            splitChild(s, 0, *root);

            int i = 0;
            if (s->keys[0] < k) i++;
            insertNonFull(s->C[i], k);

            *root = s;
        } 
        else 
        {
            insertNonFull(*root, k);
        }
    }
}

int main() 
{
    BTreeNode* root = NULL;

    int keys[] = {10, 20, 5, 6, 12, 30, 7, 17};
    int n = sizeof(keys) / sizeof(keys[0]);

    for (int i = 0; i < n; i++) 
    {
        insert(&root, keys[i]);
    }

    printf("Traversal of constructed B-Tree: ");
    traverse(root);

    int k = 6;
    (search(root, k) != NULL) ? printf("\nPresent") : printf("\nNot Present");

    k = 15;
    (search(root, k) != NULL) ? printf("\nPresent") : printf("\nNot Present");

    return 0;
}

7.总结

B树是一种重要的平衡树数据结构,具有高效的插入、删除和查找操作。广泛应用于数据库系统和文件系统中,由于其自平衡特性,使得其在处理大规模数据时表现出色。实现B树需要深入理解其复杂的结构及操作。上述示例代码展示了B树的基本插入和查找操作,提供了一个简单的实现参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/726806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cytoscape之操作界面介绍

Cytoscape 简介 Cytoscape是一个专注于开源网络可视化和分析的软件。软件的核心部分提供了网络显示、布局、查询等方面的基本功能。软件的核心可以通过插件架构进行扩展&#xff0c;这样就能快速地开发出新的功能。 Cytoscape 源自系统生物学&#xff0c;用于将生物分子交互网…

win10成功安装stable-diffusion-webui

目录 1.python下载安装 2.git下载安装 3.stable-diffusion-webui下载 4.安装s-d-webui的依赖包&#xff08;用国内镜像提速&#xff09; 5.git下载的stable-diffusion-webui&#xff0c;依赖包提示已安装&#xff0c;但运行webui-user.bat后&#xff0c;又开始下载 6.修改…

2024最新AI大模型-LLm八股合集(八)-Transformer模型

更多2024最新AI大模型-LLm八股合集可以拉到文末&#xff01;&#xff01;&#xff01; MHA & MQA & MGA &#xff08;1&#xff09;MHA 从多头注意力的结构图中&#xff0c;貌似这个所谓的多个头就是指多组线性变换层&#xff0c;其实并不是&#xff0c;只有使用了一…

ARM Linux 设备树详细介绍(1)

1. ARM&Device&Tree 起源 Linus Torvalds 在 2011 年 3 月 17 日的 ARM Linux 邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”&#xff0c;引发 ARM Linux 社区的地震&#xff0c;随后 ARM 社区进行了一系列 的重大修正。 在过去的 ARM Linux 中&…

Pointnet++改进即插即用系列:全网首发FastKAN|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入FastKAN,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理…

360vr党建线上主题展立体化呈现企业的文化理念和品牌形象

在现代科技的引领下&#xff0c;艺术与VR虚拟现实技术相融合必将成为趋势&#xff0c;深圳VR公司华锐视点荣幸地推出VR艺术品虚拟展厅&#xff0c;为您带来前所未有的艺术观赏体验。体验者足不出户即可置身于一个充满创意与灵感的虚拟艺术空间。 我们深入了解每一位客户的需求与…

计算机网络 —— 应用层(万维网)

计算机网络 —— 应用层&#xff08;万维网&#xff09; 万维网核心组成部分特点 URLHTTP版本请求消息结构响应消息结构工作流程 Cookie如何工作主要用途安全与隐私类型 Web缓存客户端缓存&#xff08;浏览器缓存&#xff09;服务器端缓存 今天我们来了解万维网&#xff1a; 万…

元宇宙与AI推动品牌营销进入全智能时代

近日&#xff0c;在2024年T-EDGE未来科技大会上&#xff0c;30位业界领袖、产业优秀企业代表&#xff0c;分享以AI为代表的新技术赋能科技产业&#xff0c;抓住中国企业全球化、数字化营销、绿色经济、智能家居多个产业和领域的创新发展趋势&#xff0c;以四大热门议题&#xf…

ffmpeg.dll丢失怎么办,解决找不到ffmpeg.dll的多种方法分享

ffmpeg.dll 是一个动态链接库文件&#xff0c;它是FFmpeg多媒体框架的一部分。FFmpeg是一个开源项目&#xff0c;可以用来记录、转换数字音视频&#xff0c;也可以转换成不同格式的流媒体。由于它是许多媒体处理任务的核心组件&#xff0c;ffmpeg.dll 缺失或损坏可能会导致依赖…

Windows11+CUDA12.0+RTX4090如何配置安装Tensorflow2-GPU环境?

1 引言 电脑配置 Windows 11 cuda 12.0 RTX4090 由于tensorflow2官网已经不支持cuda11以上的版本了&#xff0c;配置cuda和tensorflow可以通过以下步骤配置实现。 2 步骤 &#xff08;1&#xff09;创建conda环境并安装cuda和cudnn&#xff0c;以及安装tensorflow2.10 con…

视频二维码怎么设置全屏播放?默认全屏效果的添加技巧

视频做成二维码如何全屏展示呢&#xff1f;现在很多人都会将视频生成二维码后&#xff0c;分享二维码给其他人来扫码查看视频内容&#xff0c;设置视频默认全屏播放可以带来展示更好的效果&#xff0c;那么横版和竖版视频扫码自动全屏播放是如何生成的呢&#xff1f; 视频二维…

如何用Vue3打造一个令人惊叹的极坐标图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Vue3-ApexCharts 绘制极地区域图 应用场景 极地区域图常用于展示具有周期性或分类性数据的分布情况&#xff0c;例如不同月份的销售额、不同年龄段的人口分布等。 基本功能 此代码使用 Vue3-ApexChart…

C++ 59 之 纯虚函数和抽象类

#include <iostream> #include <string> using namespace std;class Cal { // 类中有纯虚函数&#xff0c;这个类也叫做抽象类&#xff0c;无法实现实例化 public:int m_a;int m_b;// 虚函数// virtual int getRes(){// return 0;// }// 纯虚函数 作用和虚函数…

深入探究RTOS的IPC机制----邮箱

阅读引言&#xff1a; 因为将来工作需要&#xff0c; 最近在深入学习OS的内部机制&#xff0c;我把我觉得重要的、核心的东西分享出来&#xff0c; 希望对有需要的人有所帮助&#xff0c; 阅读此文需要读友有RTOS基础&#xff0c; 以及一些操作系统的基础知识&#xff0c; 学习…

24上软考成绩预计6月底公布?附查分指南

最近&#xff0c;很多小伙伴都在问上半年成绩什么时候出来&#xff1f;每天学习群变成了祈祷群&#xff0c;都在祈祷45,45,45。按照上一次的成绩发布时间&#xff0c;从考试结束到成绩发布&#xff0c;间隔了32天。这次是不是会更快&#xff1f; 一般阅卷只要7-10天&#xff0c…

【踩坑】修复Ubuntu远程桌面忽然无法Ctrl C/V复制粘贴及黑屏

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 说在前面&#xff1a; 需要注意的是&#xff0c;我发现他应该是新开了一个窗口给我。我之前打开的东西&#xff0c;在这个新窗口里都没有了&#xff0c…

IngsollRang模块化控制器上电无显示维修

英格索兰模块化控制器是工业领域的重要设备&#xff0c;在许多工业生产过程中起着关键的控制作用。然而&#xff0c;当出现IngsollRang控制器上电无显示故障时&#xff0c;不仅会影响生产进度&#xff0c;还可能带来安全隐患。 一、IngsollRang模块化控制器故障诊断 1. 检查电源…

代码讲解——ssm+jsp+maven项目目录结构说明

1 applicationContext.xml 应用上下文配置 2 db.properties 数据库配置 3 log4j.properties日志配置 4 mybatis-config.xml mybatis配置 5 springmvc.xml springmvc配置

语音翻译软件app哪家好?三分钟带你揭秘语音翻译的奥秘~

自打前段时间我国开放了144小时的免签政策&#xff0c;现在各个旅游景点几乎随处可见来自世界各地的外国友人。倘若在大街上遇到外国游客向你问路&#xff0c;为了避免语言不通的尴尬情形&#xff0c;手里头常备着好用的语音翻译软件总是必要的&#xff01; 即使当下你还不清楚…

jar包运行脚本

start&#xff1a; # 启动项目 #!/bin/bash nohup java -jar audit-2.1.0.jar > app.log 2>&1 & quit&#xff1a; # 关闭程序 #!/bin/bash PID$(pgrep -f audit-2.1.0.jar) # 根据应用程序名称查找进程ID kill -9 $PID # 结束进程使用 sh命令运行