记录的存储位置与关键字之间存在对应关系,对应关系———hash函数

Loc(i)=H(keyi)

假设散列函数为H(key)=k

数据为:1 2 5 8 9 6 7 

访问的话可以通过下标来访问数据。

优缺点:

  • 查找效率高
  • 空间效率低

冲突: 不同的关键码映射到同一个散列地址,key≠key2,但H(key1)=H(key2)。

设关键码为(25 21 39 9 23 11)  H(k)=k%7

由于H(k)=k%7 ,所以地址编号为0-6

H(25)=25%7=4    H(21)=21%7=0    H(39)=39%7=4    H(9)=9%7=2

H(23)=23%7=2    H(11)=11%7=4

同义词:具有相同函数值的多个关键词 

例如:上面的H(25 )H(39) H(11)具有相同的函数值

构造散列函数需要考虑的因素:

  • 执行速度
  • 关键词长度
  • 散列表大小
  • 关键词的分布情况
  • 查找频率

元素集合的构造特性:

  • n个数据原占用n个地址,希望散列表的地址空间尽可能小
  • 尽量均匀地存放元素,以避免冲突

构建方法:

  1. 直接定址法
  2. 数字分析法
  3. 平方取中法
  4. 折叠法
  5. 除留余数法
  6. 随机数法

直接定址法:

H(key)=key 或  a*key+b (a和b为常数)

优点:以关键码key的线性函数数值的散列地址,不会发生冲突。 

缺点:需要占用连续地址空间,空间效率低

除留余数法:

H(key)=key %  p   p<=表长

是最简单,也最常用的构造散列函数的方法,但关键的是得到p的值。

处理冲突的方法:

哈希函数可以减少冲突,但不能完全避免。

减少冲突的方法:

  1. 开放地址法
  2. 再哈希法
  3. 链地址法
  4. 建立一个公共溢出区

一:开放定址法:

有冲突时就去寻找下一个空的散列地址,只要散列表足够强大,空的散列地址总能找到,并将元素存入。

Hi=(H(key)+d)% m  i=1,2,3,4...,k(k<=m-1) m为表长

 找空的散列地址的方法:

  • 线性探测法
  • 二次探测法
  • 伪随机探测法

线性探测法:

Hi=(H(key)+d)% m    d为1,2,...,m-1  (m为散列表长度)

有冲突的话,就找到下一个地址,直到找到空地址存入

 二次谈探测法:

Hi=(H(key)+d)% m    d为1^2,-1^2,2^2,-2^1,...,q^2  

有冲突的话,按照以上规则找到下一个地址,直到找到空地址存入

 伪随机法:

Hi=(H(key)+d)% m    d为一个随机数(1<=d<m)

二:链地址法:

相同散列地址的记录链成一单链表,m个散列地址就设m个单链表,用一个数组将m个单链表的表头指针存储起来,形成一个动态结构。

优缺点: 

  • 非同义词不会冲突,无聚集现象
  • 链表上节点空间动态申请,更适合于表长不确定的情况

三:再哈希法

Hi=RHi(key)     i=1,2,3,4,5,6,...k

RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。不易发生聚集,但计算时间较长。

四:建立一个公共溢出区

创建一个溢出表来存放发生冲突的数据

哈希表的查找:

关键字为(19,14,23,1,68,20,84,27,55,11,10,79)

H(key)=key % 13    散列表m=16

线性探测再散列法:

链地址法 :

 平均查找长度的比较:

α=表中填入的记录数/哈希表长度

查找成功的平均查找长度:

查找成功的平均查找长度为:

c++数据结构:散列表(哈希)相关推荐

  1. [数据结构] 散列表(哈希表)

    散列表(哈希表) 比较难理解的官方定义:散列表/哈希表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来访问记录,以加快查找的 ...

  2. 算法设计与分析——散列表/哈希表(Hash Table):直接寻址表

    分类目录:<算法设计与分析>总目录 相关文章: ·散列表/哈希表(Hash Table)(一):基础知识 ·散列表/哈希表(Hash Table)(二):直接寻址表 ·散列表/哈希表(Ha ...

  3. JavaScript数据结构——散列表(Hash table,也叫哈希表)

    概念和结构 散列表是根据关键码值(Key value)而直接进行访问的数据结构. 若关键字为k,则其值存放在f(k)的存储位置上.由此,不需比较便可直接取得所查记录.称这个对应关系f为散列函数,按这个 ...

  4. 数据结构——散列表(Hash Table)(哈希表)

    散列表 散列表英文是hash table,经常被叫做Hash表,或者哈希表. 哈希表其实就是由数组演化而来的,利用的就是数组支持按照下标随机访问数据的特性,可以说散列表就是数组的一种扩展. 百度文库对 ...

  5. [数据结构]-散列表(哈希表)

    在这里没有新的原创性的东西.该部分内容主要取材于<软件设计师教程>部分的内容.       我想强调一种数据结构,散列表.它是基于快速存取的角度设计的,也是一种典型的"空间换时间 ...

  6. 【数据结构笔记41】散列表/哈希表的性能分享

    本次笔记内容: 11.4 散列表的性能分析 文章目录 平均查找长度 影响冲突产生的三个因素 不同方法的性能 线性探测法查找性能 平方探测法和双散列探测法的查找性能 期望探测次数与装填因子α的关系 分离 ...

  7. 数据结构---散列表(哈希表)链地址法

    散列表链地址法基本思想是将相同散列地址的元素放在同一个单链表中,即称同义词链表.例如此时我们设一个散列函数H(key)=key%n,则可以定义一个一维数组,大小为n,数组元素对应关键字模n所得的数字. ...

  8. 数据结构 -- 散列表

    散列表作为一种能够提供高效插入,查找,删除 以及遍历的数据结构,被应用在很多不同的存储组件之中. 就像rocksdb中的hashskiplist,redis的有序集合,java的 LinkedHash ...

  9. 散列表(哈希表)(散列函数构造、处理冲突、查找)

    本文转载自: [1]https://blog.csdn.net/qq_22238021/article/details/78258605 [2]https://blog.csdn.net/duan19 ...

  10. 数据结构--散列表 Hash Table

    文章目录 1.线性探测 哈希表代码 2.拉链法 哈希表代码 1. 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来.可以说,如果没有数组,就没有散列表. ...

最新文章

  1. mysql 按月和年累加_MySQL架构图
  2. 数据结构实验之查找四:二分查找(递归实现和while循环实现)
  3. java动态sql执行数据
  4. MonoRail学习笔记十一:页面控件的填充和验证
  5. zoj1738 Lagrange's Four-Square Theorem(DP)
  6. 在linux中配置安装telnet服务
  7. 【Flink】Flink TaskManager 内存不足导致重启
  8. 通过分区(Partitioning)提高Spark的运行性能
  9. 【IoT】 产品设计:结构设计之ABS塑料表面处理工艺
  10. openGL之API学习(一四七)实时渲染、光线追踪渲染和栅格化渲染
  11. 论文笔记|Unsupervised Keyphrase Extraction by Jointly Modeling Local and Global Context
  12. lnmp下配置PHP虚拟主机vhost
  13. 解析MNIST数据集
  14. php编写蜘蛛池站群教程,快车蜘蛛池站群程序 v2.0
  15. 编辑或删除Word文档脚注中的横线
  16. vscode设置启动时不打开上一次目录
  17. 计算机开机无法选择用户界面,带有win10双系统中win10关机后开机无法进入启动菜单选择及BIOS界面的原因你知道吗?...
  18. 人工智能数学基础之函数与极限(无穷小与夹逼定理),附视频详解【菜鸟窝出品】
  19. 官方教程Stealth学习笔记(一)
  20. SAP 生产订单工序外协对应的工序报工后,对应的采购订单自动入库

热门文章

  1. 阿里巴巴历年在线笔试题汇总
  2. 记一次springcloud stream延迟消息失效
  3. centos7安装配置vnc,实现远程访问
  4. 男人的收入、女人的年龄
  5. Springboot REST风格
  6. python3 之 生成器的send()方法
  7. python-生成器即send()用法
  8. python课程设计个人小结_Python课程设计,python
  9. 微服务网关,安全的API管理平台
  10. 如何使用Google实现高效搜索