关于哈希函数冲突处理方法的优缺点

解决冲突的方法 

1.开放定址法(封闭散列)

1.1线性探测

        当我们的所需要存放值的位置被占了,我们就往后面一直加1并对m取模直到存在一个空余的地址供我们存放值,取模是为了保证找到的位置在0~m-1的有效空间之中。

1.2二次探测

        当我们的所需要存放值的位置被占了,会前后寻找而不是单独方向的寻找。

优点:1.易于理解;2.记录更容易进行序列化(serialize)操作;3.如果记录总数可以预知,可以创建完美哈希函数,此时处理数据的效率是非常高的。

缺点:1.出现非同义词冲突(两个不相同的哈希值,抢占同一个后续的哈希地址)被称为堆积或聚集现象;2.要求装填因子较小以解决冲突问题,节点数量多的时候存在大量的空间浪费;3.删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点;4.存储记录的数目不能超过桶数组的长度,如果超过就需要扩容,而扩容会导致某次操作的时间成本飙升,这在实时或者交互式应用中可能会是一个严重的缺陷

2.链地址法(开放散列)

       这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。

优点:1.链地址法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;2.由于链地址法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况,不会造成空间浪费;3.而链地址法中可取α≥1,且结点较大时,链地址法中增加的指针域可忽略不计,因此节省空间;4.在用链地址法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。

缺点:节点较小会衬托出指针域较大,造成空间浪费;存储的记录是随机分布在内存中的,这样在查询记录时,相比结构紧凑的数据类型(比如数组),哈希表的跳转访问会带来额外的时间开销;由于使用指针,记录不容易进行序列化(serialize)操作。

适用情况:链地址法适用于经常进行插入和删除的情况,且节点要比较大。

3.再哈希法

        同时构造多个不同的哈希函数,等发生哈希冲突时就使用第二个、第三个……等其他的哈希函数计算地址,直到不发生冲突为止。

优点:不易发生聚集

缺点:增加了计算时间。 

4.公共溢出区

        为所有冲突的关键字记录建立一个公共的溢出区来存放。在查找时,对给定关键字通过散列函数计算出散列地址后,先与基本表的相应位置进行比对,如果相等,则查找成功;如果不相等,则到溢出表进行顺序查找。如果相对于基本表而言,在有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高的。适用性不高

以上是笔者整理的,并不完全属于原创

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值