【CMU15-445数据库】bustub Project #2:B+ Tree(上)

文章介绍了如何实现B+树数据结构,包括内部节点和叶节点的定义,以及查找和插入操作的详细过程。内容涉及B+树的节点类型、数据存储方式以及与BufferPoolManager的交互。文章强调了在实现B+树操作时对已有数据结构如ExtendibleHashTable和LRUReplacer的依赖,并提供了调试和检查实现正确性的工具建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(最近两个月学校项目有亿点忙,鸽得有点久,先来把 Project 2 补上)

本节实验文档地址:Project #2 - B+Tree

Project 2 要实现的是数据结构课上都会讲的一个经典结构 B+ 树,但是相信大多数的同学(包括博主)当时都没有自己动手实现过它,本节就是一个很好的锻炼机会。

本节内容会大量使用到 Project 1 实现的 BufferPoolManager(当然也包含了其内部用到的 ExtendibleHashTable 和 LRUKReplacer),所以需要完成前置内容(博主也比较建议这样做,否则直接上手本节可能不好理解对 Page 的 Fetch 和 Unpin 操作)。

由于代码量较多,打算拆成上下两篇写完,本篇介绍用到的数据结构和 B+ 树的查找和插入实现,下一篇讲迭代器,删除和并发控制。

关于 B+ 树的文字介绍就不赘述了,查阅资料过程中发现维基百科的 B+ 树词条的算法描述不够具体,推荐一个有比较具体的例子的博客:
B树和B+树的插入、删除图文详解
(同时不建议参考那些插入和删除分 N 多种具体情况讨论的介绍)

数据结构

B+ 树中有内部节点和叶节点两种结构,它们存储的数据格式和内容不同。bustub 为我们设计好了下面这三个类:

  • 节点基类 BPlusTreePage
    在这里插入图片描述
    内部节点和叶节点的基类,包含了节点类型、当前容量、最大/最小容量、ID、父节点 ID 信息,从类结构上可以看做是两种节点的头信息。按照函数字面意思将其实现即可。可以规定 parent_page_id_INVALID_PAGE_ID 表示根节点

  • 内部节点 BPlusTreeInternalPage<KeyType, ValueType, KeyComparator>

在这里插入图片描述
在这里插入图片描述
内部节点,首先看用到的三个泛型 KeyType, ValueType, KeyComparatorKeyType 不一定直接可用大于小于号比较,所以引入了 KeyComparator,从 cpp 文件中的实例化可以看出用的是 GenericKeyGenericComparator,查看二者源码可以得到以下信息:

  • GenericKey 可以调用 ToString() 函数得到其 int64 表示,然后用 %ld 格式符打印。这对我们后面调试时非常重要。
  • GenericComparator 的比较规则是:左边小于右边时,返回 -1;左边大于右边时,返回 1;相等返回 0。

ValueType 代表的是指向子页面的指针,从实例化可以看出实际只用了 page_id_t,也就是 int。

数据存储上,其理论结构应为 <指针,键,指针,键…,键,指针>,为方便存储,实际上在头部多补了一个无效键,从而可以用一个 pair 的数组存储:

#define MappingType std::pair<KeyType, ValueType>
...
class BPlusTreeInternalPage : public BPlusTreePage {
   
...
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值