散列表的ASL计算

题目: 已知关键字序列为{30,25,72,38,8,17,59},设散列表表长为15.散列函数是H(key)=key MOD 13,处理冲突的方法为二次探测法Hi= ( H(key) + di )mod 15 ( di=12,-12,22,-22,… ),请写出构造散列表的详细计算过程,填写散列表,并计算在等概率的情况下查找成功和失败时的平均查找长度ASL。

地址01234567891011121314
关键字               

解: 首先,根据散列函数进行计算  H(30)=30%13=4    在地址4处填入30;

        H(25)=25%13=12    在地址12处填入25;

   H(72)=72%13=7    在7处填入72;

        H(38)=38%13=12,与H(25)冲突,此时使用处理冲突函数,即H(38)=(H(38)+1)%15=13,无冲突。在13处填入38;

        H(8)=8,在8处填入8;

   H(17)=4,与H(30)冲突,使用处理冲突函数,H(17)=(H(17)+1)%15=5,无冲突。在5处填入17;

        H(59)=7,与H(72)冲突,使用处理冲突函数,H(59)=(H(59)+1)%15=8,又与H(8)冲突,继续使用处理冲突函数,

        H(59)=(H(59)-1)%15=6,无冲突,在6处填入59.    散列表填写如下:

地址01234567891011121314
关键字    301759728   2538 
比较(计算)次数    12311   12 

于是:ASL(success)=(比较总次数)/(元素总数)  =(1+2+3+1+1+1+2)/ 7 = 11/7

要计算ASL(failure) 则需要增加一个东西,即各元素到它后面第一个单元为空的位置的步数(距离)D。

如30到它后面第一个单元为空的位置9的步数为6;

其它的依次类推,注意因为散列为mod13,对应地址为0~12,超过12则在从0开始。得:

  D(0)=NULL=1; D(1)=NULL=1; D(2)=NULL=1; D(3)=NULL=1; D(4)=30=6; D(5)=17=5; D(6)=59=4;

  D(7)=72=3; D(8)=8=2; D(9)=NULL=1; D(10)=NULL=1; D(11)=NULL=1; D(12)=25=2;(从12到0走两步)

再往后就没有了。因此ASL(failure)= (6+5+4+3+2+2+1*7)/13 = 29/13.

 

转载于:https://www.cnblogs.com/DSYR/p/9130287.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值