1.构造散列函数:
一个好的散列函数: 计算简单、空间分配均匀
①直接定址法:
h(key) = a * key + b (a、b为常数)
②除留余数法:
h(key) = key mod p (p一般取素数)
③数字分析法:
分析数字关键字的各位变化情况,取比较随机的位作为散列key
④折叠法:
把数字分成位数相等的几个部分,然后叠加
⑤平方取中法:
把数字平方,然后取中间的几位
2.解决冲突:
①开放地址法: 储存效率较高,查找效率较高,但有“聚集”现象(删除只能“懒惰删除”,否则影响查找)
一旦发生冲突,按另一规则(散列函数)寻址另一空地址
hi(key) = (h(key)+di) mod TableSzie (1<= i < TableSize)
- 线性探测 di = i (1、2、3、4、5、6….)
- 平方探测 di = ±i^2 (1^2、-1^2、2^2、-2^2….)
- 双散列 di = i*h2(key) (1、2、3、4….)
如果TableSzie = 4k+3 形式的素数,则平方探测可以探查整个散列表空间
②分离链接法:不需“懒惰删除”即无存储垃圾,但存储和查找效率较低。
将相应位置上冲突的所有存在同一单向链表中
3.性能分析
①散列因子
散列表空间大小m,填入元素个数n
装填因子: α =