下定决心拿下散列表(Hash)

散列表,又称Hash(哈希),是数据结构中的重要内容,也是面试中的常见考点,然而相比于二叉树、链表等其他常见结构,人们对其掌握度往往不足,反思自己过去也怀有侥幸心理,常常对其避而远之,现在醒悟这种掩耳盗铃的做法实在不可取,于是痛定思痛,决心从头开始,弄懂散列表!

散列是一种基于键值对(存储位置,也称哈希地址,key;关键字值value,其间关系由散列函数或称哈希函数给出)来实现访问的过程。散列查找是一种摆脱了“比较”操作的查找方法,其既包括数据元素的存储过程,也能实现数据元素的查找过程,保存记录的查找表也称散列表(哈希表),利用散列函数在散列表中进行查找的方法叫做散列方法。

散列表中两个关键方法是散列函数的构造方法处理冲突的方法。

散列函数构造方法:

直接地址法:H(key)=a*key+b

除留余数法:H(key)=key%p,其中p为不大于于散列表长度m的最大质数

数字分析法:抽取关键字中的指定位并进行处理从而得到哈希地址。例如,如果关键字是1234567,可以选择24位,得到234,然后再处理得到哈希地址。处理方法可采用许多方式,包括反转各位 (到432),执行循环右移(得到423),执行循环左移(342),交换每对数位(324),或是许多其他的操作。

平方取中法:取平方值的中间几位作为散列地址

折叠法:将关键字分割成位数相同的几部分,取其叠加和作为散列地址

处理冲突方法:处理设计出的散列函数的冲突(同义词)

链式法:把所有同义词存储在一个线性链表中,这个线性链表由散列地址唯一标识,查找插入和删除主要在同义词链中进行,适用于经常插入删除的情况。

开放地址法:Hi=(H(key)+di)%m

(1)线性探测:di=1,2,...,m-1,冲突时顺序查看表中下一个单元直到空闲

(2)二次探测(平方探测):di=1^2,-1^2,2^2,-2^2...k^2,-k^2,k<=m/2,m必须是可表示成4k+3的质数,缺点:不能探测所有

(3)再散列:di=Hash2(Key),使用两个散列函数

(4)伪随机序列:若用伪随机数序列当作增量序列di,称为伪随机数再散列法,也称为伪随机数探查。

散列表查找效率取决于:散列函数、处理冲突方法、装填因子

装填因子=表中填入的记录数/哈希表长度

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值