查找二之哈希表查找

1、功能:哈希表可以直接通过关键字直接找到数据的位置,不需要进行任何的比较,也就是说,哈希表建立了关键字和存储地址之间一种直接的映射关系,其查找的效率相对较高。

2、定义

  1、哈希地址:哈希地址只是在查找表中的存储位置,并不是实际的物理存储物质

  2、哈希函数:f()是一个函数,通过这个函数可以快速求出关键字对应的数据的哈希地址,称为hash函数

  3、冲突:由于用算法求关键字对应哈希地址,会出现两个人算出来是同一块hash地址的情况,哈希只能减少冲突的出现,无法完全避免冲突。

3、哈希表构造

  哈希函数的构造方法(常用):直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法

  1、直接定址法

  哈希函数为一次函数,H(key) = key 或 H(key) = a * key + b。 H(key)表示关键字 key对应的hash地址, a,b都是常数。

  2、数字分析法

  如果关键字由多位字符或者数字组成,就可以考虑抽取其中两位或者多位作为该关键字对应的哈希地址,在取法上尽量选择变化较多的位,避免冲突发生。适用于已知的关键字集合。

  3、平方取中法

  将关键字做平方操作,取中间的几位作为哈希地址。(比较常用)

  4、折叠法

  将关键字分割成位数相同的几部分,最后一部分的位数可以不同,然后取这几部分叠加和(舍去进位)作为哈希地址,此方法适合关键字位数较多的情况。

  移位折叠:将分割后的每一小部分,按照最低位对齐,然后相加

  间界折叠:从一端向另一端沿分割线来回折叠

   5、除留余数法

  若已知整个哈希表的最大长度m,可以取一个不大于m的数p,然后对该关键字key做取余运算,H(key) = key%p(p<=m),适用于哈希表大小已知。

  p的取值很重要,p可以为不大于m的质数或者不包含小于20的质因数的合数。

  6、随机数法

  取关键字的一个随机函数值作为它的哈希地址,H(key) = random(key),此方法用于关键字长度不等的情况(注意:这里的随机函数其实是伪随机函数,随机函数是即是每次给定的key相同,但是H(key)都是不同,而伪随机数正好相反,每个key都对应的是固定的H(key))。

4、选择方法构造哈希表

  1、关键字的长度,长度不等,用随机数法;关键字较多,用折叠法或者数字分析法;关键字位数较短,可以考虑平方取中

  2、哈希表的大小,大小已知,可以使用储留余数法;

  3、关键字分布情况

  4、查找表的查找频率

  5、计算哈希函数所需时间(包括硬件指令元素)

5、处理冲突的方法

  1、开放寻址法

    在出现哈希冲突时在哈希表中找一个新的空闲位置存放元素。

    1、线性探测法:当冲突发生时,顺序查看表中的下一个单元,知道找出一个空闲单元

      优点:解决冲突简单

      缺点:容易产生堆积问题

    2、平方探测法:比如发生冲突的地址时d,平方探测法得到新的地址序列为 d+1平方,d-1平方,d+2平方……

      缺点:避免出现堆积问题

      缺点:不能探测到散列表上的所有单元,但至少能探测到一半单元  

  2、链地址法:将所有产生冲突的关键字对应的数据全部存储在同一个线性链表中,拉链法适用于经常插入和删除的情况

    优点:提高查找速率

    缺点:需要额外空间

  3、再哈希法

  当通过哈希函数求得的哈希地址同其他关键字产生冲突时,使用另一个哈希函数计算,知道冲突不再发生。

6、哈希表查找的性能

  在构造哈希表过程中,由于冲突的产生,使得哈希表的查找算法 仍然会涉及到比较的过程,因此对哈希表的查找效率仍然以平均查找长度来衡量

  比较次数取决于以下方面

    1、哈希函数:哈希函数的好坏取决于影响出现冲突的频繁程度。但是一般情况下,韩熙韩束相比于后两种的影响,可以忽略不计

    2、处理冲突的方式:对于同一组关键字,设定相同的哈希函数,使用不同处理冲突的方式得到的哈希表是不同的,表的平均查找长度也不同

    3、哈希表的装填因子:在一般情况下:处理冲突的方式相同,平均查找长度取决于哈希表的装满程度,越满,冲突越多

      装填因子 = 哈希表中的数据个数/哈希表长度

      经过计算,假设表中所有数据查找概率相等的情况下,对于表长为m,合适为n的哈希表:

        查找成功的平均长度:-1/装填因子 * ln(1-装填因子)

        查找不成功的平均查找长度:1/(1-装填因子)

      哈希表的查找效率只能装填因子有关,和哈希表中的数据的个数无关,所以选用哈希表做查找操作时,选择一个合适的装填因子非常重要

  代码明天补

7、对比

 

  

 

posted @   风中凌乱的猪头  阅读(281)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示