CMU15445-2020fall 笔记:Project 2 - B+TREE 2
CMU15445-2020 fall 笔记:Project 2 - B+ TREE 2
CheckPoint2
checkpoint2 需要修改如下文件
Deletion
delete 算法如下图所示:
delete 操作的重点是当删除一个 entry 后,导致节点不能维持 B+ 树定义中的最小元素个数,需要进行合并和重新分配。代码如下图所示:
对于实现 CoalesceOrRedistribute 方法:
- 如果当前节点中的元素个数,与兄弟节点的元素个数和 < 节点中的最大元素数,就可以进行合并,同时递归修改其父节点,删除合并后剩余的节点。
- 如果当前节点中的元素个数,与兄弟节点的元素个数和 > 节点中的最大元素数,需要将当前节点和兄弟节点中的元素进行重新分配。
Index Iterator
修改 index_iterator.h / index_iteroator.cpp 文件
为了高效的遍历所有的叶节点,仿照 C++ 中的迭代器实现如下接口:
成员变量 leaf 叶节点指针
成员变量 index 叶节点中元素的下标
- isEnd() 判断 leaf 是否为空 和 index 是否是最后一个元素
- operator*() 通过 leaf->GetItem(index) 获得叶节点的对应元素
- operator++() 需要注意,如果 index 已经大于等于当前叶节点中元素个数,需要获取下一个叶节点的 page_id 并读入到内存中,同时要 unpin 当前 leaf 所在的 page, 如果下一个叶节点的 page_id 为 invalid,就将 leaf 指针和 index 值设为无效值
- operator==() / operator!=() 判断 leaf 和 index 的值是否同时相同
Concurrent Index
使用 crabbing protocol 算法来保证对 B+ Tree 的并发访问
- 获得父节点的 latch
- 获得孩子的 latch
- 判断是否安全(是否会造成 split 或者 merge 操作),来决定是否释放父节点的 latch
Find
- 获得孩子节点上 R latch
- 释放父节点的 latch
Insert / Delete
- 获得需要的 W latch
- 当 child 被 latch,检查对它操作是否是安全的
- 如果 child 是安全的,就释放这个 child 节点 ancestors 上的所有 latch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧