MiniOB 项目实验指南:C++ 基础与布隆过滤器实现
实验概述
本实验是 MiniOB 数据库系统的入门实验,旨在帮助学习者掌握 C++ 编程基础,特别是通过实现布隆过滤器来熟悉 MiniOB 的开发环境和编码规范。实验包含两部分内容:C++ 小练习(Cpplings)和布隆过滤器实现任务。
C++ 小练习(Cpplings)
这部分练习不计入实验成绩,但强烈建议完成,因为它能帮助你:
- 熟悉 C++ 基本语法和特性
- 了解 MiniOB 项目中的编码风格
- 为后续数据库实现实验打下基础
练习内容位于 src/cpplings/README.md
中,包含多个小任务,涵盖 C++ 的核心概念。
布隆过滤器实现任务
布隆过滤器原理
布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否存在于集合中。其核心特点包括:
- 空间效率:使用位数组存储信息,空间占用远小于传统数据结构
- 查询效率:查询时间为常数 O(k),k 为哈希函数数量
- 概率特性:可能存在误报(false positive),但不会漏报(false negative)
工作原理示意图:
┌─┐
┌─┼M┼───┐ ┌─┐
│ └─┴─┐ ├─┼T┼─┐
│ │ │ └─┤ │
│ │ │ │ │
┌▼┬─┬─┬▼┬▼┬─┬▼┬▼┬─┐
│1│0│0│1│1│0│1│1│0│
└─┴─┴─┴─┴─┴─┴─┴─┴─┘
实现要求
在 src/oblsm/util/ob_bloomfilter.h
文件中实现 ObBloomFilter
类,需要完成以下核心方法:
-
insert 方法:将元素插入布隆过滤器
- 需要支持并发访问
- 使用多个哈希函数计算元素位置
- 将对应位数组位置设为1
-
contains 方法:检查元素是否存在
- 需要支持并发访问
- 检查所有哈希函数对应的位是否都为1
- 返回判断结果
-
clear 方法:清空过滤器
- 将所有位重置为0
并发实现建议
实现并发访问时可以考虑以下方案:
-
基于锁的实现:
- 使用互斥锁(mutex)保护位数组
- 简单易实现,但可能影响性能
-
无锁实现:
- 使用原子操作(atomic)处理位数组
- 性能更高,但实现复杂度增加
优化思考
布隆过滤器存在以下局限性,可以考虑优化:
-
误报率问题:
- 增加位数组大小
- 优化哈希函数数量和选择
-
不支持删除:
- 考虑使用计数布隆过滤器
- 但会增加空间开销
-
哈希函数选择:
- 使用高质量、低碰撞率的哈希函数
- 考虑使用双重哈希等技术
测试方法
使用 Google Test 框架进行测试:
- 编译项目:
./build.sh debug --make
- 进入构建目录:
cd build_debug/
- 运行测试:
./bin/ob_bloomfilter_test
- 修改代码后重新编译:
make
实验建议
- 先理解布隆过滤器的原理再开始编码
- 从小规模测试开始,逐步验证功能
- 注意并发场景下的线程安全问题
- 考虑性能优化方案,但不牺牲正确性
通过本实验,你将掌握 C++ 并发编程基础,理解布隆过滤器的实现原理,并为后续数据库系统实现实验做好准备。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考