浅谈hash实现原理

本文探讨了哈希表的实现原理,包括直接定址法和除留余数法,以及开链法(链地址法)和闭散列法(开地址法)解决冲突的策略。特别强调了线性探测、二次探测和链地址法的优缺点。还讨论了哈希表的扩容策略,例如一次性扩容和分摊扩容,并提到了Memcached的扩容机制。最后,指出了提高哈希查找效率的关键在于良好的哈希函数设计、控制负载因子和使用如红黑树等数据结构。
摘要由CSDN通过智能技术生成

哈希表(散列表)通过将关键码映射到表中的某个位置上来存储元素,然后根据关键码来访问元素。

常用的hash函数有除留余数法,线性探测,二次探测,开链法,在大部分情况下基本就是用开链法:

1、直接定址法

取关键字的某个线性函数作为散列函数,Hash(key)=A*key+B;

但是这种方法有很大的缺陷,就是当关键码比较分散时,hash表的所浪费的空间是非常大的。

 

2、除留余数法

设散列表中允许出现的地址数为m,取一个不大于m但是最接近或等于m的素数p,作为除数(素数作为除数能够减少哈希冲突)。

    hash(key)=key%p;      p<=m;

解决冲突的方法:

 

一、闭散列法(开地址法):

 

1、线性探测法

在线性探测中,冲突时通过顺序扫描数组(可以往回找),直到找到空的位置。查找算法也使用了探测法。

hash(key)+0,hash(key)+1,hash(key)+2, ....  hash(key)+i,

但是这种方法有可能引发原始集聚话问题,即导致局部范围大规模发生冲突。

 

2、二次探测法

hash(key)+0^2,hash(key)+1^2,hash(key)+2^2, ....  hash(key)+i^2。

二次探测法检查了远离原始探测点的单元,这样的话就降低了原始集聚化问题。

二、开散列法(链地址法):

数组查找容易,插入删除难,链表插删容易,查找困难,拉链法:可以理解为数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值