真正理解哈希表(散列表 )冲突和堆积



前言

今天数据结构的散列表作业有道题目,我依稀记得以前做过这道题目,相信很多同学也做过,直接秒选,结果答案错了,百思不得其解,最后再老师耐心的解释,原来如此,那我之前不知道是看什么视频做的什么题目讲的是错的咯。


一、题目如下

开放地址法中由于散列到同一个地址而引起的“堆积”(又称“二次聚集”)现象,是由( )
A. 同义词之间发生冲突引起的
B. 非同义词之间发生冲突引起的
C. 同义词与非同义词之间发生冲突引起的
D. 散列地址“溢出”引起的

  • 看到题目秒选C的,答案却是B

二、概念解释

来看清华大学严奶奶这本书里面是怎么解释的。

1.冲突和同义词

  • 不同的关键字可能得到同一哈希地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该哈希函数来说称做同义词
    也就是说key1和key2是同义词.

2.堆积(二次聚集)

  • 当表中i,i+1,i+2位置上以填有记录时,下一个哈希地址为i,i+1和i+2的记录都将填入i+3的位置,这种在处理冲突过程中发生的两个第一个哈希地址不同的记录争夺同一个后继哈希地址的现象称做"二次聚集",即在处理同义词的冲突过程中又添加了非同义词的冲突.

三、个人理解

可能有些人看完了概念解释还是有点模糊,我尽可能说的白话一点。

  • 冲突

用来描述同义词占同一个位置所造成现象

就是不同的关键字但是哈希地址一样,多个关键字占同一个位置,这种现象称为冲突

非同义词它们的哈希地址是不一样的。也就不会造成占同一个位置的情况。

为了解决冲突这个现象,就使用了开放定址法来解决。

但是,使用了开放定址法来解决同义词的冲突,却出现了新的问题

  • 堆积(聚集或二次聚集)

用于描述本不应该冲突的非同义词,却因为冲突解决方法(开放定址法)反而造成的新的冲突。

本来非同义词是不会堆积的,只是因为开放地址法解决两个同义词冲突时提前把非同义词的哈希地址给提前占用了。


总结

所以在看那道选择题,产生堆积的现象是由非同义词之间发生的冲突引起的,

如果时同义词发生的冲突,就不叫堆积了,那就叫做冲突

如果实在还是没明白的话,可以找个哈希表的题目看一下,
若在求A关键字的哈希地址的时候,如果该地址被B关键字占用,那就看看B关键字的哈希地址是否和A的哈希地址一样,

若B的哈希地址和A的哈希地址一样则是同义词冲突,

若B的哈希地址和A的哈希地址不一样,说明B是之前的同义词冲突提前把A的位置占了,这就是堆积

  • 28
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
### 回答1: 创建哈希表时,可以采用拉链法来解决冲突,即将哈希值相同的元素存储在同一个链表。构造散列表时,需要确定哈希函数和哈希表的大小。哈希函数可以根据具体的需求来设计,而哈希表的大小应该足够大,以避免冲突的发生。 在使用哈希表进行查找时,需要先计算出要查找的元素的哈希值,然后在对应的链表进行查找。如果链表存在该元素,则查找成功;否则,需要继续查找下一个元素,直到找到或者遍历完整个链表。 平均查找长度是指在哈希表查找一个元素时,需要遍历的平均链表长度。它可以通过统计哈希表所有链表的长度,并计算平均值来得到。平均查找长度越小,哈希表的性能就越好。 ### 回答2: 散列表(HashTable)即哈希表,是一种通过关键码值直接进行访问的数据结构,也称为散列设计、哈希散列和数字散列。在构造哈希表时,可能存在不同的关键字映射到同一个位置(即冲突),为了解决这种冲突,常用的方法是拉链法。 拉链法是一种解决哈希表冲突的常用方式。在这种方法,将散列表的每个位置上设置一个链表(或者其他的数据结构),当发生哈希冲突时,就将数据插入到相应位置的链表。具体操作过程如下: 1.创建一个基于拉链法的哈希表。 2.确定哈希表的大小,将一个含有n个元素的集合映射到大小为m的哈希表,通常情况下,m > n,选择质数可以降低冲突的可能性。 3.对于给定的键,计算哈希函数,得到该键对应的哈希桶的位置,并将该键值插入到这个桶。 4.如果不同的元素的哈希函数值相同,则在该桶进行链式存储。 5.当需要查找一个元素时,首先通过哈希函数得到它在哈希表的位置,然后在对应的链表上进行查找。 通过拉链法解决冲突散列表,其平均查找长度的计算公式为ASL=α+(1-α)*(1+1/2+1/3+...+1/1-k),其,ASL为平均查找长度,α表示散列表填入元素的个数与散列表长度n的比值,k表示散列表链表的长度。 在哈希表的创建和哈希函数计算,需要注意哈希函数的设计,使得映射到哈希表的散列桶分布均匀,减少哈希冲突的可能性。同时,在确定散列表大小时,选择足够大的大小也可以有效减少哈希冲突的发生。 总之,拉链法是一种常用的哈希表冲突解决方法,能够有效提高哈希表的查询效率和存储效率,对于大规模的数据处理和查找操作,使用哈希表可大幅提高程序的性能。 ### 回答3: 哈希表是一种数据结构,它可以将任意长度的数据映射成固定长度的数据,这个映射规则称为哈希函数。哈希函数通常将数据映射到一系列整数值的一个,这个整数值就是数据的哈希地址。哈希表的结构非常适合用于实现查找表,因为它可以在常数时间内查找和插入元素,也就是说,这两个操作的时间复杂度是O(1)。 拉链法是一种解决哈希冲突的方法,它的基本思路是将哈希表的每个槽存储成一个链表,如果多个元素的哈希地址落在同一个槽上,就将它们放到这个槽对应的链表。这样,每个元素可以通过对应的哈希地址找到自己所在的槽,然后再在链表查找。如果使用这种方法,哈希表的时间复杂度就会增加,因为查找一个元素的平均时间会变为O(1+m/n),其m是哈希表的大小,n是元素的数量。但是,实际上,在一般情况下,m可以很大,因此,m/n的值通常很小,所以平均查找长度仍然很短。 要创建一个哈希表,首先需要选择一个合适的哈希函数,然后确定哈希表的大小,接下来就可以开始构造哈希表了。 例如,我们要创建一个大小为10的哈希表,使用一种简单的哈希函数,就是将元素的值除以10,然后取余,这样就可以将任意整数映射到0-9之间的一个整数。然后,我们就可以将哈希表的每个槽都初始化为空链表。如果要插入一个元素,就将它的哈希地址计算出来,然后将它放入对应的链表。如果要查找一个元素,就计算它的哈希地址,并在对应的链表查找,直到找到该元素或者链表为空为止。 如果要输出平均查找长度,即每次查找的平均次数,可以定义一个计数器,每次查找操作都将计数器加1,最后除以元素的总数即可。假设我们有n个元素,哈希表大小为m,每个链表的平均长度为k,则平均查找长度为(n/m)*k。这个值的大小与哈希函数的选择、哈希表的大小、元素的数量和哈希冲突的解决方法等多方面因素有关。因此,在设计哈希表时,需要根据实际需求进行合理的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X在学了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值