基本思想:记录的存储位置与关键字之间存在对应关系
对应关系一hash函数
根据散列函数H(key)= k
查找key=9,则访问H(9)=9号地址,若内容为9则成功;
若查不到,则返回一个特殊值,如空指针或空记录。
优点:查找效率高
缺点:空间效率低!
1.若干术语
散列方法,散列函数,散列表
冲突:不同的关键码映射到同一个散列地址
key1*key2,但是H(key1)=H(key2)
同义词:具有相同函数值的多个关键字
2.散列函数的构造方法
1)构造好的散列函数
(a)所选函数尽可能简单,以便提高转换速度;
(b)所选函数对关键码计算出的地址,应在散列地址集中致均匀分布,以减少空间浪费。
①执行速度(即计算散列函数所需时间) ;
②关键字的长度;
③散列表的大小;
④关键字的分布情况;
⑤查找频率。
2)制定一个好的解决冲突的方案
查找时,如果从散列函数计算出的地址中查不到关键码,则应当依据解决冲突的规则,有规律地查询其它相关单元。
(1.直接定址法
Hash(key) = a*key+ b (a、 b为常数)
优点:以关键码key的某个线性函数值为散列地址,不会产生冲突。
缺点:要占用连续地址空间,空间效率低。
(2.除留余数法
Hash(key)= key mod p (p是一 个整数)
关键:如何选取合适的p?
技巧:设表长为m,取p≤m且为质数
3.处理冲突的方法:
1.开放定址法(开地址法)
基本思想:有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入。
例如:除留余数法Hi=(Hash(key)+di) mod m (di为增量序列)
2.链地址法(拉链法)
基本思想:相同散列地址的记录链成一单链表
m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构。
链地址法的优点:
- 非同义词不会冲突,无“聚集"现象
- 链表上结点空间动态申请,更适合于表长不确定的情况
4.散列表的查找
查找例题:
5.散列表的查找效率分析
使用平均查找长度ASL来衡量查找算法,ASL 取决于
- 散列函数
- 处理冲突的方法
- 散列表的装填因子α
几点结论
●散列表技术具有很好的平均性能,优于一些传统的技术
●链地址法优于开地址法
●除留余数法作散列函数优于其它类型函数