数据结构之B数

news2024/10/24 20:15:00

目录

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树的基本插入和查找操作,提供了一个简单的实现参考。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

南京邮电大学计算机网络实验一(网络操作系统的安装与配置)

文章目录 一、 实验目的和要求二、 实验环境(实验设备)三、 实验原理和步骤四、 实验小结&#xff08;包括问题和解决方法、心得体会、意见与建议等&#xff09;&#xff08;一&#xff09;问题和解决方法&#xff08;二&#xff09;心得体会&#xff08;三&#xff09;意见与建…

osgearth提示“simple.earth: file not handled”

在用vcpkg编译完osg和osgearth后&#xff0c;为了验证osgearth编译是否正确&#xff0c;进行测试&#xff0c;模型加载代码如下&#xff1a; root->addChild(osgDB::readNodeFile("simple.earth")); 此时以为是simple.earth路径的问题&#xff0c;遂改为以下代码…

AI交互数字人如何赋能数智教育?

随着AI交互数字人技术的飞速发展&#xff0c;教育领域正经历着前所未有的变革。AI交互数字人为教育领域注入了全新活力&#xff0c;重塑着教学模式&#xff0c;为学生带来沉浸式学习体验。 AI交互数字人在教育领域中&#xff0c;可以应用在&#xff1a; 1、个性化学习教学指导…

不适合编程的人是怎样的?

你知道不适合编程的人是怎样的吗&#xff1f;其实&#xff0c;对编程没有兴趣的人往往都不适合从事编程工作。编程并非是一项轻松简单的任务&#xff0c;它需要投入大量的时间和精力。 编程领域有其独特的特点和要求。首先&#xff0c;编程有着相当陡峭的学习曲线。从最基础的语…

分布式锁三种方案

基于数据库的分布式锁&#xff08;基于主键id和唯一索引&#xff09; 1基于主键实现分布式锁 2基于唯一索引实现分布式锁 其实原理一致&#xff0c;都是采用一个唯一的标识进行判断是否加锁。 原理&#xff1a;通过主键或者唯一索性两者都是唯一的特性&#xff0c;如果多个…

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面 二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

如何使用React的lazy和Suspense来实现代码分割?

在React中&#xff0c;使用React.lazy和Suspense可以方便地实现组件的代码分割。代码分割是一种优化技术&#xff0c;它将代码拆分成多个包&#xff0c;然后按需加载这些包&#xff0c;从而加快应用的初始加载时间。下面是如何使用这两个API的基本步骤&#xff1a; 使用React.l…

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

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

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

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

基于SSM+Jsp的书店仓库管理系统

摘要&#xff1a;仓库作为储存货物的核心功能之一&#xff0c;在整个仓储中具有非常重要的作用&#xff0c;是社会物质生产的必要条件。良好的仓库布局环境能够对货物进入下一个环节前的质量起保证作用&#xff0c;能够为货物进入市场作好准备&#xff0c;在设计中我们根据书店…

Vue与SpringSecurity认证整合-06

Vue与SpringSecurity整合 我们要知道springsecurity是一个安全框架,我们在后端的时候没有接触前端,springsecurity引入依赖之后,启动项目会对我们进行拦截,让我们登录,然后我们制定了一个登录页面,也是后端的,我们可以指向我们的登录页面,但是与Vue整合之后,登录页面肯定是在Vu…

【JavaScript复习二】选择结构if和Switch(1)

### []( )2、单分支条件分支语句if (条件表达式) { // 条件为真时&#xff0c;做的事情 } else { // 条件为假时&#xff0c;做的事情 } ### []( )2,、多分支的 if 语句if (条件表达式1) { // 条件1为真时&#xff0c;做的事情} else if (条件表达式2) { // 条件1不满足&…

打造完美启动页:关键策略与设计技巧

启动页&#xff08;Splash Screen&#xff09;设计是指在应用程序启动时&#xff0c;首先展示给用户的界面设计。这个界面通常在应用加载或初始化期间显示&#xff0c;其主要目的是为用户提供一个视觉缓冲&#xff0c;展示品牌标识&#xff0c;并减少用户在等待过程中的焦虑感。…

kafka基础概念

目录 1、kafka简介 2、kafka使用场景 3、kafka基础概念 3.1、消息 3.1.1、消息构成详解 3.1.2、消息存储设计 3.2、topic 3.3、partition 3.4、offset 3.5、replication 3.5.1、replication简介 3.5.2、副本角色 3.5.3、副本类型 3.5.3.1、副本类型简介 3.5.3.2、…

【前端开发工具】VS Code安装和使用

文章目录 一、前言二、下载三、安装四、配置五、使用5.1 导入项目5.2 本地运行项目5.3 修改界面文案&#xff0c;验证效果5.4 添加日志打印5.5 代码调试5.6 代码提交到Git仓库 六、总结 一、前言 本文介绍一下在前端vue项目中&#xff0c;VS Code的安装和配置。 什么是VS Code…

最新版本的MathType软件2024最新和谐绿色版下载

&#x1f31f; 数学公式的美学&#xff0c;MathType全新升级&#xff01; 亲爱的笔记本小达人&#xff0c;你是否曾为在文档中插入美观又准确的数学公式而头疼&#xff1f;今天&#xff0c;我就来给你种草一个神奇的工具 —— 最新版本的MathType软件&#xff01;&#x1f389…

React Native性能优化红宝书

一、React Native介绍 React Native 是Facebook在React.js Conf2015 推出的开源框架&#xff0c;使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native&#xff0c;可以使用 JavaScript 来访问移动平台的 API&#xff0c;使用 React 组件来描述 UI 的…

PhotoShop自动生成号码牌文件

1、说明 设计卡牌的时候&#xff0c;遇到自动生成编号&#xff0c;从01500到-02500&#xff0c;一个一个的手写&#xff0c;在存储保存成psd格式的文件&#xff0c;会很耗时。 下面将介绍如何使用ps自动生成psd格式的文件 2、使用excle生成数字 从01500到-02500 第一步&…

华为---VLAN-配置Eth-Trunk链路聚合(三)

6.3 配置Eth-Trunk链路聚合 6.3.1 原理概述 在没有使用Eth-Trunk前&#xff0c;百兆以太网的双绞线在两个互连的网络设备间的带宽仅为100Mbit/s。若想达到更高的数据传输速率&#xff0c;则需要更换传输媒介&#xff0c;使用千兆光纤或升级成为千兆以太网。这样的解决方案成本…

浙江农林大学2024年成人高等继续教育招生简章

浙江农林大学&#xff0c;作为浙江省内享有盛誉的高等学府&#xff0c;一直以其深厚的学术底蕴和严谨的教学态度为广大学子所赞誉。近年来&#xff0c;随着社会对高素质、专业化人才的需求日益增长&#xff0c;成人高等继续教育逐渐成为越来越多人提升自身综合素质、拓宽职业发…