散列表是数组结构的推广,数组是在整数索引的基础上进行直接寻址操作,O(1)的时间复杂度带来高效的访问
直接寻址HASH表
关键字的范围比较小,集合中的冲突基本为0的情况下,使用HASH,达到O(1)查找,插入,删除
缺点:
关键字范围大时不适用,
范围大(但适用)然而集合数目小,数据填充率低,空间浪费严重;
带函数HASH表
为了解决空间浪费问题,使关键字集合范围集中
散列函数:一种好的方法导出的散列值,在某种程度上应独立于数据可能存在的任何模式,形式相近的关键字应具有截然不同的散列值
除法取余:一个不太接近2的幂的素数,通常是比较合理的选择
乘法:h(k)=m(kA mod 1)
全域散列:随机选择hash函数,使其独立于关键字的特性
// by zjerry 算法导论中设计了一个,需要利用到数论中的知识,暂时先放放
缺点:
引入了冲突问题
避免冲突:尽量随机化
解决冲突:只能尽可能解决
1.链地址法:将散列函数值相同的元素放入到链表中
2.开放寻址法:
利用 探查序列,将HASH表全部利用完,节省了指针链表的空间,缺点是删除问题不好解决
探查序列分类:
线性探查:简易但容易造成聚集
二次探查:容易造成二次聚集(轻度聚集)
双重散列:两个不同函数对关键字求值,相加之和,获得随机性的HASH值
完全散列
可以用两级HASH函数或两级HASH方式来设计完全散列