基本思想:记录的存储位置与关键字之间存在对应关系

对应关系一hash函数

数据结构 - 散列表的查找_列地址

数据结构 - 散列表的查找_散列表_02

根据散列函数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的某个线性函数值为散列地址,不会产生冲突。

缺点:要占用连续地址空间,空间效率低。

数据结构 - 散列表的查找_列地址_03

(2.除留余数法

Hash(key)= key mod p (p是一 个整数)

关键:如何选取合适的p?

技巧:设表长为m,取p≤m且为质数

数据结构 - 散列表的查找_散列函数_04

3.处理冲突的方法:

1.开放定址法(开地址法)

基本思想:有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入。

例如:除留余数法Hi=(Hash(key)+di) mod m (di为增量序列)

数据结构 - 散列表的查找_列地址_05

2.链地址法(拉链法)

基本思想:相同散列地址的记录链成一单链表

m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构。

数据结构 - 散列表的查找_散列表_06数据结构 - 散列表的查找_散列表_07

​链地址法的优点:

  1. 非同义词不会冲突,无“聚集"现象
  2. 链表上结点空间动态申请,更适合于表长不确定的情况


4.散列表的查找

数据结构 - 散列表的查找_散列表_08

查找例题:

数据结构 - 散列表的查找_散列函数_09

数据结构 - 散列表的查找_列地址_10

5.散列表的查找效率分析

使用平均查找长度ASL来衡量查找算法,ASL 取决于

  1. 散列函数
  2. 处理冲突的方法
  3. 散列表的装填因子α

数据结构 - 散列表的查找_散列函数_11


几点结论

●散列表技术具有很好的平均性能,优于一些传统的技术

●链地址法优于开地址法

除留余数法作散列函数优于其它类型函数