散列表的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。

散列地址 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
关键字                              

解: 首先,根据散列函数进行计算  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.    散列表填写如下:

散列地址    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
关键字(key)         30 17 59 72 8       25 38  
比较(计算)次数         1 2 3 1 1       1 2  

于是: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.


你可能感兴趣的:(数据结构)