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

原创 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
、由于链接法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况。

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

 

 

 

 

 

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

相关文章推荐

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

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

散列表的开放寻址法

开放寻址法(open addressing)中,所有元素都存放在槽中,在链表法散列表中,每个槽中保存的是相应链表的指针,为了维护一个链表,链表的每个结点必须有一个额外的域来保存它的前戏和后继结点。开放...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

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

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

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

散列 - 线性开型寻址散列

hashtable.h /******************************************************************** purpose: 线...

查找算法—散列表

散列表散列表在查找当中使用非常广泛(本文当然也还会说明删除等其他操作) 本文主要说明散列表的两种解决冲突的办法散列表查找散列表:对于很多复杂类型的键值,我们可以用一个数组来实现无序的符号表,将键值通...

散列表-开放地址法和链地址法的实现

基本定义散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字key对应一个存储位置f(key)。这种对应关系f称为散列或哈希函数。采用上述思想将数据存储在一块连续的存储...
  • zwhlxl
  • zwhlxl
  • 2015-06-30 21:21
  • 2393

数据结构之哈希表

具体介绍见MIT算法导论-第7,8讲-哈希表Java 集合之 HashMap详细介绍(源码解析)和使用示例HashMap详细介绍(源码解析)和使用示例下面给出两种实现1.基于拉链法的散列表packag...

散列表(Hash Table)

散列表也称作为哈希表,它是一个动态表,然而它支持字典的操作,因为它的存储一个值,需要相应的键。在查找一个值时,也需要一个键。最基本的操作就是:insert, search以及delete。散列表作为一...

数据结构:散列2(探测法)

上一章的内容:散列1:分离链接法 对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现 散列表的填装因子(load factor)λ为散列表中的元素个数...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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