第七节课内容是Hash Tables,这里总体介绍一下project2和hw2(第二部分)中会用到的可扩展散列,本文建立在对散列表有基本了解的基础上,如果不太清楚,可以回看andy的课。课上还介绍了静态散列很多种类以及另一种动态散列-线性散列(后续有时间会整理笔记
课程主页:CMU 15-445/645 :: Intro to Database Systems (Fall 2023)
当数据库增大或缩小时,可扩充散列可以通过桶的分裂或合并来适应数据库增大或缩小的需要。这样可以保持空间的使用效率。此外,由于重组每次仅作用于一个桶,因此带来的性能开销较低,可以接受。 《数据库系统概念》
- 最重要的一个特点就是动态可扩展,使得其对空间利用率较高,不必为将来的增长保留桶
整体介绍
- 使用可扩充散列时,一搬选择具有均匀性和随机性特性的散列函数,产生的值范围较大,是b位二进制整数。
- 桶(bucket)是我们用来存储记录的单位,我这里假设一个桶只能存两条记录。
- Global Depth和Local Depth
- 全局深度(Global Depth):表示当前整个表的目录所使用的位数,如图中刚开始为0,那就只能有2^0 = 1个bucket,而一个bucket只能存储两条数据。当我们试图插入第三条,就需要1位数作为全局深度,这样就可以分为0和1两个bucket就可以存储2*2=4条数据。
- 本地深度(Local Depth):表示该桶使用的散列值位数。如最上面的bucket,由于从始至终只有一个以0开头的数据,所以它的本地深度就一直为1(它只需要最前面1位数就可以确定值),而下面由于出现3个“1“、3个“10“的情况则需要分裂,分裂的方式就是通过增加一位数来获得两个bucket,而分裂就会让目录也要分裂.
(以插入操作为例,删除、查找操作会在P2教程前更新,也有可能写在P2教程里,这篇文章主要是总体认识。)
三层逻辑结构
Header(头部)
- 头部是整个可扩展散列结构的入口,包含全局信息,用于管理和维护散列结构,通常包含一下内容:
- 全局深度(Global Depth):表示当前目录所使用的位数。
- 目录指针:指向目录数组的指针。
Directory(目录)
- 目录是一个数组,其中每个元素是指向数据桶的指针。目录的大小就是2^(Global Depth),即目录项的数量是由全局深度决定的。
- 内容:
- 目录项(Directory Entry):每个目录项包含一个指针,指向一个数据桶。目录项的数量随着全局深度的增加而成倍增加。
Bucket(桶)
- 桶是实际存储数据项的地方。每个桶有固定的容量,当一个桶满时,需要分裂。每个桶包含以下内容:
- 本地深度(Local Depth):表示该桶使用的散列值位数
- 数据项:实际存储的数据,如键值对。