Project 1 共需完成三个任务:可扩展哈希表(Extendible Hash Table)、LRU-K 置换策略(LRU-K Replacement Policy)以及缓冲池管理(Buffer Pool Manager),其中缓冲池的实现会用到前两个,建议就按文档给的顺序实现。
关于代码,首先这里主要就是我个人的一个记录空间,文章也就一两百访问量还是中文,不会真有 CMU 学生来看吧(况且写这篇时也早已过了 DDL)。其二,我比较想展示一些具体实现上比较符合 C++ 的代码风格。另外,我对做这种项目时不知道哪里出 Bug 死活过不去测试特别想要一份参考代码的心情非常理解,所以我决定还是放出关键代码,希望能帮到和博主一样在自学这门课的同学。为了美观,代码会以图片展示为主。(毕竟都来自学了,至少跟着手写一遍,copy paste 就没意义了)
当然,因为我自己写的时候没有参考别人的代码,所以可能有一些地方的理解不对(侥幸过了测试?),欢迎交流指出~
Extendible Hash Table 可扩展哈希表
拉链法实现的哈希表当某个哈希值对应的(即存在于同一个“桶”中,Bucket)元素特别多时,查找的时间复杂度由 O ( 1 ) O(1) O(1) 退化为遍历的 O ( n ) O(n) O(n)。举个极端的例子,如果哈希函数是不管输入是什么都映射为 0,那么就和在第 0 位存储一个链表无异。如何设计散布更加均匀的哈希函数是优化的另一个方向,而另一种方法是当检测到某个桶中的元素过多时对表进行扩展。扩展最简单的做法是直接将哈希表的长度(桶数)翻倍,再将哈希函数的值域由 [ 0 , n ) [0, n) [0,n) 改为 [ 0 , 2 n ) [0, 2n) [0,2n)(这点很容易实现,因为大部分哈希函数本身就是先算出某个值,然后对 n n

最低0.47元/天 解锁文章
1508

被折叠的 条评论
为什么被折叠?



