发布时间:2025-11-21 19:55:15 点击量:
HASH GAME - Online Skill Game GET 300
汤姆老师咨询一个面试题,哈西麦普应该如何解决哈西冲突?哈西麦普的底层的话,是采用数据的结构来存储数据元素的,当我们去调用铺的方法添加数据的时候,哈西麦普呢,就会根据 k 的哈西值 取磨运算啊得到一个数值,那么这个数值呢,用的是哈西麦普底的这个数组的下标位置, 所以呢,兔子的数据呢,最终会保存在数组的下标对应的位置上。所谓哈西冲突呢,就是哈西麦普在铺头值的时候呢,有两个不同的哈西值的 t, 他有一定的几率呢会落到同一个数组下标上, 也就是说他们的哈西直取模之后会得到同一个结果。所以呢,哈西麦为了解决这么一个问题呢,就引入了一个面试寻指的方法,也就是说,哈西麦部呢,会把这些存在冲突的 t 组成一个单 向列表,采用尾插法,把这些 t 呢插入到列表的一个尾部。另外呢,为了避免列表过长而影响查询效率,他先迈普呢,再检测到列表长度,他大于八,并且呢速度长度呢大于六十四的时候呢,他先迈普呢,会把这个列表转化为红黑数, 从而去降低列表数据查询的时候的一个实现复杂度,达到一个提升产生信任的目的。除了逆势行驶方案,还有哪些方法是可以避免哈气冲突的呢? 计划连号跳槽,一定要提早准备,给大家准备了一份加瓦程序的一个求职突击手册,包含简历模板, 念诗突击押题一周的一个技术提升和加瓦提升的一个完整学习路线。领取方式呢?放在我视频主页,以色在手,保你高薪无忧。今天我就总结三种吧。第一种的话是在哈西法,也就是说 如果某个哈西函数产生了冲突,再用另一个哈西函数进行计算,比如说不能过滤器,就是采用这种方法。那第二种呢,就是开放性处罚,也就是说直接从冲突的数组的位置往下寻找一个空的数字下标,然后呢对数据进行存储, 图书在随着 logo 中就会有熟的这种方法。第三种呢,就是可以去建立一个公共的易出区,然后呢把存在冲突的 k 统一存在一个公共的易出区里面进行统一处理。
哈西算法哈西冲突的解决方案?首先我们了解一下哈西冲突的基本概念,以 gdk 当中的哈西迈克为例, 哈西迈普的实线是以散列表为基础,当元素 a 和元素 b 通过同一个哈西算法 进行哈西运算,并且定位到哈西表当中相同的位置是即产生了哈西冲突,那么这种冲突可能是哈西算法得到的值相同产生的等值碰撞,或者定位的地址相同产生的等值碰撞。 那么看一下解决方案,第一个解决方案,链接之法哈西迈普中呢,他会采用链表来记录当前发生哈西冲突的元素,具有处理 简单的特点,但会造成空间浪费,也要考虑链表过长的这个缺陷,所以哈西麦普用红黑数来优化这一问题。解决方式二,开放地址法,也就是所有的地址对所有的值开放。当哈西表中存在某一些元素, 当一个元素需要插入时,产生冲突的时候,通过主次向下找,直到找到不冲突的地址,成为现行探测的方式。 那么可以扩展现行方式的这个不长,通过平方累加的方式进行跳跃查找不冲突的元素成为在平方探测, 也可以通过随机函数来计算,随机数加上哈欠冲突的位置来得到下一个位置,成为随机探测。 第三个方法是在哈西法,在哈西法指的是冲突的哈西,指通过再次的哈西运算处理,直到没有哈西冲突。 最后一种方式是建立公共溢出区的方式,将所有冲突的哈西元素呢放入到一个公共溢出区去处理。
hash map 是如何解决 hash 冲突的?首先, hash map 底层采用了数组的结构来存储数据元素,数组的默认长度是十六。当我们通过 put 方法添加数据的时候, hash map 根据 key 的 hash 值进行曲模运算, 最终保存到数组的指定位置。但是这种设计会存在 have 冲突问题,也就是两个不同 has 值得 key 最终曲模后会落到同一个数组下标,所以 hash map 引入了链式巡止法来解决 have 是冲突问题。对于存在冲突的 key, hash map 把这些 key 组成一个单向链表,然后采用尾插法把这个 key 保存到链表的尾部。另外,为了避免链表过长的尾 问题,当链表长度大于八,并且数组长度大于等于六十四的时候, hash map 会把链表转化为红黑数,从而减少链表数据查询的时间复杂度问题,提升查询性能。 最后再补充一下,解决 has 冲突问题的方法有很多,比如一在 has 法就是如果某个 has 函数产生了冲突,再用另外一个 has 进行计算,比如不容过滤器就采用了这种方法。二,开放巡止法, 就是直接从冲突的数组位置往下寻找一个空的数组下标进行数据存储,这个在 threat local 里面有使用到。三,建立公共溢出区,也就是把存在冲突的 key 统一放在一个公共溢出区里面。
哈喽,大家好,我是麦克,今天我们来分享一道工作一年左右的一个面试题,最近很多粉丝在面试的时候啊,都会遇到这样一个问题,这个问题是哈西麦是如何去解决哈西冲突的?很多人觉得这个问题很简单啊,但是我认为高手的回答会更好一点。文字本的回答已经整理好了,大家可以在我的主页去加微领取啊。 下面我们来看看普通人和高手对于这个问题的回答。普通人的回答,嗯,哈西麦不解决哈西冲动方式,呃,我记得是用那个链表的方式,用单向链表就说,嗯,如果承认哈西冲动的话,他会把那个纯纯的冲突这样一个一个间直,对啊,会保存到那个链表的尾部, 嗯,对,是这样的。嗯,高手的回答,好的,这个问题呢,我需要从几个方面来回答,首先啊哈西麦部底层是采用了数组的这个结构来存储数据元素,数组的默认长度呢是十六。当 我们通过破的方法去添加数据的时候,啊哈西面不会根据 k 的哈系直进行曲模运算,最终把这样一个直啊保存到数组的一个指定位置。但是这样一个设计方式会存在哈系冲突的问题,也就是说两个不同哈系直的 k 最终取模以后会落到同一个数组下标。 所以啊,哈西迈步引入了一个烈士巡视法来解决哈西冲出的问题。你说对于存在冲突的 k 呢?哈西迈步把这些 k 组成一个单向链表,然后采用尾插法把这个 k 呢保存到链表的一个尾部。 另外,为了避免链表过长导致我的查询效率下降,所以当链表长度大于八,并且速度长度大于等于六十四的时候,啊哈西曼不会把当前的链表转换为红横竖,从而去减少链表数据查询的一个实践复杂度的一个问题,来提升查询效率。 最后再补充一个点啊,解决哈西冲突方法有很多,比如说第一个在哈西法,比如说如果某个哈西函数产生了冲突,那么再用另外 哈西函数进行计算,比如说像波龙过滤器就采用这样一个方法。第二个开放寻指法,就是说直接从冲突的数组位置向下去寻找一个空的数据下标进行数据的存储,这个在 svr 的 logo 里面有使用到。第三个是建立公共溢出区,也就是说把存在冲突的 t 统一放在一个公共的溢出区里面去进行存储。 以上就是我对这个问题的一个理解,哈西充的这个问题呢,在业务开发的过程中啊,比较少遇到,但是从解决问题的方法里面,我们可以学到很多技术的设计思想,不管是为了面试还是为了长期的职业发展,我认为这个技术点都是有必要去深度理解的基础知识。 好的,本期的普通人 vs 高手的面试系列视频就到这结束了,喜欢我的作品的小伙伴记得点赞、收藏加关注,我是麦克,一个工作了十四年的家务程序员,我们下一期再见。
一天一道面试题,讲下 highsmap 的数据结构。在扎的中保存数据有两种比较简单的数据结构,数组和链表。数组的特点是寻指容易,插入和删除困难。而链表的特点是寻指困难,插入和删除容易。 常用的哈西函数的冲突解决办法中,有一种方法叫做链地之法,其实就是将数组和链表组合在一起,发挥两者的优势。我们可以将其理解为链表的数组。在 jdk 一点八之前,哈西骂不就是通过这种结构来存储数据的。 我们可以从上图看到,左边是一个数组,数组的每个成员是一个列表,该数据结构所容纳的所有元素均包含一个指针,用于元素间的链接。我们根据元素的自身特征把元 分配到不同的列表中去。反过来,我们也正是通过这些特征找到正确的列表,再从列表中找出正确的元素。其中根据元素特征计算元素数组下标的方法就是哈西算法。 在 j d k 一点八中,为了解决哈西冲突导致某个列表长度过长,印象破合 get 的效率,又引入了红黑术。
hashmap 是如何解决哈西冲突的?为了解决碰撞,数组中的元素是单向链表类型,当链表长度到达一个玉值时,会将链表转换成红黑树,提高性能。而当链表长度缩小到另一个玉值时, 又会将红黑树转换回单向列表,提高性能。 hash map 和 hashtable 的区别一、 hashtable 是一个县城安全的 map 实现,但 hash map 是县城不安全的实现,所以 hash map 比 hashtable 的性能高一点。二、 hashtable 不允许使用闹作为 t 和 value。 如果试图把闹值放进 hashtable 中,将会引发空指针异常,但 hash map 可以使用闹作为替货 value。 hash map 与 concurrent hash map 有什么区别? hash map 是非现成安全的, 这意味着不应该在多线城中对这些 map 进行修改操作,否则会产生数据不一致的问题,甚至还会因为并发插入元素而导致列表循环,这样在查找时就会发生死循环, 影响到整个应用程序。 collections 工具类可以将一个 map 转换成现成安全的实现,其实也就是通过一个包装类, 然后把所有功能都委托给传入的 map。 而包装类是基于 synchronize 的关键字来保证现场安全的。 testable 也是基于 synchronize 的关键字,底层使用的是护翅锁,性能与吞吐量比较低。 concurrent hashmap 的实现细节远没有这么简单, 因此性能也要高尚许多。他没有使用一个全局锁来锁住自己,而是采用了减少锁力度的方法,尽量减少因为竞争锁而导致的阻塞与冲突。而且 concurrent hashmap 的检索操作是不需要锁的。
这节我们来学习哈西曼虎,今天内容有七点。首先我们来介绍一下什么是哈西曼,哈西散念或哈西的意思, 迈普映射的意思。哈西迈普,哈西映射,顾名思义,他是以 k v 六形式测出数据的,而且这些数据保存在数组中,默认的初始容量为十六。 数组的特点是有序,但哈奇卖部里面的元素并不是按顺序存放的,而是先根据 k 计算出元素的哈奇值。在鱼上数组容量减一, 这个操作等同与数的容量,取于得到的与数就是元素的位置,如此以来,势必会有多个元素被分配到同一个位置上。那该怎么办呢?他先慢步用 列表将这些元素单向的连接起来,这样就解决了多个元素位置冲突的问题。这样存了以后该怎么取呢?取出的顺序先从数组下边名开始,再从列表头节点开始,意思是柠檬、苹果、香蕉、葡萄 一次。究竟是不是这个顺序?我们来写一个程序验证一下,从执行结果来看,和我们刚刚说的顺序一致。说到这里,我们可以总结出汉斯曼普的第一个特点,五序元素从容的顺序和取出的顺序不一致, 这也是他唯一的缺点。接下来再来看哈西漫步的第二个特点,我们在计算元素哈气值的地方发现了退还可以围绕,并且还给他分配了哈气值, 是您。由此我们可以总结出哈西漫步的第二个特点,可以可以为让,并且哈气值为零。接下来再来看哈西漫步的第三个特点, 通过前面的知识,我们知道 k 相同,哈气值就一定相同,位置也相同,出现这种情况,新值会覆盖旧值。由此,我们可以总结出哈欠漫步的第三个特点, k 不可以重复,重复的 k 新值会覆盖旧值。接下来再来看哈西重土是怎么回事,他是两个不相同的 k, 产生了相同的哈西值。 我们把这种情况称之为哈西重土,也叫哈西碰撞。发生碰撞的本质还是取值范围的问题。例如一个二定周围,他的取值范围是零到一,落在它里面取哈西 的话,要么是零,要么是一,此时发生碰撞的概率是二分之一。也就是说,如果有三个 k 十,就一定会发生碰撞。如果我们将哈吸值的长度扩大到十六个二斤周围,那么他的取出范围就会越大,发生碰撞的概率就会越小。 在哈气慢破中,哈气值是硬特类型,四个字节长度是三十二个二斤周围碰撞的概率是四十二分之一。更长的哈气值意味着发生碰撞的概率更低,但也需要更大的存储空间和更多的计算, 我们需要在性能和成本之间做好权衡。接下来再来看什么是竖画?什么是念画。竖画是当列表长度大于八,且数字容量大于等于六十四时,将列表转换 化为红灰数。红灰数是一种自平衡的二招数,这样做的目的是为了提高查询速度,因为列表一旦长了以后,查询就会变得很慢。另外,红灰数也会变回列表。当红灰数中的节点小于等于六时,红灰数将转化为列表, 这个过程称之为炼化。此时的节点数很少,列表与红灰数的差距速度不相上下,而且在新增元素的时候,列表不用计算结点的位置直接插在尾部,但红灰数还有计算结点的位置, 他们两个相互转换可以形成很好的互补。大家需要注意的是,哈西万户在杰西 k 一点八中才引入的红灰数,以前采用的是数组加列表这种形式。 接下来再来看看新买部如何扩容。当元素个数超过零戒指时,看新买部就需要扩容。 银戒指等于容量乘以负载因子,扩容后的容量是之前的两倍。频繁扩容很影响哈西万普的性能,所以设置合适的初始容量与负载因子至关重要。接下来再来看哈西万夫的常用方法有哪些。哈西万夫实现了漫步接口, 拥有迈克里面的所有方法,但是在这些方法里面,他只有八个方法是常用的, 其中铺头和对的方法用的最频繁。最后总结下本节内容,本节介绍了哈西映社哈西漫步他的特点及优缺点,这里就不带坠数了,在实际开发中,他是用的最 频繁的容器之一,多用于缓存数据。这截的方法分类图和详细说明我放在了 gitth 上,大家如果有需要的话可以前去查看。
hashmap 与 hashtabo 有什么区别?一建成安全方面,哈西麦头是非现场安全的,哈西 table 是现场安全的,哈系 table 内部的方法基本都经过森扣纳斯的修饰,如果你要保证现场安全的话,就使用坑卡尔的哈西麦头吧。 二效率方面,因为现场安全的问题,哈西麦要比哈西黑狗效率高一点,另外哈西黑狗基本被淘汰,尽量在战马当中不要使用。三对空气和空 rale 的支持,哈西麦当中 no 可以作为箭,这样的箭只有一个,可以有一个或多个箭所对应的职位呢, 但是在 happy paper 当中铺的进的间值只要有一个呢?直接抛 noponous exception。 四底层数据结构方面, cdk 一点八以后的哈西麦棚在解决哈西冲突时有了较大的变化,当链表长度大于发值时,将链表转化为红黑树以减少搜索时间。哈西 table 没有这样的机制。大家还知道哪些区别吗?欢迎在评论区补充,孩子请不要再内卷!
大家好,我是图林康的北冥,那么我们上一讲呢,跟大家去聊到了我们这个散列表,它在一个最好的情况下面,哎,我们可以直接把我们这个 key, 然后通过哈西函数直接定位到我们这个数据,通过一个 o e 的时间复杂度就能够直接查出来。 虽然说一个好的哈西算法,他能够平均分布,从而去减少我们冲突的一个概率,但是冲突呢,是始终无法避免的,因为我们的 k 他是一个非定长的,而我们生成出来的哈西扣的呢,他却是一个定长的。 举个例子,我们一个十六位的一个二进制的哈西值,他产生碰撞的可能性呢是六五五三六分之一,也就是说如果有六五三七个用户,那么他就一定会产生碰撞。而在我们骄傲当中, inter 类型呢,他是四个字节,也就是三十二个二进制位组成的,那么他发生冲突的 概率呢是四十二亿分之一。那么对于这一点呢,我们是不用太过于的担心了,但是实际的情况我们会发现我们的一个结构是一个数组,对不对?我不可能直接用我们的哈士扣的呢,去获取到我们的一个下标,我们中间呢还是需要有一个曲模的一个转换, 因为我们计算机它的一个空间呢,是一个有限的,我不可能一开始呢就直接给它去分配 inter 的一个最大值的一个空间,那么像我们的哈西 map, 它默认的一个容量呢,也就只有十六,那么它发生冲突的一个概率呢?哎,是一个极高的了。我们时常会碰到两个关键字啊, 就比如说一不等于二,对不对?但是哎,我们通过我们的哈气算法,他他们俩之间生成出来的哈气扣的值呢?哎,他却是一样的。那么我们把这种现象呢,也被称之为冲突,并且把 k 一和 k 二称之为这个三的函数的同一词。尽管我们可以通过 优化我们的散力函数,让冲突呢尽可能的少,但是呢,也不可能完全避免,所以说我们只能通过另外一种方式来去解决我们这个问题。 怎么去处理冲突呢?就是一个很重要的一个课题了,那么我们如何去解决这个问题呢?实际上意念呢,有两种方案,一种叫做开放寻知法,一种叫做拉念法,哎,我们也可以称之为念地之法,名字呢不重要,大家能明白他的意思呢就 ok。 那么念 d 指法到底是怎么实现的呢?我们再去看一看。念 d 指法呢,是业界用的比较多的一种方案, 不论是说在我们的哈西 map 里面,还是说在我们的 release 里面,它都是通过这种方案来去解决我们哈西冲突的。在散列表当中,我们每一个桶,或者说我们把它称之为槽,它都会去对应一条列表,那么所有散列值相同的 元素或说取模取到的值相同,那么我们都会放到一个相同的槽位,他所对应的一个列表当中去。当我们插入的时候,我们只要通过散列函数计算出他所对应的一个槽位,然后把它插到相对应的列表当中去就 ok 了。 所以说他抄的时间复杂度呢,是一个 oe 的复杂度,当查找删除一个元素,我们同样可以通过三列函数计算出相对应的一个槽的位置嘛,然后去便利整个列表去查找或者说去删除。那么查找或者说删除的一个时间复杂度呢,实际上它是和我们整个列表的长度是成正比的。 那么在最差的情况下面来说呢,查找或者说删除的一个时间复杂度呢,是一个 o n 的一个复杂度。那么通过念地址法这种方案呢,我们就能够去解决我们哈西冲突的一个问题了。但是念表的一个 效率呢,实际上是并不那么好。在我们的 g d k 七中呢,我们的哈奇 map 呢,就是通过我们的数组将我们的列表去实现的,但是到了 g d k 八呢,它发生了一些改变, 他在此的基础上面,如果说我们列表的长度大于八,并且我们数组的容量呢大于六十四,那么在这种情况下,我们的列表呢,会转换成我们的一个红黑素,红黑素的一个查询效率呢,是一个稳定的 logon 的一个查询效率, 那么在大部分场景下面来说,红黑素的查询效率会比我们念表高,而且更加的稳定,但是同样他也有一些缺陷啊, 这里呢,也就是说为什么是大于这两个条件,他才转成了我们的红黑树,因为我们的树形结构,他的一个增商改的成本会更高一点,因为他涉及到了我们树不断的左旋右旋,然后还有一个变色。那么红黑树呢,这个我们后面再去展开讲啊,从宏观层面来说,伞列表和哈气冲突呢, 我们讲到这个地方就结束了,那么我们下一讲呢?我们再从微观的角度,我们去分析一下,在我们哈西 map 源码里面它是怎么样去解决哈西冲突?它是怎么样去进行取膜运算的?
大家好,我是图林康的北冥,我们都知道在哈西 table 中,哎,我们的冲突都是无法避免的,对吧?哎,像我们常用的哈西 map radis 啊,他都是用我们的念地之法来解决我们这个冲突,那么大家可能对我们的开放定之法 了解的比较少啊,那么今天我们就仔细来聊聊,那么开放定制法的一个核心思想呢,就是说如果,哎,我有一个数据,经过了哈西之后,我得到了一个定长的哈西马,对吧?哎,但是我们数组是不是有限的,所以说我们这个时候要去进行一个曲模运算, 那么在我们取膜的这个过程当中呢?哎,我们一定会遇到冲突,那既然冲突无法避免,那么我们就去找下一个坑位,哎,直到找到了空闲的位置,那么我们这边呢,也跟大家去演示一下, 假设 a, 我们当前是创建了一个空的数组,对吧? 哎,我们插入一个五来看看,哎,他留在第一个坑位,对不对?好,那么我们再来插入一个十 好,我们会发现他是先找到了五的这个坑位,哎,他发现五这个坑位已经被占了,对吧?然后他就会去进行一个对比,哎,如果说五不等于十好,那么这个时候他再去寻找第二坑位, 那么我们再加一个演示一遍,看一下,我们加一个失误,那么我们可以看到 a, 它是先是从五跳到了十,然后再跳到了十五,对不对?那么这个呢? a 就是我们线性探测的一个思想,那么它是支持我们的查找删除新增的, 但是里面会有几个坑啊,那么这里呢,也跟大家去普及一下,就是说,哎,如果我们发生冲突了,我们怎么找到一个正确的值呢?那么我们在这边演示的时候,可能是五十,对不对?哎?但是我们在实际使用的时候,比如说我们 哈士 map 里面,我存放的是一个 window 值,对吧?哎,那么我是通过我们的 key 去查找的,所以说我们通过线性探测的这种方式,我们每一个槽里面,哎,我们都要放它的一个 key 和它的一个 window, 而不仅仅是说只放 window 了,这样呢它会导致一个空间的增大, 而且每次我都要去进行一个值的匹配,那么他的效率呢?也是有所下降的。好,那么第二个,在一般情况下,哎,如果我们没有遇到哈西冲突的话,那么他的一个时间复杂度呢?是 o 一,但是在一些极端的场景下面,哎,他的一个时间复杂度可能达到一个 o n。 好,那么这呢我们也演示一下,比如说我们要查找我们十五的这个值,对吧?好,我们去进行一个执行, 我们可以看到他是先找到五的这个下标位,然后没有,然后去对比,哎,五跟十五不一样,对吧?哎,然后他再去对比下一位,就是我们的十,哎,他对比也不一样,然后他 再对比下一位,哎,他会发现,直到找到了食物,那么他的效率就变成了 on, 对不对?那么一般来说呢,哎,我们也把这种现象称为我们的羊群效应,就是说当我们哈西表里面他存在一个大量的冲突,我们所有的数据他都聚集在一块,那么一般来说,我们解决我们的羊群效应的话,哎,方案是扩容。 好,我们再来讲他第三个坑啊。那么在一般情况下面我们去理解,当我们删除这个元素之后,哎,那么这个元素的位置是不是就空出来了? 我们使用线性探测的话,他去留置一个标识位标志,他是已经被删除的,主要的一个目的是为了防止我们查询出错,如果是一些删除场景比较密集的话,哎,那么他的一个利用率呢?也会低很多。好,那么我们来演示一下为什么会出现这种问题吧。 假设我们把第二个元素十给他去进一个删除,如果说我们这个 时候,哎,把下边唯一的这个位置空出来了,如果说我们要去搜索我们十五的话,是不是先得从五,然后再到我们以前的十,再到我们的十五,对不对?那么他中间空的呢?会发现一个问题,就是说我们再去进行线性探测的时候,如果他发现当前元素里面没有值,哎,那么他会去中断查询。 好,我们跟大家去演示一个例子,好,我们来去进行一个值搜索二十, 大家有没有发现,当他到了下标为三的这个位置,他就停止了,对不对?因为我们线性探测他在插入数据的时候, 他是按照顺序的往后去进行查入的,如果说我发现了空位,那是不是就代表着我们的值在数组里面是不存在的对不对?所以说他会有一个标志位来防止我们查询出错, 我们来查询一下十五,看下效果,哎,我们有了这个标志位之后呢,哎,他就不会去暂停了。呃,那么我们刚刚也聊到了我们的开放定制法的一些缺点,对吧?但实际上呢,它还是有一些优点的, 就比如说他的空间效率呢,会比我们的念地质法会高一些,因为我们的线性探测呢,哎,他只需要有一个数组存放就 ok 了,对不对?哎,他不需要额外的空间,但是我们的念地质法呢,哎,他需要有一个数组,还有一个念表,所以说在空间上面他会比我们线性探测呢会多一些 好。那么第二个时间效率,如果说我们能够解决这种羊群效应的话,哎,那么它的一个查询复杂度呢,还是比较低的,那么在最好的情况下面呢,能达到一个 o e, 那么这个呢,就是我们今天所聊到的一些内容呢,哎,我们下节课再见。
一天一道面试题,如何解决哈西冲突?在哈西表中,不同关键字值对应到同一个存储位置的现象称为哈西冲突。 解决哈西冲突有以下方法,一、开放定制法,一旦发生了哈西冲突,就去寻找下一个空的散裂地址, 只要伞列表足够大,空的伞列地址总能找到并将记录存入。缺点是探测次数不可控,一旦探测次数骤增,会严重影响哈西表的读写性能,且删除比较麻烦。 二、链地址法,在哈西冲突产生时,将所有的哈西地址相同的记录都链接在同一链表中。缺点是一旦哈西冲突多了,哈西表会退化成链表,查询效率变差。三、在哈西法同时 构造多个不同的哈西函数,等发生哈西冲突就使用第二个、第三个等其他的哈西函数计算地址,直到不发生冲突为止,虽然不易发生聚集,但是增加了计算时间。缺点是会增加哈西的计算开销,影响读写效率。 四、建立公共溢出区。将哈西表分为基本表和溢出表两部分,发生冲突的元素都放入溢出表中。缺点是哈西冲突多了,公共溢出区会膨胀的非常厉害,查询效率也会有影响。