散列表

散列表的查找:

基本思想:记录存储位置和关键字之间的对应关系——hash函数

散列函数H(key)= k;

优点:查找效率高

缺点:空间效率低

散列表若干术语:

散列方法(杂凑法)
选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;

查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行比,确定查找是否成

功。
散列函数(杂凑函数):散列函数中使用的转换函数。

冲突:不同的关键码映射到相同的散列位置

在散列查找方法中,冲突是不可避免的,只能去尽量减少。

key1不等于key2,但是H(key1)=H(key2)

散列表
同义词:具有相同函数值的多个关键字。

散列函数的构造方法:

使用散列表要解决好两个问题:

1)构造好的散列函数

(a)所选函数尽可能简单,以便提高转换速度;

(b)所选函数对关键码计算出的地址,应在散列地址集中致均匀分布,以减少空间浪费。

2)制定一个好的解决冲突的方案

查找时,如果从散列函数计算出的地址中查不到关键码,则应当依据解决冲突的规则,有规律地查询其它相关单元。

构造散列函数考虑的因素:

1.执行速度

2.关键字的长度

3.散列表的大小

4.关键字的分布情况

5.查找频率

根据元素集合的特性构造:

● 要求一: n个数据原仅占用n个地址虽然散列查找是以空间换时间,但仍希望散列的地址空间尽量小

● 要求二:无论用什么方法存储,目的都是尽量均匀地存放元素,以避免冲突。

构造方法:

1.直接定址法

2.数字分析法

3.平方取中法

4.折叠法

5.除数留余法

6.随机数法

直接定址法:

散列表
除数留余法

散列表

处理冲突的方法:

1.开放地址法

2.链地址法

3.再散列法

4.建立一个公共溢出区

开放地址法:

基本思想:有冲突时就去寻找下一个的散列地址,只要散列表足够大,空的散列地址总能

找到,并将数据元素存入。

散列表

二次探测法:(重点)

散列表
链地址法:
基本思想:相同散列地址的记录链成一个单链表
散列表
链地址法建立散列表的步骤:

● Step1:取数据元素的关键字key,计算其散列函数值(地址)。若该地址对应的链表为空,则

将该元素插入此链表;否则执行Step2解决冲突。

● Step2: 根据选择的冲突处理方法,计算关键字key的下一个存储地址。若该地址对应的链

表为不为空,则利用链表的前插法或后插法将该元素插入此链表。

链地址的优点:

1.非同义词不会冲突,无聚集现象

2.链表上结点空间动态申请,更适合表长不确定的情况;