数据结构之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 3typedef struct BTreeNode 
{int keys[2 * T - 1]; // minimum degreestruct BTreeNode *C[2 * T]; // child pointersint n; // current number of keysint 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.mzph.cn/bicheng/30812.shtml

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

相关文章

使用 C# 进行面向对象编程:第 9 部分

使用 OOP 的用户活动日志 应用程序背后的关键概念 在这一部分中&#xff0c;我们将使用之前学到的一些 OOP 概念。我们将创建一个小型应用程序。在继续之前&#xff0c;请阅读我的文章user-activity-log-using-C-Sharp-with-sql-server/。在本课程中&#xff0c;我们将再次使…

测试人员遇到需求变更 4大处理技巧

测试人员有效的需求变更管理&#xff0c;可以确保即使在需求频繁变化的情况下&#xff0c;测试工作仍然能够覆盖所有必要的功能点&#xff0c;从而保障最终产品的质量。如果没有合理的需求变更处理技巧&#xff0c;可能会造成不必要的返工和重复测试&#xff0c;无法维持项目的…

平安养老险浙江分公司开展防范非法集资宣传,守护群众“钱袋子”

为进一步提高群众对非法集资的防范意识的鉴别能力&#xff0c;近期&#xff0c;平安养老保险股份有限&#xff08;以下简称“平安养老险”&#xff09;浙江分公司以“守住钱袋子、护好幸福家”为宣传主题&#xff0c;深入居民社区、办公职场等公共场所开展的宣传活动。 平安养老…

看完再买不后悔!希喂、小米、霍尼韦尔宠物空气净化器性价比比拼

在忙碌的工作之余&#xff0c;养一只猫真的能治愈一切的不快&#xff0c;让我们的心灵得到片刻的宁静。然而&#xff0c;这份宁静背后&#xff0c;却隐藏着一些不易察觉的烦恼——猫浮毛和异味。 猫浮毛&#xff0c;这个看似微不足道的小问题&#xff0c;实则给许多宠物主人带…

PS选不了颜色和路径描边?PS不知为何才能描边任意路径,这个办法让你秒懂

在选中路径的情况下&#xff0c;按图下操作&#xff0c;即可制作路径&#xff08;不会让你选不了颜色和路径描边&#xff09;

第4章 工程经济评价指标 作业

第4章 工程经济评价指标 作业 一单选题&#xff08;共27题&#xff0c;100分&#xff09; (单选题)利息备付率是指( )与应付利息费用的比值。 A. 息税前利润 B. 利润总额 C. 净利润 D. 营业收入 正确答案: A:息税前利润; (单选题)当净现值( )0时,该项目不可行。 A. < B. …

leetcode:557. 反转字符串中的单词 III(python3解法)

难度&#xff1a;简单 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a; 输入&#xff1a;s "Lets take LeetCode contest" 输出&#xff1a;"steL ekat edoCteeL tsetnoc…

分布式光纤测温DTS使用的单模光纤与多模光纤有何区别?

分布式光纤测温DTS中使用的单模光纤和多模光纤之间存在着本质区别。单模光纤是一种在光纤通信中应用广泛的光纤类型&#xff0c;几乎所有的光纤入户和主干线通信都采用单模光纤。从通信的角度来看&#xff0c;单模光纤就好比一条单行道的高速铁路&#xff0c;而多模光纤则类似于…

Leetcode - 周赛401

目录 一&#xff0c;3178. 找出 K 秒后拿着球的孩子 二&#xff0c;3179. K 秒后第 N 个元素的值 三&#xff0c;3180. 执行操作可获得的最大总奖励 I 四&#xff0c;3181. 执行操作可获得的最大总奖励 II 一&#xff0c;3178. 找出 K 秒后拿着球的孩子 本题可以直接模拟&a…

新手必读:平面设计自学全攻略

据说平面设计的门槛很低&#xff0c;零基础也很容易上手。但是据我所知许多初学者在自学平面设计时面临以下瓶颈&#xff1a;为什么跟着大神自学平面设计帖子依旧学不会呢&#xff0c;明明报了许多平面设计自学课程&#xff0c;但仍然不会自主设计&#xff0c;初学者到底从哪里…

XMind 2024软件最新版下载及详细安装教程

​人所共知的是XMind 在公司和教育领域都有很广泛的应用&#xff0c;在公司中它能够用来进行会议管理、项目管理、信息管理、计划和XMind 被认为是一种新一代演示软件的模式。也就是说XMind不仅能够绘制思维导图&#xff0c;还能够绘制鱼骨图、二维图、树形图、逻辑图、组织结构…

数字乡村:绘就乡村振兴的智慧新画卷

在乡村振兴战略的宏伟蓝图下&#xff0c;“数字乡村”作为新时代农村现代化的重要抓手&#xff0c;正悄然改变着中国乡村的面貌。本文旨在深度剖析数字乡村建设的核心价值、关键技术、成功案例以及未来展望&#xff0c;为乡村振兴战略提供前瞻性的思考与启示。 数字乡村的核心价…

SAP PI/PO获取文件名及路径

Sender Adapter设置如下&#xff1a; UDF定义如下&#xff1a; DynamicConfiguration conf (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION); //get file name DynamicConfigurationKey keyFile…

什么是Amazon Relational Database Service(Amazon RDS)及实践体验

目录 前言亚马逊云服务免费体验中心三种优惠类型 Amazon RDS什么是Amazon RDS为什么选择 Amazon RDS&#xff1f;Amazon RDS 的优势关键功能详情工作原理Amazon RDSAmazon RDS CustomAmazon RDS on Amazon Outposts 实践创建并连接到 MySQL 数据库实例一、创建 EC2 实例二、创建…

SpringCloudAlibaba组件之间的版本兼容问题

我之前的SpringCloud项目以及使用的组件的版本是这些 但是我不知道具体的版本兼容问题&#xff0c;以及各种组件之间对应的版本 想要使用我们的springcloud和springcloudAlibaba组件&#xff0c;我们就要版本对应&#xff0c;不然就是一堆依赖报错&#xff0c;要不就是缺了这个…

百望云助力北京市首批“乐企平台”直连企业—北京城建集团成功开具乐企数电票

近日&#xff0c;北京城建集团完成i城建平台与国家税务总局乐企平台的对接&#xff0c;成功开具出建筑行业数电票。这意味着北京城建集团成为北京市首批实现乐企平台直连的企业&#xff0c;标志着集团在财税数字化上取得重要进展。 百望云作为项目服务方&#xff0c;共同见证了…

如何删除电脑自带的游戏

要删除电脑自带的游戏&#xff0c;如扫雷和纸牌&#xff0c;你可以按照以下步骤操作&#xff0c;这些步骤基于Windows操作系统&#xff1a; 对于Windows 7及其更早版本 打开控制面板选择“程序”打开或关闭Windows功能找到并取消勾选游戏 对于Windows 10及更高版本 打开“设…

SpringBoot 实现全局异常处理

为什么要使用全局异常处理&#xff1f; 减少冗余代码&#xff1a; 在不使用全局异常处理器的情况下&#xff0c;项目中各层可能会出现大量的try {…} catch {…} finally {…}代码块&#xff0c;这些代码块不仅冗余&#xff0c;还影响代码的可读性。全局异常处理器允许我们在一…

大润发超市购物卡怎么用?

收到大润发超市的礼品卡以后&#xff0c;我才发现&#xff0c;最近的大润发也得十来公里 为了100块的大润发打车也太不划算了 叫外送也不在配送范围内 最后没办法&#xff0c;在收卡云上出掉了&#xff0c;还好最近价格不错&#xff0c;也不亏&#xff0c;收卡云的到账速度也…

Windows反截屏开发实现

文章目录 Windows反截屏开发实现1. SetWindowDisplayAffinity2. 反截屏系统3. 总结 Windows反截屏开发实现 最近在我们云桌面中需要做到反截屏能力&#xff0c;所谓反截屏就是我们无法通过截图软件&#xff08;微信&#xff0c;QQ&#xff0c;截图等程序&#xff09;截取桌面的…