背景一般来说,哈希表的实现是通过两个部分实现的
12hash = hashfunc(key)index = hash % table_size
使用求模来减少存储空间,所以必然会导致不同的数据离散到相同的索引下标处,此时就发生了哈希冲突。
解决方案主要分为两大类
链式法 (Separate Chaining)
开放地址法(Open Addressing)
链接技术将采用额外的数据节点来处理冲突。当冲突发生时,在冲突位置建立链表,通过链表串联起离散到相同下标的节点。在最坏的状况下,会退化为单链表,性能损失严重,哈希攻击便是采用这种形式。
开放地址就是开放哈希表中的所有地址,不使用额外的空间。如果遇到冲突,寻找其他位置存储。
开放地址法线性探测如果哈希到索引为 x 处,如果此处有元素,则查看 x + 1 处,如果没有则放在这里,如果有,则以此类推查看 x + 2,x + 3, …
二次探查这是线性探测的改进,每次的步长变为平方倍数。
Double hashing另一种改进的开放寻址法称为重哈希(Double hashing)或者叫二度哈希(Rehashing)
而在 LevelD ...
skills未读
gdb调试CMU15445-P3gdb调试CMU15445-P3简介在小型的项目中,代码流程都很清楚,并没有涉及到复杂的函数调用与层层封装,然而在一个比较完整的项目中,层与层之间的高度封装,函数流的调用,让我们想理解某一块的代码实现增加了许多困难。
为此,使用 gdb 调试代码可以很好的显示中间过程以及调用流,以方便我们更好的理解某一块代码的实现。
本文并不涉及到 gdb 相关的基础语法
基础语法可以参考 GDB调试
准备工作由于在 CMU15445 的 P3 中需要实现几个执行器与优化算子,所以必须要理解此处的代码流程是什么。
当我们运行它所要求的 SQL 语句之后
报错是由于 SeqScanExecutor 没有实现
所以现在应该找到该类所对应的文件
那么该项目是如何执行到这个位置呢?传入参数的含义分别是什么呢?
此时我们就可以通过 gdb 来定位执行流程
如上图, 在使用 gdb 启动项目之后,我们在需要定位的地方打上断点,之后就可以开始调试。
定位流程输入对应的语句
12CREATE TABLE t1(v1 INT, v2 VARCHAR(100));SELECT * FROM t1;
我们发现 ...