哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

  • 了解ASL的公式
  • 线性探测法求ASL
  • 链地址法求ASL

了解ASL的公式

查找成功时:ASL =1n\frac{1}{n}n1​ ∑i=1nCi\sum_{i=1}^{n} C_i∑i=1n​Ci​
  n 为散列表中记录的个数( 不是表的长度 ),
  Ci 为查找成功的第 i 个记录所需要的比较次数( 表中空的记录意味着不成功,是不算在里面滴

查找不成功时:ASL =1r\frac{1}{r}r1​ ∑i=1nCi\sum_{i=1}^{n} C_i∑i=1n​Ci​
  r 为散列函数取值的个数( 不是表的长度 )。这个就充分解释了为什么散列函数 H(Key) = (key) MOD 11 在计算查找不成功ASL时,r = 11了,是因为这个散列函数的取值为 0~10,可以取11个值,所以 r = 11。
  Ci 为 散列函数取值为 i 时,查找失败时第 i 个记录所需要的比较次数( 表中的有些部分,散列函数根本取不到,自然也就不在计算里了

我想只要把这两个公式看懂,查找成功与不成功的ASL也就自然会求了。下面线性探测法和链地址法我各举一个例子。

线性探测法求ASL

将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中,散列函数为H(Key) = (key x 3) MOD 7,处理冲突采用线性探测再散列法,要求装填因子为0.7

装填因子 a = 表中装入的记录个数散列表的长度\frac{表中装入的记录个数}{散列表的长度}散列表的长度表中装入的记录个数​ = 0.7,可以求出散列表表长 = 70.7\frac{7}{0.7}0.77​ = 10
(7x3)mod 7 = 0,因此散列地址为 0
(8x3)mod 7 = 3,因此散列地址为 3
(30x3)mod 7 = 6,因此散列地址为 6
(11x3)mod 7 = 5,因此散列地址为 5
(18x3)mod 7 = 5,此时和11冲突,使用线性探测法(地址+1),又和30冲突,地址再次+1,无冲突,散列地址为 7
(9x3)mod 7 = 6,此时和30冲突,使用线性探测法(地址+1),又和18冲突,地址再次+1,无冲突,散列地址为 8
(14x3)mod 7 = 0,此时和7冲突,使用线性探测法(地址+1),无冲突,散列地址为 1

线性探测法处理冲突构造所得的哈希表如下:

地址 0 1 2 3 4 5 6 7 8 9
key 7 14 8 11 30 18 9

根据公式:查找成功时ASL = 1n\frac{1}{n}n1​ ∑i=1nCi\sum_{i=1}^{n} C_i∑i=1n​Ci​
如果查找7,则需要查找1次。
如果查找8,则需要查找1次。
如果查找30,则需要查找1次。
如果查找11,则需要查找1次。
如果查找18,则需要查找3次:第一次查找地址5,第二次查找地址6,第三次查找地址7,查找成功。
如果查找9,则需要查找3次:第一次查找地址6,第二次查找地址7,第三次查找地址8,查找成功。
如果查找14,则需要查找2次:第一次查找地址0,第二次查找地址1,查找成功。
所以,查找成功时ASL=(1+2+1+1+1+3+3)/ 7 = 12/ 7

根据公式:查找不成功时ASL = 1r\frac{1}{r}r1​ ∑i=1nCi\sum_{i=1}^{n} C_i∑i=1n​Ci​
举个例子来说吧:
  如果要查找key为9的关键字。根据散列函数可以计算H(key)=H(9)=6。
  此时在会检测地址为6的值,发现key=30,不等于9。这就说明在装填的时候发生了冲突
  根据冲突处理方法,会继续检测地址为0的值,之所以没有检测地址7,8,9H(key)的取值取不到这些值。检测地址为0的值,发现key=7,依然不等
  根据冲突处理方法,会继续检测地址为1的值,发现key=14,依然不等
  根据冲突处理方法,会继续检测地址为2的值发现key为空
   这就说明关键字9从应该出现的地址6,一直查找,找到值为空的地址都没有和9相等的,说明散列表中没有9这个值,因此探测次数为4次

根据上面的例子
查找地址为0的值所需要的次数为3,
查找地址为1的值所需要的次数为2,
查找地址为2的值所需要的次数为1,
查找地址为3的值所需要的次数为2,
查找地址为4的值所需要的次数为1,
查找地址为5的值所需要的次数为5,
查找地址为6的值所需要的次数为4。
所以,查找不成功ASL=(3+2+1+2+1+5+4)/ 7 = 18/ 7

链地址法求ASL

将关键字序列{1 13 12 34 38 33 27 22} 散列存储到散列表中。散列函数为:H(key)=key mod 11,处理冲突采用链地址法,求在等概率下查找成功和查找不成功的平均查找长度

1mod11=1,因此散列地址为1
13mod11=2,因此散列地址为2
12mod11=1,因此散列地址为1(这个数据是数据1指针的另一个新数据)
34mod11=1,因此散列地址为1(这个数据是数据12指针的另一个新数据)
38mod11=5,因此散列地址为5
33mod11=0,因此散列地址为0
27mod11=5,因此散列地址为5(这个数据是数据38指针的另一个新数据)
22mod11=0,因此散列地址为0(这个数据是数据33指针的另一个新数据)

链地址法处理冲突构造所得的哈希表如下:

根据公式:查找成功时ASL = 1n\frac{1}{n}n1​ ∑i=1nCi\sum_{i=1}^{n} C_i∑i=1n​Ci​
如果查找1,则需要查找3次。从地址1开始查,第一次查到34,第二次查到12,第三次查到1。
如果查找13,则需要查找1次。
如果查找12,则需要查找2次。从地址1开始查,第一次查到34,第二次查到12。
如果查找34,则需要查找1次。
如果查找38,则需要查找2次。从地址5开始查,第一次查到27,第二次查到38。
如果查找33,则需要查找2次。从地址0开始查,第一次查到22,第二次查到33。
如果查找27,则需要查找1次。
如果查找22,则需要查找1次。
所以,查找成功ASL =(3×1+2×3+1×4)/8 = 13/8

根据公式:查找不成功时ASL = 1r\frac{1}{r}r1​ ∑i=1nCi\sum_{i=1}^{n} C_i∑i=1n​Ci​
举个例子来说吧:
如果要查找key为16的关键字。根据散列函数可以计算H(key)=H(16)=5。
  首先从地址5开始查找,第一次查找到的数据是27,和16不相等,继续往后找。
  第二次查找到的数据是38,和16不相等,继续往后找。
  第三次查找到的数据是空,查找结束。 意味着在地址5这一行找不到关键字16,因为如果关键字16在表中存在的话,只可能在地址5这一行,现在在地址5这一行找不到,意味着整个表也找不到。

如果要查找key为20的关键字。根据散列函数可以计算H(key)=H(20)=9。
  首先从地址9开始查找,第一次查找到的数据是空,查找结束。意味着表中不存在关键字20。

根据上面的例子
查找地址为0的值所需要的次数为3,
查找地址为1的值所需要的次数为4,
查找地址为2的值所需要的次数为2,
查找地址为3的值所需要的次数为1,
查找地址为4的值所需要的次数为1,
查找地址为5的值所需要的次数为3,
查找地址为6的值所需要的次数为1,
查找地址为7的值所需要的次数为1,
查找地址为8的值所需要的次数为1,
查找地址为9的值所需要的次数为1,
查找地址为10的值所需要的次数为1。
所以,查找不成功ASL = (3+4+2+1+1+3+1+1+1+1+1)/11 = 19/11

其实不管是线性探测法还是链地址法,在求查找不成功ASL时,都是差不多的。首先根据散列函数找到地址,然后从这个地址往后查,一直查到空结束。

哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度相关推荐

  1. 【数据结构】哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

    一.哈希表 1.概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构.它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度.这个 ...

  2. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 参考文章: (1)Java解决Hash(散列)冲突的四种方法--开放地址法 ...

  3. java开放地址法和链地址法解决hash冲突

    hashMap对各位小伙们来说,没有不知道的了,使用过的人想必或多或少的都了解一点hashMap的底层实现原理,总结来说就是,数组+链表,至于源码的实现,大家可参看源码,今天想说的是hashMap是怎 ...

  4. 哈希表:线性探查法和平方探查法

    己知哈希表地址区间为0~10,给定关键字序列(20,41,37,26,8,12,18, 63,30). 哈希函数为H(k)=k%11,采用平方探测法处理冲突,将以上关键字依次存储到哈希表中. 平均查找 ...

  5. 散列(2)线性探测法和双重散列法

    接上篇 散列的简要描述和链地址法 解决散列冲突的方法: 1. 线性探测法 如果我们能够预测将要存入表中元素的数目,而且我们有足够的内存空间可以容纳带有空闲空间的所有关键字,那么使用链地址法是不值得的. ...

  6. SWUST OJ 1012: 哈希表(链地址法处理冲突)

    1012: 哈希表(链地址法处理冲突) 题目描述 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法. 输入 第一行为哈西表的长度m: 第二 ...

  7. Hash——哈希法概念、哈希函数构造方法、哈希冲突解决办法(重点讨论链地址法)

    声明:本篇博客根据回顾老师上课知识和书籍<数据结构--用C语言描述>(耿国华)整理得出,仅作知识回顾学习用. 1.哈希法 哈希法又称散列法.杂凑法.关键字地址计算法.相对应的表称为哈希表. ...

  8. 哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现

    哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现 参考文章: (1)哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现 (2)https://www. ...

  9. 【数据结构】人名查询哈希表设计(链地址法)

    文章目录 核心代码 链表节点定义 链地址法处理冲突 查询函数 完整代码下载 核心代码 哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址 ...

最新文章

  1. js在PageOffice打开的Word文档光标处插入书签
  2. sql join on 多表连接_SQL 多表查询-交叉连接(笛卡尔积)
  3. mysql 和 sqlserver中备份一张表的区别
  4. MySQL慢查询日志ES索引模板
  5. Git 最佳实践:分支管理
  6. 数字农业WMS库存操作重构及思考
  7. [转载]oracle常用经典SQL查询
  8. 【专题二】应用号(小程序)开发教程首发第二弹!(0923)
  9. 一个WordPress站点绑定多个域名
  10. python 相关系数函数会产生无穷大吗_python 求相关系数
  11. CIA怎么监控黑掉的Linux服务器?用流量劫持
  12. 继向日本捐赠100万只口罩后,马云又向这个国家捐了100万只!
  13. [ExtJS6]ResponsiveColumn-自适应列布局
  14. 050医疗项目-模块五:权限设置-第三方系统的接入
  15. cocos2d中CCSprite的使用总结 【转】
  16. comsol和java_COMSOL java API——编译comsol模型java文件
  17. ipad浏览器安装java_360浏览器苹果平板下载
  18. CMMI 4高级别过程改进案例介绍
  19. 《心流》| 成年人的友谊,甜蜜与苦涩交杂
  20. Android的notification通知

热门文章

  1. SAP ABAP 根据采购订单(PO)创建交货单(DN) BAPI_DELIVERYPROCESSING_EXEC - 创建内向交货单
  2. ubuntu下使用ppa下载
  3. 搜索引擎排名威新hfqjwl_手机下拉框微莘hfddjwl,手机下拉框微信hfqjdwl作词
  4. linux cs go鼠标灵敏度,CSGO鼠标调试方法 选择适合自己的鼠标速度
  5. 马尔可夫链:随机过程的数学建模及MATLAB实现
  6. linux协议栈网桥部分之cam表操作,linux协议栈之网桥实现之一
  7. AP微积分极限考点总结及解析
  8. 曙光服务器通过ipmi安装系统,曙光服务器ipmi部署记录
  9. CTFweb相关靶场推荐与环境配置
  10. 20200220–靶场记录,web渗透+内网渗透完整版