当前位置: 首页 > news >正文

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

相关文章:

  • 在JPA项目启动时新增MySQL字段
  • 华为欧拉 openEuler24.03 更新 阿里 yum源
  • 算是一些Transformer学习当中的重点内容
  • suuk-s.php.jpg-python 库劫持
  • 北京宠物美容护理app,化身奇迹“萌”宠
  • 【Java】Java基础语法
  • 使用Python进行自然语言处理:从基础到实战
  • Python开发日记--手撸加解密小工具(2)
  • 数组元素去重
  • WHAT - NextJS 系列之 Rendering - Server Rendering Strategies
  • @PostConstruct 注解的方法用于资源的初始化
  • HTML(12)——背景属性
  • 图解注意力
  • kafka的单机、集群部署安装
  • 如何看待鸿蒙HarmonyOS?
  • __proto__ 和 prototype的关系
  • 《Java编程思想》读书笔记-对象导论
  • 【css3】浏览器内核及其兼容性
  • C++11: atomic 头文件
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Django 博客开发教程 16 - 统计文章阅读量
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • leetcode讲解--894. All Possible Full Binary Trees
  • vue2.0项目引入element-ui
  • 关于Java中分层中遇到的一些问题
  • 聊聊redis的数据结构的应用
  • 世界上最简单的无等待算法(getAndIncrement)
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我从编程教室毕业
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #Linux(帮助手册)
  • #QT项目实战(天气预报)
  • #控制台大学课堂点名问题_课堂随机点名
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (void) (_x == _y)的作用
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (多级缓存)缓存同步
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (力扣题库)跳跃游戏II(c++)
  • (十)c52学习之旅-定时器实验
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)stm32之通信协议
  • (一)插入排序
  • (转)jQuery 基础
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...