哈希表(散列表)通过将关键码映射到表中的某个位置上来存储元素,然后根据关键码来访问元素。
常用的hash函数有除留余数法,线性探测,二次探测,开链法,在大部分情况下基本就是用开链法:
1、直接定址法
取关键字的某个线性函数作为散列函数,Hash(key)=A*key+B;
但是这种方法有很大的缺陷,就是当关键码比较分散时,hash表的所浪费的空间是非常大的。
2、除留余数法
设散列表中允许出现的地址数为m,取一个不大于m但是最接近或等于m的素数p,作为除数(素数作为除数能够减少哈希冲突)。
hash(key)=key%p; p<=m;
解决冲突的方法:
一、闭散列法(开地址法):
1、线性探测法
在线性探测中,冲突时通过顺序扫描数组(可以往回找),直到找到空的位置。查找算法也使用了探测法。
hash(key)+0,hash(key)+1,hash(key)+2, .... hash(key)+i,
但是这种方法有可能引发原始集聚话问题,即导致局部范围大规模发生冲突。
2、二次探测法
hash(key)+0^2,hash(key)+1^2,hash(key)+2^2, .... hash(key)+i^2。
二次探测法检查了远离原始探测点的单元,这样的话就降低了原始集聚化问题。
二、开散列法(链地址法):
数组查找容易,插入删除难,链表插删容易,查找困难,拉链法:可以理解为数组