哈希表是什么?

  • 定义:根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表称为哈希表,也叫作散列表,这一映射过程称为哈希造表或散列,所得的存储位置称为哈希地址或散列地址。
  • 构造哈希表:以记录的关键字为自变量计算一个函数( 称为哈希函数)来得到该记录的存储地址并存入元素,因此在哈希表中进行查找操作时,必须计算同一个哈希函数,首先得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功。
  • 对于某个哈希函数H和两个关键字K1和K2,如果K1≠K2,而H(K1)=H(K2),则称为冲突。具有相同哈希函数值的关键字对该哈希函数来说称为同义词。

处理构造哈希表出现的冲突

开放定址法

  • Hi=(Hash(key)+di) %m i=1, 2,…,k (k≤m-1),其中,Hash(key)为哈希函数; m为哈希表的表长; di为增量序列。
  • 常见的增量序列有如下三种。
    1、 di =1, 2, 3,…,m-1,称为线性探测再散列。
    2、 di =12, -12, 22,-22,32,…,士k2 (k≤m/2),称为二次(平方)探测再散列。
    3、 di =伪随机序列,称为随机探测再散列。
  • 最简单的产生探测序列的方法是进行线性探测。也就是发生冲突时,顺序地到存储区的下一个单元进行探测。例如,某记录的关键字为key,哈希函数值H(key)=j。若在哈希地址j发生了冲突(即此位置已存放了其他元素),则对哈希地址j+1进行探测,若仍然有冲突,再对地址j+2进行探测,依此类推,直到将元素存入哈希表。

开放定址法例题

  • 设关键码序列为 47,34,13, 12,52,38,33,27,3,哈希表表长为11, 哈希函数为Hash(key)=key mod 11,则:
    Hash(47)= 47 MOD 11= 3,Hash(34)= 34 MOD 11= 1,Hash(13)= 13 MOD 11 =2,
    Hash(12)= 12 MOD 11= 1,Hash(52)= 52 MOD 11= 8,Hash(38)= 38 MOD 11 =5,
    Hash(33)= 33 MOD 11 =0,Hash(27)= 27 MOD 11 =5,Hash(3)= 3 MOD 11 = 3
  • 使用线性探测法解决冲突构造的哈希表如下:

链地址法(拉链法)

  • 概述:链地址法是一种经常使用且很有效的方法,又叫做拉链法。它将具有相同哈希函数值的记录组织成一个链表,当链域的值为NULL时,表示已没有后继记录。
  • 例如,哈希表表长为11、哈希函数为Hash(key)=key mod11,对于关键码序列47, 34, 13,12,52,38,33,27,3,使用链地址法构造的哈希表如下图所示:

哈希查找

  • 概述:在哈希表中进行查找操作时,用与存入元素时相同的哈希函数和冲突处理方法计算得
    到待查记录的存储地址,然后到相应的存储单元获得有关信息再判定查找是否成功。
  • 在线性探测法解决冲突的方式下,进行哈希查找有3种可能:
    1、第一种情况是在某一位置上查到了关键字等于key的记录,查找成功;
    2、第二种情况是按探测序列查不到关键字为key的记录而又遇到了空单元,这时表明元素不在表中,表示查找失败。
    3、第三种情况是查遍全表,未查到指定关键字且符号表存储区已满,需进行溢出处理。
  • 在用链地址法解决冲突构造的哈希表中查找元素,就是根据哈希函数得到元素所在链表的头指针,然后在链表中进行顺序查找的过程。

例题

  • 对于关键字序列(10,34,37,51,14,25,56,22,3), 用线性探查法解决冲突构造哈希表,哈希函数为H(key)=key%11,关键字25存入的哈希地址编号为( )。

A、2 B、 3 C、 5 D、6

  • 解析:本题考查哈希表的基础知识。
    用线性探查法解决冲突构造哈希表的步骤如下:
    1)、序列的长度为11,标号0到10;
    2)、依次将数带入哈希函数求哈希值,哈希值对应步骤1中标号;
    3)、如果步骤2)的哈希值对应的标号已经被占用,则往后一位,直到未占用的位置存放;
    关键字序列(10,34,37,51,14,25,56,22,3)通过key%11计算得到对应的序列(10,1,4,7,3,3,1, 0,3)。需要注意的是,我们的序列是按照顺序依次进行存放的,本题25代入哈希值为3,其中3已被14所占,后退一位4号被37占用,其中5号为空,所以25应该存入标号为5的位置。
  • 故本题的正确答案为C

二十、哈希表的基础知识相关推荐

  1. 二十五、内存的基础知识

    一.知识总览 二.什么是内存,有何作用 内存可以存放数据,程序执行前需要先放到内存中才能被CPU处理-----缓和CPU与硬件之间的速度矛盾. 三.链接的三种方式 四.总结

  2. FreeSql (二十)多表查询 WhereCascade

    WhereCascade 多表查询时非常方便,有了它可以很轻松的完成类型软删除,租户条件的功能. IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseCon ...

  3. 计算机网络(十)IP地址的基础知识

    计算机网络(十)IP地址的基础知识 1.IP地址的定义 2.IP地址由网络和主机两部分标识组成 3.IP地址的分类 a.A类地址 b.B类地址 c.C类地址 d.D类地址 e.关于分配IP主机地址的注 ...

  4. 二十八、统计机器翻译基础

    二十八.统计机器翻译基础 由于本人喜欢在纸上手推原理,所以附上照片,欢迎提出建议

  5. JavaScript 数据结构与算法(二)哈希表

    本文参考文献:https://www.cnblogs.com/AhuntSun-blog/p/12636718.html 配套视频教程:https://www.bilibili.com/video/B ...

  6. NYOJ 138 找球号(二)哈希表

    找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=1 ...

  7. (教学思路 C#集合二)哈希表

    这一节我们来学习第二种集合,因为它的特性,可以提供一种相当有效率的搜索方法,所以在实际项目中非常实用,它就是哈希表.哈希继承了IDictionary接口,IDictionary接口提供了key(键)/ ...

  8. PyTorch学习笔记(二):PyTorch简介与基础知识

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  9. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

最新文章

  1. Asp.Net Core AsyncLocal 异步上下文
  2. 个人作品:EasyPicker(轻取)简洁而又实用的文件收取Web应用
  3. 每日一皮:原型还可以啊,怎么上线后就这样了。。。
  4. fileinput模块可以循环一个或多个文本文件的内容
  5. Java黑皮书课后题第5章:*5.50(对大写字母计数)编写一个程序,提示用户输入一个字符串,然后显示该字符串中大写字母的数目
  6. npm安装依赖包报错
  7. SAP Fiori应用的搜索问题
  8. android百度地图标方向,Android百度地图之方向感应和模式更改
  9. php pdo输出数据库,PHP中PDO对像及PDOStatement::fetch()的用法数据库查询,结果输出处理...
  10. python学习(九) 网络编程学习--简易网站服务器
  11. sed 解释正则表达式
  12. 网络传输数据的加密过程详解
  13. 无需代码,图文并茂详解EEGLAB中的ERPs数据分析方法
  14. 无痛学习ISAC(三)
  15. mysql基本语句大全6_mysql基本sql语句大全(基础用语篇)
  16. echarts渐变色
  17. 编程小白碰到丈母娘题目
  18. B端产品的特点及开发经验
  19. 被割韭菜还是来割韭菜
  20. 英语语法回顾4——定语和定语从句

热门文章

  1. Tkinter Treeview tag_configure失效问题
  2. 联邦学习 | 无处不在的隐私泄露!
  3. 关于mac地址,请各位大侠帮忙解决
  4. VRP和调度问题的主流精确算法和启发式算法
  5. MySQL自增列之起始与步长
  6. 分享123个ASP整站程序源码,总有一款适合您
  7. 欧拉图与半欧拉图的判断
  8. golang 入门--定义数组的方式
  9. go 获取当前时间,以及时间格式转换
  10. 完数什么意思_完美数是什么?