hash查找与计算查找成功时和失败时的 平均查找长度

Hash的构造方法

1.直接定址法

2.数字分析法:适用于关键字位数比较多且表中可能的关键字都是已知的情况,如一些连续的电话号码,分析数字的特点

3.平方取中法:123的平方为15129,取其中的三位512

4.除留余数法:H(key)=key mod p (p<=len)

冲突处理

开放定址,线性探测(特点:可以探测到表中的任何位置;容易产生堆积问题)

红色位为冲突位置,根据彩虹的颜色分布,为依次扫描的六个位置,如果碰到没有关键字的位置,则填充 红色位为冲突位置,根据彩虹的颜色分布,为依次扫描的六个位置,如果碰到没有关键字的位置,则填充 红色位为冲突位置,根据彩虹的颜色分布,为依次扫描的六个位置,如果碰到没有关键字的位置,则填充

开放定址,平方探测d+i^2 , d-i^2(特点:不可以探测到表中的任何位置;不容易产生堆积问题(一错再错))

链地址法

◆
用关键字序列{19121125351729}创建一个Hash
表,装填因子a为1/2,试确定表长len,采用除留余数法构造
Hash函数,采用链地址法来处理冲突。

n/length 装填因子就是表的装填的个数比例,所以表长为16H(key)=key mod p,p可以为13

计算查找成功时和失败时的,平均查找长度

查找失败,就是查找一个不存在的数的“比较”次数,所以要“遍历”(对于数组就是n,散列表的就是散列表的长))

查找成功的平均查找长度 A S L 成功 查找成功的平均查找长度ASL_{成功} 查找成功的平均查找长度ASL成功

查找失败的平均查找长度 A S L 失败 查找失败的平均查找长度ASL_{失败} 查找失败的平均查找长度ASL失败

顺序查找

A S L 成功 ( 顺序查找 ) = n + 1 2 A S L 失败 ( 顺序查找 ) = n ASL_{成功}(顺序查找)=\frac{n+1}{2}\\ ASL_{失败}(顺序查找)=n\\ ASL成功(顺序查找)=2n+1ASL失败(顺序查找)=n

hash线性探测

A S L 成功 ( 线性探测 ) = 1 + 1 + 1 ( 依次比较次数 ) 3 ( 关键字个数 ) ASL_{成功}(线性探测)=\frac{1+1+1(依次比较次数)}{3(关键字个数)}\\ ASL成功(线性探测)=3(关键字个数)1+1+1(依次比较次数)

查找值位置计算
6363mod3 =0,比较一次
11mod1 =1,比较一次
22mod3=2,比较一次

        
A S L 失败 ( 线性探测 ) = 4 + 3 + 2 3 ( 探测可能的入口的个数 ) ASL_{失败}(线性探测)=\frac{4+3+2}{3(探测可能的入口的个数)}\\ ASL失败(线性探测)=3(探测可能的入口的个数)4+3+2

  • 查找操作: 通过散列函数找到键在散列表中的位置,如果该位置为空,则表示键不存在。如果该位置不为空,可能是发生了冲突,需要线性探测找到包含目标键的位置。
  • 查找失败:如果发生冲突,即两个键映射到相同的位置,线性散列表会沿着散列地址序列依次查找下一个位置,直到找到一个空槽(未被占用的位置)
查找值位置计算
映射到0位置的值,比如9999mod3 =0,分别和63,1,2还有最后的空值进行对比,比较4次
映射到1位置的值,比如100100mod1 =1,比较3次
映射到2位置的值,比如101101mod3=2,比较2次

hash连地址法

以上图为例:
A S L 成功 ( 连地址法 ) = 3 ∗ 1 + 1 ∗ 2 ( 依次比较次数 ) 4 ( 关键字个数 ) A S L 失败 ( 连地址法 ) = 4 ( 关键字个数(依次比较) ) 7 ( 探测可能的入口的个数,散列表的长 ) ASL_{成功}(连地址法)=\frac{3*1+1*2(依次比较次数)}{4(关键字个数)}\\ ASL_{失败}(连地址法)=\frac{4(关键字个数(依次比较))}{7(探测可能的入口的个数,散列表的长)}\\ ASL成功(连地址法)=4(关键字个数)31+12(依次比较次数)ASL失败(连地址法)=7(探测可能的入口的个数,散列表的长)4(关键字个数(依次比较))

二叉排序树

树的计算方法一样 树的计算方法一样 树的计算方法一样

A S L 成功 ( 二叉排序树 ) = 1 ∗ 1 + 2 ∗ 2 + 3 ∗ 3 ( 依次比较次数 ) 6 ( 关键字个数 ) A S L 失败 ( 二叉排序树 ) = 2 ∗ 1 + 6 ∗ 3 ( 查找底部不存在的数字 ) 7 空指针个数 ASL_{成功}(二叉排序树)=\frac{1*1+2*2+3*3(依次比较次数)}{6(关键字个数)}\\ ASL_{失败}(二叉排序树)=\frac{2*1+6*3(查找底部不存在的数字)}{7空指针个数}\\ ASL成功(二叉排序树)=6(关键字个数)11+22+33(依次比较次数)ASL失败(二叉排序树)=7空指针个数21+63(查找底部不存在的数字)

折半查找及判定树

A S L 成功 ( 折半查找 ) = 1 ∗ 1 + 2 ∗ 2 + 3 ∗ 2 5 A S L 失败 ( 折半查找 ) = 2 ∗ 2 + 4 ∗ 3 6 ASL_{成功}(折半查找)=\frac{1*1+2*2+3*2}{5}\\ ASL_{失败}(折半查找)=\frac{2*2+4*3}{6}\\ ASL成功(折半查找)=511+22+32ASL失败(折半查找)=622+43
树的平均查找长度为树的深度

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值