【数据结构】hash算法!!!

Hash表是一种可以将查找元素的时间复杂度降为O(1)的高效算法。
基本原理:将所有的数据通过hash函数映射到hash表里面,如果需要查找元素的时候再通过hash函数来计算出来元素在hash表里面的位置,从而一次将需要的元素找到。
这里写图片描述

存在的问题
如果有两个或者更多的元素通过hash函数映射的hash位置是相同的那么就会出现问题。
解决办法
线性探测:
这里写图片描述

在产生hash冲突的时候,在hash表里面依次查找下一个没有填数据的位置,并且将产生冲突的数据填入。
问题:
如果当前面的数据产生hash冲突的时候会将后面的数据位置占上,那么如果后面的数据进行填入的时候就没有在应该在的位置上面,那么就会在查找效率上面有所下降。
这里写图片描述

二次探测:
为了解决线性探测的缺点,那么使用二次探测可以在一定的程度上面得到缓解。
index = di + i^2;
通过这里的i^2可以曾加距离hash冲突的位置,这样就可以减少后面的数据没有出现在本来应该出现的位置上面。
这里写图片描述

链地址法:
利用线性探测和二次探测都是避免不了会将后面的元素本来应该放置的位置侵占。
如果将hash表里面的元素换成链表的节点,那么产生hash冲突的时候可以将产生冲突的数据依次加入到链表里面,那么无论多少的数据产生冲突 都可以将元素放到指定的链表里面,那么需要查找元素的时候就可以遍历链表来查找。
这里写图片描述

缺点:如果在一个固定的位置上面产生冲突的元素过多,那么在查找一个元素的时候就相当于遍历一个单链表,那么效率依旧不太高。但是可以将单链表的数据结构改成AVL树或者红黑树。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值