哈希表

哈希表

哈希表解决的是一个查找的问题,几乎可以在O(1)的时间内进行查找,这是一个典型的以空间换时间的做法。
对输入进行哈希函数运算得到一个值,再将这个输入填入该值作为下标对应的slot里。下面就是一个将item映射为hash value,再填入hash table的例子,里面有一个负载因子的概念。
哈希表举例
问题就来了,会存在冲突冲突就是指两个item算出来的hash value一样,但只有一个slot可用,没地方填了怎么办。一个简单的想法就是去找当前hash value对应的slot后面的第一个空slot填进去,这叫开放寻址法。查找的时候如果没找到,不一定是没有,可能是有冲突,所以你得按照顺序继续往后找,直到找到第一个空slot,如果还没有就是真没有。
这个解决方法也有个问题,就是当多个item的hash值相同的时候,周围的slot都会被item填满item会聚集在一起,这对于其它要填入这里的item会有影响。
解决这个问题的方法是重哈希。比如newhashvalue=rehash(oldhashvalue), rehash(pos)=(pos+1)%sizeoftable
当装填因子load factor不断增大,插入元素的操作将变得效率低下,大量的时间被浪费在寻找空的bucket上,甚至导致失败,所以有了rehashing操作。其主旨是将原来的散列表扩大2倍(实操中寻找2倍的下一个素数来提高性能),然后再将旧表中的元素,一个个插入到新表中。虽然看起来需要花费O(N)的时间来移动元素,但实际操作中,该方法不常发生。
另外线性探查法还有个变体叫二次探查法,就是如果hash值相同的话,后面的加上偏移量,且偏移量是1,4,9,16等等以此类推。
另外还有开链法,就是当前重复hash值的slot上开一个链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值