《算法导论》第11章:散列表

一、直接寻址表

类似于计数数组,表中每一个槽只能放一个指针,一旦发生冲突无法解决

二、哈希表的链接法

每个槽保存一个链表,若是双链表可以方便删除

效率分析:一次不成功查找的平均时间为θ(1+α),其中α=n/m称为装载因子。因此当槽的个数m为n的常数倍时,可以认为一次哈希操作耗费O(1)的时间

哈希函数

除法【形式简单】:h(k)=k%m,其中m不能取2^n,否则相当于取k的后n位数

乘法【效率高】:设k和s是w位数(二进制),则s*k为2w位数,取[w+1,w+1+p]位作为h(k)

三、哈希表的开放寻址法

探查序列h(k,i) —— 若h(k,0)被占用,则搜寻h(k,1)...此方法的删除操作比较麻烦

线性探查:h(k,i) = (h’(k) + i) mod m。遇到一次群集,就GG了

二次探查:同理遇到二次群集也GG

双重哈希探查:

双重散列是开放寻址法中的最好方法之一,不像线性和二次探查,双重探查的的探查序列以两种不同的方式依赖于关键字k。为了能使探查序列查找到整个表,值必须与m互素。有两种方法:

 m为2的幂,而 总产生奇数;

 取m为素数, 则总是产生比m小的正整数。

 双重探查法用到了种探查序列。

在开放寻址哈希中,对于装载因子α,并假设是均匀散列,至多需要做1/(1-α)次探查

四、全域哈希

【利用随机化】对于任意的不相等的key,从哈希函数集中选择一个哈希函数,这两个key发生冲突的概率是1/m。

五、完美哈希

【针对静态数据集合】一级哈希映射到槽,槽中保存有二级哈希,再通过二级哈希(可以是二次哈希)映射到槽里面的槽。

其中mi=ni²,根据桶排序的结论,m=O(n)

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/81414202