散列(hash)表

散列(hash)表(建立了关键字和地址的直接映射)

查找:

步骤1) 用散列函数将被查找的键转化为数组的一个索引常用方法:除留余数法k%M;

步骤2) 处理碰撞冲突 (拉链法、线性探测法)

散列函数

  1. 定义域为所有的关键字,值域取决于地址范围的大小;
  2. 应该能使计算出来的地址等概率均匀的分布在整个空间;
  3. 减量简单;

一、散列函数常用的方法:
1、直接定址法;

 优点:简单、均匀,也不会产生冲突。

 缺点:需要事先知道关键字的分布情况,适合查找表较小且连续的情况。

  1. 除留余数法(通常p为小于或等于表长(最好接近m)的最小质数);

二、处理冲突常用方法:

1、开放定址法(既对同义词开放也对非同义词开放)(只能逻辑上删除元素,否则无法向下继续访问其他元素,不适用于经常进行插入删除的情况)

(m是表长,di为增量序列)

(a)线性探测法:

di=1、2、3、4.........

造成大量的关键字位移,产生堆积现象;

(b)二次探测法

di=12, -12, 22, -22.........q2, -q2(q<= m/2)

不能探测到表的所有元素

(c)再散列函数法

(d)随机探测法

2、拉链法(适用于经常进行插入删除的情况)

将所有关键字为同义词的记录存储在一个单链表中,称这种表为同义词子表,在散列表中只存储所有同义词子表前面的指针,例如

散列(hash)表_第1张图片

三、散列表的性能

查找效率取决于:散列函数、处理冲突的方法、装填因子

所谓的装填因子a = 填入表中的记录个数/散列表长度。a标志着散列表的装满的程度。当填入的记录越多,a就越大,产生冲突的可能性就越大。也就说,散列表的平均查找长度取决于装填因子,而不是取决于查找集合中的记录个数。

你可能感兴趣的:(数据结构)