散列表:记录的存储位置与关键字之间存在对应关系--hash函数(哈希=散列)
Loc(i)=H(keyi)
特点:查找效率高(直接访问对应的位置),空间效率低
概念:
散列方法(杂凑法):选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;
查找时,由同一个函数对给定值k计算地址,将k与地址单元元素关键码进行比对,确定是否成功
散列函数(杂凑函数):散列方法中使用的转换函数
冲突:key1≠key2,但是H(key1)=H(Key2)<不同关键码映射到一个散列地址>
同义词:具有相同函数值的多个关键字
使用散列表的关键:
1.构造好的散列函数
a.选择的散列函数尽可能简单,以便于提高转换速度
b.所选函数对关键码计算出的地址,应在散列地址集中均匀分布,以减少空间浪费
2.制定好的解决冲突的方案
如果从散列函数计算出的地址查不到关键码,应当依据解决规则,有规律的查询其他相关单元。
需要考虑的因素
1.执行速度
2.关键字长度
3.散列表大小
4.关键字的分布情况
5.查找频率
要求:
1.地址空间尽量小 2.要均匀
构造散列函数的方法:
1.直接定址法 2.数字分析法 3.平方取中法
4.折叠法 5.除留余数法 6.随机数法
直接定址法:
Hash(key) = a·key + b(a,b为常数)
优点:不会产生冲突,但要占用连续地址空间,空间效率低
除留余数法:
Hash(key) = key mod p (p为一个整数)
关键:取合适的p 通常设 p≤m且为质数(m为表长)
解决冲突的方法:
1.开放定址法 2.链表地址法(拉链法) 3.再散列法(双散列函数)
4.建立公共溢出区
开放定址法
有冲突时去寻找下一个空的散列地址,只要散列地址足够大,就能找到空的散列地址将数据元素存入
mod m
为增量序列
常用方法: 线性探测法:为1,2...m -1线性序列
二次探测法:为1^2 ,-1^2 , 2^2 ,-2^2 ...q^2二次序列
伪随机探测法:为伪随机数
链地址法:
将相同散列地址的记录链成一个单列表
优点:非同义词不会冲突,无“聚集”现象 链表上动态申请,更适合于表长度不确定的情况
查找:
线性探测法
拉链法
散列表的ASL取决于:1.散列函数 2.处理冲突的方法 3.装填因子α
α=表中填入的记录数/哈希表的长度
α越大,表中记录数越多,说明表装的越满,冲突发生的概率越大,查找时次数就越多
散列表技术具有很好的平均性能,优于一些传统技术
链地址法优于开地址法
除留余数法作为散列函数优于其他类型函数