CMU 15-445/645 fall2024 p0
在服务器内按照 bustub 的文档用 copilot 配置好了环境,学习了 git。public 指的是模板仓库,origin 指的是从 public clone 下来的远程仓库。在服务器内运行的是本地仓库(local);master / main 都指默认分支,main 是 2020 年以后开始使用的默认分支名。
Git 命令
git pull public master # 拉取修改
git push origin main # 推送修改
hyperloglog.cpp
hyperloglog.cpp 实现了一个简化版 HyperLogLog,用于估算去重基数(distinct count):
HyperLogLog(...)在src/primer/hyperloglog.cpp:21校验n_bits,并初始化2^n_bits个寄存器(bucket)。ComputeBinary与PositionOfLeftmostOne在src/primer/hyperloglog.cpp:38、src/primer/hyperloglog.cpp:49将哈希转成 64 位bitset,并计算rank(第一个1出现的位置)。AddElem在src/primer/hyperloglog.cpp:64对元素哈希(哈希定义见src/include/primer/hyperloglog.h:58),前n_bits选桶、剩余位算rank,然后更新register[bucket] = max(old, rank)(有锁保护)。ComputeCardinality在src/primer/hyperloglog.cpp:89按 HLL 估算公式计算:estimate = α * m^2 / Σ 2^{-M[i]},最后取floor存到cardinality_。src/primer/hyperloglog.cpp:108显式实例化了int64_t和std::string两种模板类型。
count_min_sketch.cpp
count_min_sketch.cpp 实现了一个并发友好的 Count-Min Sketch 频次估计器(近似计数):
src/primer/count_min_sketch.cpp:31:构造函数校验width/depth,分配width * depth的原子计数数组并清零,再初始化每一行的带种子哈希函数(哈希生成逻辑在src/include/primer/count_min_sketch.h:99)。src/primer/count_min_sketch.cpp:51、src/primer/count_min_sketch.cpp:68:实现了移动构造/移动赋值;移动后会重建 hash lambdas(因为 lambda 捕获了this)。src/primer/count_min_sketch.cpp:92:Insert对每一行计算列索引并fetch_add(1),即每次插入更新depth个桶。src/primer/count_min_sketch.cpp:116:Count查询同一元素在每一行对应桶的值,取最小值作为估计频次(CMS 标准做法)。src/primer/count_min_sketch.cpp:104:Merge支持同尺寸 sketch 按位相加;尺寸不一致会抛异常。src/primer/count_min_sketch.cpp:131、src/primer/count_min_sketch.cpp:138:Clear全清零;TopK对候选集合去重、估计计数、稳定排序并返回前k。src/primer/count_min_sketch.cpp:168:显式实例化了std::string、int64_t、int三种模板类型。