散列表

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。映射函数叫做散列函数,存放记录的数组叫做散列表。

装填因子

关键字个数 / 表长

处理冲突

一般来说冲突不可避免的,只能尽可能地减少冲突的发生。在建立Hash表的时候必须进行冲突处理。
        下面主要介绍线性探测法:也是一种比较常用的处理冲突的方法(但是极易产生堆积问题)

  • 线性探测法 即从发生冲突的地址(记做d)开始,依次探查d的下一个地址,直至找到一个空位置为止。记住这句话。查找时若查到空位置还没有找到需要查找的元素则说明不在列表中,结合前一句话理解一下,还是比较容易理解的。这个为后面计算查找失败的平均长度提供了计算思路。
  • 链地址法 通过单链表将关键字连接起来,利用这种方法不会产生堆积问题。但是所谓的堆积问题,并不能完全通过利用单链表法来避免。毕竟并不是适用于任何问题,在能够利用链地址法不能解决冲突的问题,也许利用线性探测法可以有着不错的效果。

性能分析

即本文的主要内容,查找成功与查找失败的分析。

  • 查找成功平均查找长度即找到表中已有表项的平均比较次数
  • 查找失败平均查找长度即找不到待查的表项但能找到插入位置的平均比较次数

平均查找长度的计算

直接以题目来理解会比较快些:

现有长度为11 且初始为空的散列表HT,散列函数H(key) = key % 7,采用线性探查法解决冲突。将关键字序列87,40,30,6,11,22,98,20 依次插入HT后,HT的查找失败的平均长度是多少呢? 查找成功的平均查找长度又是多少呢?
        ① 首先,通过散列函数并且利用线性探测法给他们每个字划分好自己的位置;
        ② 记录每个字冲突的次数,后面在计算查找成功的平均长度会用到;
        ③ 查找失败计算每个查找失败对应地址的查找次数,即从所查位置开始往后查直至查到空位置位置;
        ④ 其实,后面熟悉过程之后,在列出下面的每个关键字对应地址的表格之后就可以秒出答案;

注意事项 查找失败时对应的地址在这个题目,只能是7 即 0~6 ;

ASL 查找失败= (9 + 8 + 7 + 6 + 5 + 4 + 3 )/ 7 = 6

ASL 查找成功= (1 + 1 + 1 + 1 + 1 + 1 + 1 + 2)/ 8 = 9 / 8

散列地址 0 1 2 3 4 5 6 7 8 9 10
关键字 98 22 30 87 11 40 6 20
冲突次数 0 0 0 0 0 0 0 1

OK,上面把例子说完了,可以再看看下面这个题目,来测试下是否理解了上面的那些需要注意的点。
        将关键字序列(7,8,30,11,18,9,14)散列存储到散列表中。散列表的存储空间是从0开始的一维数组,散列函数为H(key) = (3*key)mod 7,处理冲突采用线性探测法,要求装填因子为0.7。
        (1)画出所构造的散列表。
        (2)分别计算等概率情况下的查找成功和不成功的平均查找长度。(12/7 和 18/7

(1)数组大小 = 7 / 0.7 = 10

散列地址 0 1 2 3 4 5 6 7 8 9
关键字 7 14 8 11 30 18 9

(2)
        ①查找成功时

散列地址 0 1 2 3 4 5 6 7 8 9
关键字 7 14 8 11 30 18 9
冲突次数 0 1 0 0 0 2 2
比较次数 1 2 1 1 1 3 3

ASL 查找成功= (1 + 2 + 1 + 1 + 1 + 3 + 3 )/ 7 = 12 / 7
        ②查找失败时

散列地址 0 1 2 3 4 5 6 7 8 9
关键字 7 14 8 11 30 18 9
比较次数 3 2 1 2 1 5 4

ASL 查找失败= (3 + 2 + 1 + 2 + 5 + 4)/ 7 = 18 / 7

【总结】简单吧,主要就是查找失败时除以的分母是 mod 后面的那个数,而不是关键字的个数。

计算散列表查找成功和查找不成功的平均查找长度(利用线性探测法处理冲突)相关推荐

  1. 求一颗二叉排序树查找成功和失败情况下的平均查找长度

    /** *    实验题目: *        求一颗二叉排序树查找成功和失败情况下的平均查找长度 *    实验目的: *        掌握二叉排序树的查找过程及其算法设计 *    实验内容: ...

  2. 数据结构 散列表 除留余数法 线性探测法解决冲突

    已知9名学生的信息,每个学生信息包括编号和姓名.学生信息为11,王红,22,刘军,47,王亮,92,张强,16,吴迪,3,李伟,7,赵磊,29,钱鹤,8,孙芳.用散列表实现以编号为关键码的查找.散列函 ...

  3. SJTU散列表的建立

    [问题描述]采用除留余数法构造散列函数H(key) = key mod p,散列表的表长为m,其中p≤m,采用线性探测法处理冲突(当探测到表的最后一个位置仍无空位时,从表的开始位置重新探测).现将n( ...

  4. 散列表查找的一个实例

    这里解决冲突的方法是开放地址法:"开放地址指的是表中尚未被占用的地址,开放地址法就是当冲突发生时候,形成一个地址序列,沿着这个序列逐个进行探测,直到找到一个空的开放地址,将发生冲突的关键字存 ...

  5. 009.查找手机电话簿【散列表】

    1. 散列表 顺序存储的结构类型需要一个一个地按顺序访问元素,当总量很大且我们所要访问的元素比较靠后时,顺序存储的结构类型性能就比较低.而散列表是一种空间换时间的存储结构,也是提升效率的一种比较常用的 ...

  6. 散列表查找失败平均查找长度

    如果你看了很多其他博客然后都看不懂看到了这篇,你一定可以容易懂的!我佛了,这么简单的东西死板地讲题目不讲原理鬼看得懂啊,这种风气真的不行,我忍不住想骂一声垃圾,啥玩意儿,误人子弟!原理懂了啥题不会做? ...

  7. 数据结构课程设计-利用散列表做一个电话号码查找系统

    [基本要求] (1)设每个记录有下列数据项:电话号码.用户名.地址: (2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表: (3)采用一定的方法解决冲突: (4)查找并显示给定电话号码的 ...

  8. 等概率情况下查找成功时的平均查找长度

    4.设散列表的地址范围为0-17,散列函数为:H(K)=K MOD 13,K为关键字.用线性探测法处理冲突,输入关键字序列:(10,24,32,17,31,30,46,47,40,63,49),完成以 ...

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

    哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时:ASL =1n\frac{1}{n}n1​ ∑i=1 ...

最新文章

  1. 上交三月月赛[SJTU] 1106 sudoku
  2. javascript高级程序设计之BOM
  3. 使用SVN提示“工作副本已经锁定”的解决办法
  4. 揭秘继承技术之虚函数
  5. 安装分布式文件系统MooseFS
  6. 微软开源AI诊断工具Error Analysis
  7. 【附答案】Java面试2019常考题目汇总(一)
  8. 第8章 Service基础Activity与Service绑定
  9. 值得收藏的品牌案例—到集设,灵感即到
  10. Eclipse中Tab的配置(设置为按一下Tab键,效果是按4次空格,而不是4个空格的缩进)
  11. avast高级版许可文件_明道云私有部署版已上架腾讯云镜像市场
  12. 考研数据结构(3)笔记
  13. C# 根据模板 导出 Excel 图表 (NPOI组件)
  14. 分支限界法之布线问题
  15. 数字孪生:迈向未来,智慧城市大脑运营方案及整体建设解决方针
  16. QT property属性的应用
  17. diy服务器个人主机_DIY个人服务器
  18. access有效性规则不为空值_access窗体文本框有效性规则中输入is not null无效
  19. 基于依存句法分析的实体关系提取
  20. 30个HTML+CSS前端开发案例(五)

热门文章

  1. ASP.NET动态网站课程设计——个人网页
  2. 今天终于玩了HiPiHi
  3. 用C语言实现高铁客运订票系统
  4. 男人女人应该不要随便离婚
  5. MFC如何调用Flash
  6. c语言大作业书店图书管理系统,c语言课程设计 书店管理系统.pdf
  7. MFC手动添加窗口 最大化 最小化 还原 关闭
  8. org.springframework.orm.hibernate3.HibernateSystemException: Exception occurred inside setter of com
  9. Python识别中文
  10. 《图解HTTP》-第十一章(完结)