[数据结构]散列表-链接法和开放寻址法 线性探查

原创 2016年08月30日 23:31:56

在介绍hash表之前首先提到直接寻址表


但是由于实际上存储在字典里的关键字集合K比实际上所有可能的关键字的全域U要小的多,因此散列表所需要的存储空间比直接寻址表要小的多

 


 通过散列函数

h:U -> {0,1,2…m-1}

其中m 远小于|U|


但是对于h(2)=h(5)这样的访问冲突,我们采用两种方法来解决

①  链接法

②  开放定址法

 

链接法,插入最坏运行时间O(1),查找最坏运行时间和表的长度成正比。

 


开放寻址法,所有的元素都存储在散列表中,要系统的检查所有的表项,直到找到所需的元素,或者所需的不在表中。用开放寻址法来插入元素,需要进行探查,直到找到空的槽来存放关键字为止。典型的探查方法有线性探查

 

下面介绍一个线性探查的例子:(本位置X被占据,继续寻找下一个x+1的位置,直到找到空槽为止)
设散列表的长度为11,哈希函数H(k)=(k的第一个字母在字母表中的序号)mod11, 若输入的顺序为(D,BA,TN,M,CI,I,K,X,TA)采用内散列表,处理冲突方法为线性探查法,按要求构造哈希表,在等概率的情况下,查找成功的平均查找长度为?

 

D: 4%11=4   1次

BA:2%11=2   1次

TN:20%11=9   1次

M:13%11=2 已被占据,放在3;                2次

CI:3%11=3 已被占据,放在4;4已被占据放在5   3次

I:9%11=9 已被占据,放在10                    2次

K:11%11=0                                    1次

X:24%11=2 已被占据放在3 已被占据放在4 已被占据放在5 已被占据放在6   5次

TA:20%11=9 已被占据放在10 已被占据放在0 已被占据放在1               4次

所以平均查找长度为(1+1+1+2+3+2+1+5+4)/9 = 20/9

 

 

总结:

 

采用开放定址法处理散列表的冲突时,其平均查找长度高于链接法处理冲突

链接法其中优点有: 
1
、链接法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短
2
、由于链接法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况。

开放寻址法不用指针,潜在地节约了空间,用这些空间可存放更多的槽,从而潜在地减少了冲突,提升了速度。

 

 

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++数据结构--.哈希表线性探测开放寻址法与独立表链地址法

1.哈希函数是个定位函数,它用键作为参数,返回表中的索引值   2.线性探测开放寻址法   *调用哈希函数处理键得到哈希值,用值除以表的长度后取余数,从而确定表中的一个位置   *如果该位置非空...
  • piniheaven
  • piniheaven
  • 2013年08月05日 13:54
  • 1875

哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

一、哈希表 1、概念        哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查...
  • u011080472
  • u011080472
  • 2016年04月18日 09:55
  • 19791

散列表实验报告(不同装载因子下的链表法和开放寻址法的对比)

  • 2010年01月05日 13:14
  • 812KB
  • 下载

Javascript数据结构算法之散列(霍纳算法,开链法,线性探测-寻址法)

使用散列存储数据时,通过一个散列函数将键映射为一个数字,这个数字的范围时0到散列表的长度。理想情况下,散列函数会将每个键值映射为唯一的数组索引。一个更现实的目标是将键均匀分布。 在散列上插入...
  • u011376293
  • u011376293
  • 2017年04月04日 16:12
  • 239

散列 - 数据结构 (分离链接法、开放定址法)

散列是一种用于以常数平均时间执行插入、删除和查找的技术。理想的散列数据结构只不过是一个包含有关键字的具有固定大小的数组。典型情况下,一个关键字就是一个带 有相关值(工资信息等)的字符串。       ...
  • u012796139
  • u012796139
  • 2014年11月27日 17:01
  • 1219

散列表之链接法解决冲突

  • 2015年06月14日 10:19
  • 8KB
  • 下载

链接法散列表的 java 实现

import java.util.*;/* * 此散列表只对提供适当 equals 方法和返回一个 int 型量的 hashCode 方法的对象工作 */ public class Separat...
  • one_of_a_kind
  • one_of_a_kind
  • 2017年07月19日 14:12
  • 91

散列表的C语言实现-分离链接法

一:散列表的定义: 散列表的实现常常叫做散列,散列是一种用于以常数平均时间执行插入,查找,删除的技术,但是,那些需要元素间任何排序信息的操作将不会得到支持,如findmin,findmax等等。散列...
  • u012000209
  • u012000209
  • 2015年08月04日 17:31
  • 1217

散列表碰撞的链接法解决之双向链表删除操作的代价

最近zaikan     浣熊今天读到《算法导论》的第十一章散列表,看到中文书的第135页(英文P224~225)时,被其中的一个知识点难住,想了许久终于有了答案,故撰此文与大家分享 ...
  • chxw098
  • chxw098
  • 2014年11月18日 09:58
  • 869

散列表——分离链接法

散列表由一个二级指针构成,二级指针的每一个节点指向一个单链表。
  • XXNoel
  • XXNoel
  • 2017年05月05日 13:24
  • 172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构]散列表-链接法和开放寻址法 线性探查
举报原因:
原因补充:

(最多只允许输入30个字)