码迷,mamicode.com
首页 > 其他好文 > 详细

哈希表之三冲突解决

时间:2017-07-01 20:50:19      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:哈希法   链表   images   意思   解决   查找   时间   元素   聚集   

前的部分分析了,哈希表中的冲突时难以避免的,冲突是很正常的,所以就要知道如何解决冲突。

我觉得冲突是有两种解决的方法:

1、横向的解决

2、纵向的解决

所谓横向解决:指的是对冲突的键,会在哈希表上另外找一个位置来安放它;

纵向解决是指:在冲突的键上会有一个线性链表,来存储冲突的元素。

 "处理冲突"就是为该关键字的记录找到一个"空"的哈希地址。

在处理冲突时,可能得到一个地址序列:

技术分享

在处理冲突的时候,如果得到另一个哈希地址H1让然发生冲突,则会继续计算下一个地址H2

如果H2仍然冲突,再求得H3。依次类推,直到Hk不发生冲突。

通常处理冲突的方法有以下几种:

1、开放定址法

技术分享

其中H(key)是哈希函数;m是哈希表表长;di为增量序列,可以有下列三种取法:

(1)技术分享,称为线性探测再散列;

(2)技术分享,这种称为二次探测再散列;

(3)技术分享,伪随机数列

其实再给一个序列的意思是,如果遇到冲突了,就可以在冲突的地址基础上,利用给的序列找到下一个位置。

用这个方法有个不好的地方就是,原来对关键字算哈希值的时候,都是相同的hash值,导致的冲突,

但是如果根据这个序列来找,很可能就把原本属于别人的坑给占了,这种现象叫做二次聚集,也是不利于查找的。

用线性探测再散列处理冲突可以保证做到只要哈希表未填满,总能找到一个不发生冲突的地址技术分享

而二次探测再散列只有在哈希表长m形如4j+3(j为整数)的素数时才可能;

随机探测再散列,则取决于伪随机数列。

2、再哈希法

技术分享

技术分享均是不同的哈希函数,即同义词产生地址冲突的时候计算另一个哈希函数地址,直到冲突不再发生,

这种方法不易产生聚集,但是增加了计算时间。

3、链地址法

 即将所有关键字为同义词的记录存储在同一线性表中。

4、建立一个公共溢出区

哈希表中每个地址只存一个记录,只要是冲突的记录都放到另一个表中,叫做溢出表。

 

哈希表之三冲突解决

标签:哈希法   链表   images   意思   解决   查找   时间   元素   聚集   

原文地址:http://www.cnblogs.com/tuhooo/p/7103338.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!