【数据结构】B+树

目录

概念

对于卫星数据的理解

指定元素的查找

B+树与B-树的区别与好处


在看B+树之前,推荐先看一下B-树的原理

概念

        1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存实际的时候,只用来作为索引,所有数据都保存在叶子结点。

        2.所有叶子结点中包含了全部信息,以及志向含这些元素记录的指针,并且叶子结点本身依靠关键字的大小自小到大按照顺序链接

        3.所有中间节点的元素都同时存在于子节点,在子节点元素中是最大(或最小)的元素

如图就是一个B+树,其中中间节点和根节点都存储的数据不是实际的数据,都是对应孩子节点元素中的最大值,所有元素都存储在叶子结点中,同时叶子结点互相相连,形成一个链表

对于卫星数据的理解

B-树和B+树还有一点明显的区别是,B+树只有叶子结点有卫星数据,中间节点仅仅是索引,没有任何数据

我对于卫星数据的理解是,存储实际数据的结点叫做卫星数据,而作为作为位置的数据不叫卫星数据,比如一个链表结构

struct Node{
    int data;
    struct Node *next;
}

其中data就是卫星数据,用于存储整形数据,而*next只是作为链表链接,并不是存储实际的数据,所以不叫卫星数据

指定元素的查找

假设要查找的元素为3

第一次查找 

第二次查找

 第三次查找

B+树与B-树的区别与好处

1.IO次数更少

        因为B+树的中间节点没有卫星数据,只有代表地址的数据,对应的节点就可以省下卫星数据的空间,所以同样大小的磁盘页可以容纳更多的节点元素

        代表着数据量相同的情况下B+树比B-树的高度更加低,查询时的IO次数也会更少

2.查询性能更稳定

        因为B-树每个节点都存储着数据,B+树只有叶子结点存储着数据,所以B-树的查询性能并不稳定(最好情况是只查跟节点,最坏情况是查到叶子结点),而B+树的每一次查找都是稳定的

3.范围查询更方便

        因为B+树底层是链表结构,所以在连续查询时只需要顺着底部的链表进行查询就可以了,而B-树需要在叶子结点、中间节点上反复横跳

参考文章

什么是B+树?(详细图解)_jiang_wang01的博客-CSDN博客_b+树

漫画:什么是B+树? - 知乎

什么是数据结构的卫星信息? - IT屋-程序员软件开发技术分享社区

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B+树是一种常用的树数据结构,通常用于数据库和操作系统的文件系统中。它具有以下特点: - B+树能够保持数据稳定有序,即所有的数据都按照一定的顺序存储在树中。 - B+树的插入和修改操作具有较稳定的对数时间复杂度,即O(log n)。 - B+树的元素是自底向上插入的,与二叉树相反。 下面是一个C++实现的B+树的代码示例: ```cpp // BPulsTree.h #ifndef BPLUSTREE_H #define BPLUSTREE_H // B+树节点的定义 struct Node { int *keys; // 存储关键字的数组 Node **childPointers; // 存储子节点指针的数组 bool isLeaf; // 是否为叶子节点 int numKeys; // 当前节点的关键字数量 Node *next; // 指向下一个叶子节点的指针 // 构造函数 Node(bool isLeafNode); // 插入关键字 void insert(int key); // 删除关键字 void remove(int key); // 查找关键字 bool search(int key); }; // B+树的定义 class BPlusTree { private: Node *root; // 根节点 public: // 构造函数 BPlusTree(); // 插入关键字 void insert(int key); // 删除关键字 void remove(int key); // 查找关键字 bool search(int key); }; #endif ``` ```cpp // BPulsTree.cpp #include "BPulsTree.h" Node::Node(bool isLeafNode) { keys = new int[3]; // 假设每个节点最多存储3个关键字 childPointers = new Node*[4]; // 假设每个节点最多有4个子节点 isLeaf = isLeafNode; numKeys = 0; next = nullptr; } void Node::insert(int key) { // 插入关键字的逻辑 // ... } void Node::remove(int key) { // 删除关键字的逻辑 // ... } bool Node::search(int key) { // 查找关键字的逻辑 // ... } BPlusTree::BPlusTree() { root = nullptr; } void BPlusTree::insert(int key) { // 插入关键字的逻辑 // ... } void BPlusTree::remove(int key) { // 删除关键字的逻辑 // ... } bool BPlusTree::search(int key) { // 查找关键字的逻辑 // ... } ``` ```cpp // Demo.cpp #include "BPulsTree.h" #include <iostream> int main() { BPlusTree tree; tree.insert(10); tree.insert(20); tree.insert(30); tree.insert(40); tree.insert(50); std::cout << "Search 30: " << (tree.search(30) ? "Found" : "Not found") << std::endl; std::cout << "Search 60: " << (tree.search(60) ? "Found" : "Not found") << std::endl; return 0; } ``` 这是一个简单的B+树的C++实现示例,其中包含了B+树节点的定义和B+树的操作方法。你可以根据需要进行插入、删除和查找操作。在示例中,我们创建了一个B+树对象,并插入了一些关键字,然后进行了查找操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值