《算法导论》中字符串匹配的Rabin-Karp算法的时候,里面提到了对要匹配的字符串计算出一个整型值之后,使用一个较大的素数进行模运算,并以模运算的结果作为匹配值。这里让作者产生了两个疑问,第一是:取余为何非要用一个素数进行模运算呢?第二是:为何还要把这个素数取得非常大?
如上是线性探测法(Linear Probing)容易产生“聚集现象”。
聚集现象容易导致空间浪费,并且查找时间增加。
但是使用比如平方探测法,容易导致有剩余空间,但就是探测不到。如何解决这个问题?见 11.3 ppt :
- 有定理显示,如果散列表长度是某个
4k+3
(k
是正整数)形式的素数时,平方探测法就可以查找到整个散列表空间。
有两个为维度:
- 成功平均查找长度 ASLs
- 不成功平均查找长度 ASLu
算例见 11.3 ppt。
更多讨论见 11.4 ppt。
注意散列表中删除,一般用懒惰删除,即不是真正删除,而是标记一下那个位置,下次插入用到的话,可以直接覆盖。