You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
3.4 KiB

### 一、基本概念
数据的存储位置与关键字之间存在对应关系(hash函数)简言之数据存储的位置与hash函数计算结果相关
Loc(i)=H(key)
散列方法根据hash函数计算元素存储位置在查找时也按照相同hash函数进行计算并查找
哈希函数计算hash值的函数
哈希表按照hash值构造的表
哈希冲突不同的Key计算出来的hash值相同
同义词通过hash函数计算出来值相同的key
![[微信截图_20221219203714.png]]
### 二、hash函数构造
##### 使用哈希表要解决2个问题
1. 构造好的哈希函数
1. 所选函数尽可能简单,以便提高转换效率
2. 所选函数对关键码计算出的地址,应在散列地址集中致均匀分布,以减少空间浪费
2. 制定一个好的解决冲突的方案
查找时,如果从哈希函数计算出的地址中查不到关键码,则应当依据解决冲突的规则,有规律地查询其他相关单元
##### 构造哈希函数考虑的因素
+ 执行速度(即计算哈希函数所需时间)
+ 关键字长度
+ 哈希表大小
+ 关键字的分布情况
+ 查找频率
##### 根据元素集合的特性构造:
一、N个数据源仅占用n个地址虽然哈希表查找是以空间换时间但仍希望散列的地址空间尽量小。
二、无论用什么方法存储,目的都是尽量均匀地存放元素,以避免冲突
#### 构造的6种方法
+ 直接定址法H(key)=key或H(key)=a*key+b 其中a和b是常数它适合关键字的分布基本连续的情况
优点:计算简单、不会产生冲突
缺点:占用连续地址空间,空间效率低
![[微信截图_20221220140739.png]]
+ 数字分析法
+ 平均取中法
+ 折叠法
+ 除留余数法H(key)=key mod pp是一个整数,取余
关键如何选取合适的p
技巧设表长度为m取p<=m且为质数
+ 随机数法
#### 如何解决hash冲突
+ 开放地址法(开地址法)
基本思想:有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入。
除留余数法H=Hash(key)+d1mod md1为增量序列
常用方法:
线性探测法 d1为123......m-1线性序列
二次探测法 d1为1平方-1平方-2平方......,二次序列
伪随机探测法 d1为伪随机数
+ 链地址法(拉链法)
基本思想相同hash地址的记录链成一个单链表m个散列地址就设m个单链表然后用一个数组将m个单链表的表头指针存储起来形成一个动态的结构
步骤step1取数据元素的关键字Key计算其哈希地址若该地址对应的链表为空则插入此链表否则执行step2解决冲突
step2计算关键字Key的下一个存储地址若该地址对应的链表不为空则利用链表的前插法或后插法将该元素插入此链表
优点:非同义词不会冲突,无聚集现象
链表上节点空间动态申请,适合表长不确定的情况
![[微信截图_20221220170409.png]]
+ 再散列法(双散列函数法)
+ 建立一个公共溢出区
#### 查找效率
![[微信截图_20221220201301.png]]
+ 哈希表技术具有很好的平均性能,优于一些传统的技术
+ 链地址法由于开地址法
+ 除留余数法作为哈希函数优于其他类型的函数