首页 > 编程知识 正文

hash碰撞的解决办法,hash冲突是什么意思

时间:2023-05-03 09:58:02 阅读:21600 作者:3945

目录

一.散列冲突

二、解决Hash冲突

2.1开放地址法

2.1.1线性检测法

2.1.2二次检测法

2.2重新散列法

2.3链地址法

2.4创建公共溢出区域

另一方面,哈希冲突混列冲突是指在将数据存储到混列表中时,首先使用混列函数计算存储该数据的地址。 但是,这个地址已经存在值,所以这个时候发生了散列冲突。 也就是说,具有不同key值的元素可能映射到哈希表中的同一地址。

二、解决哈希冲突2.1开放地址法发生冲突后,下一步去查找空闲的哈希地址。 只要哈希表足够大,就会始终找到空的哈希地址并存储数据元素。 那个数学递归公式

式中,I=1,2,k(k=m-1 ); m是表示哈希表长度的增量序列。

2.1.1线性检测法

=1,2,m-1时称为线性检测法。 其特征在于,发生冲突时,依次查看表中的下一个单元,如果检测到表位地址m-1,则下一个探测地址为表起始地址0,直到找到空单元(末尾满时一定找到空单元)

例如,散列表长度为10,并且以关键字末尾的数字作为散列地址,依次插入共计8个记录45、22、13、65、29、42、79、2。 发生冲突时采用线性检测法。

1 )先插入45、22、13,哈希表为空时插入,所以直接插入对应的地址。 (图a ) )。

2 )根据图a插入65、29、42,插入42和65时发生冲突,然后依次进入下一个单元,有空单元直接插入; 如果没有可用设备,请前进到下一个设备,直到找到可用设备。 (图b ) )。

3 )在图b中插入79、2,原理与上面相同。 但是,插入79时,发生了冲突,其位置在散列表的末尾,因此只能从散列表的开头寻找空闲单元。 (图c ) )。

4 )如果除图c之外还插入64,那么当插入64时,其位置已经被42所占,但该位置原本不属于42。 在这种情况下,我们就是“堆栈”。 然后只能去下一个单元,直到找到空闲的单元。 (图c ) )。

2.1.2二次检测法当然,其中k=m/2,m必须是可表示为4k 3的素数时,称为二次检测法,也称为平方检测法。 二次检测法是一种很好处理碰撞的方法,可以避免“堆积”问题。 虽然不能检测散列表上的所有单元,但存在不能检测到至少一半的单元的缺点。

例如,如果有关键字集合{47、7、29、11、16、92、22、8、3},散列表长度为11,散列函数为h(k )=k,则用二次检测法处理冲突而得到的散列函数

为关键字查找空哈希地址时,只有关键字3与线性探测方法不同,h(3)=3,哈希地址冲突,有的,还有冲突),找到空哈希地址,存储3。

2.2重散列法同时构造多个不同的散列函数。

2.3链地址法是将所有哈希地址为I的元素组成一个称为同义词链的单链表,单链表的开头指针位于哈希表的第I个单元,因此搜索、插入和删除主要在同义词链中完成链地址法适用于频繁插入和删除的情况。

2.4创建公共溢出区将哈希表分为基本表溢出表两部分,与基本表冲突的因素均填写溢出表。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。