选取哈希函数H(k)=(3k)%11,用线性探测散列法和二次探测再散列法分别处理冲突。试在0~10的散列地址空间中,对关键字序列(22,41,53,46,30,13,01,67)构建哈希表,并求等概率情况下查找成功的平均查找长度。
线性探测散列法
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
22 | 41 | 30 | 1 | 53 | 46 | 13 | 67 | |||
1 | 1 | 2 | 2 | 1 | 1 | 2 | 6 |
22*3%11=0
41*3%11=2
53*3%11=5
46*3%11=6
30*3%11=2
13*3%11=6
1*3%11=3
67*3%11=3
然后使用线性探测散列法将数据填入表中(第二行),
查找长度填入第三行。
然后计算ASL=(1+1+2+2+1+1+2+6)/8=2
二次探测再散列法
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
22 | 41 | 30 | 1 | 53 | 46 | 13 | 67 | |||
1 | 1 | 2 | 2 | 1 | 1 | 2 | 5 |
22*3%11=0
41*3%11=2
53*3%11=5
46*3%11=6
30*3%11=2
13*3%11=6
1*3%11=3
67*3%11=3 ,此时冲突,【根据1^2,-(1^2),2^2,-(2^2)……n^2,-(n^2)处理冲突】
找到位置4,已经有元素,然后向左,找到位置2,也已经有元素
然后向右,位置3+4,为位置7,也已经有元素,向左,从3位置往左数4个位置【注:到达0位置继续从最后一个元素由右往左遍历,到位置10】
然后使用二次探测再散列法将数据填入表中(第二行),
查找长度填入第三行。
计算ASL=(1+5+1+2+2+1+1+2)/8=1.875
补充:
下面说一下这两个处理冲突的方法
(1)线性探测散列法
①根据哈希函数计算函数值(%表示取余计算)
②线性探测散列法就是在取余计算后的第一次计算出的值直接填入对应序列即可(如计算结果为3,就直接填入3号位),如果第二次出现甚至多次出现相同计算取余后的函数值,就依次往后移动,移动到没有函数值的位置上。(如第二次出现3,就看4号位有没有函数值,没有就直接填入,有就继续往后移动,更多次也是同理)
③根据移动次数填入查找长度,直接填入的为1,然后后面的为1+移动次数为查找长度。
(2)二次探测再散列法
①根据哈希函数计算函数值(%表示取余计算)
②二次探测再散列法出现冲突时的处理方式为【1^2,-(1^2),2^2,-(2^2)……n^2,-(n^2)处理冲突】,如元素67,取模运算得到为3,出现冲突,依次查找【3,4,2,7,-1……直到找到空位置位置放入即可】。
③根据移动次数填入查找长度,直接填入的为1,然后后面的为1+移动次数为查找长度。也是一样,右移一次+1,左移一次也+1。